كيف يعمل السيلينيوم: الحلقات 1 - 2

تم إعداد ترجمة للمقال قبل بدء دورة Java QA Engineer .



الحلقة 1 - النقل


نتيجة للحوار الذي دار في نهاية الأسبوع الأخير من يناير 2020 ، والذي تم تخصيصه لإحدى المشكلات في السيلينيوم ، حيث أخبرني أحدهم "لماذا لن تفعل ذلك للتو ..." ردًا على شرح المشكلة ، قررت كتابة سلسلة من المقالات توضح الأوامر في Selenium WebDriver ولماذا انتهى بنا الأمر بالتصميم الذي لدينا اليوم.

سأكرر هذا في كل حلقة من هذه السلسلة - كثيرًا ، وأحيانًا إلى حد الجنون ، تم وضع الكثير من التفكير والفكر في عمل كل التفاصيل الصغيرة من السيلينيوم.

لماذا ا؟

بالصدفة ومدى قيامه بما ينوي القيام به ، يستخدم السيلينيوم من قبل الملايين من الناس حول العالم. هذه هي الطريقة التي تتأكد بها أكبر مجموعة من الشركات من الشركات الناشئة الصغيرة إلى Microsoft و Google من أن مواقعها تعمل في كل متصفح.

Selenium ?


على مدار سنوات Selenium ، انتهى بنا الأمر بالتركيز على استخدام HTTP كوسيلة للتفاعل مع المتصفح. أنشأنا REST-ish API (REST-ish - بروح REST) ​​، والتي يمكنها استخدام ربط كل عميل والحصول على النتائج نفسها ، كما نأمل.

HTTP و REST- العش؟ بجدية؟

نعم ...

لنبدأ بجزء HTTP. عندما بدأنا لأول مرة ، كان علينا دعم طرق مختلفة للتفاعل مع كل متصفح ، استنادًا إلى أفضل نهج لكل منها. على سبيل المثال ، بالنسبة لبرنامج Internet Explorer ، قمنا بكتابة كود COM. لقد عمل بشكل جيد ، ولكن لا تزال منه كوابيس. بالنسبة إلى Firefox ، كتبنا وحشًا للقراءة سطرًا ، والذي كان ، لحسن الحظ ، بفضل أسلوب Mozilla "جعل متصفحك" قادرًا على تحقيق الكثير. سمح لنا Opera بالدخول من خلال بروتوكول DevTools.

وبالتالي ، هذا يعني أنه ، خاصة في السنوات الأولى من WebDriver ، كنا بحاجة إلى دعم روابط N: M ، حيث N هي روابط اللغة و M هي المتصفحات التي ندعمها. هذا المسار لا يؤدي إلى منتج جيد. قررنا أننا بحاجة إلى شيء تفهمه كل لغة. نحن بحاجة أيضًا إلى شيء موثوق به جدًا. لذلك وقع الاختيار على HTTP ، وبدأنا في الإنشاء JSONWireProtocol.

في إطار العمل ، JSONWireProtocolقمنا ببناء واجهة REST-ish التي تتواصل في JSON. أقول REST-ish لأنها لا تتبع جميع مبادئ REST ، ولكنها تجسدها بدرجة كافية لجعلها أداة قوية لمهامنا.

ماذا عن الوضع الحالي للأشياء؟

الويب والإنترنت والعالم يتقدمون. فلماذا لا السيلينيوم؟

هذا سؤال جيد ، لكن الحقيقة أننا نحاول التحديث. لسوء الحظ ، تتميز الشبكة بحالة لا تعمل ، إذا لم تكن تعمل. HTTP موثوق للغاية كبروتوكول. كما يسمح للناس بإنشاء مجموعات للاختبار دون القلق بشأن كيفية عمل تعدد الإرسال. هذا هو السبب في إنشاء شبكة Selenium Grid ، والتي لا تزال خيارًا جيدًا عندما يتعلق الأمر بتنظيم الاختبار مع أجهزة وأجهزة كمبيوتر متعددة.

لكنها تبدو كشبكة.

لذلك ... هناك أدوات تستخدم بروتوكول تصحيح أخطاء Chrome للتحكم في Chrome. إنهم يقومون ببعض الأشياء بشكل أفضل من السيلينيوم ، وهذا نتيجة اختيارهم لكيفية التواصل مع المتصفح. لسوء الحظ ، هذا هو بروتوكول الملكية لـ Chrome ، وجعله في متناول المتصفحات الأخرى ليس في مصلحة Google.

بالإضافة إلى ذلك ، عند تجاهل حلول التصميم المثيرة للاهتمام من فريق Google ، فهناك مشكلة يجب أن يكون لدينا اتصال مفتوح باستمرار. في هذه الحالة ، يستخدم WebSockets ، ولكن يجب أن تتذكر تعليقي أعلاه بأن الإنترنت غير متوفر أثناء عدم العمل. سيتم إعادة توصيل WebSockets باستمرار. هناك أيضًا مشكلة تتعلق بكمية الزيارات التي سترتفع وتنخفض في هذه القناة.

هذه ليست مشكلة للدمى عندما تتفاعل مع شيء فقط على جهاز الكمبيوتر المحلي الخاص بك ، ولكن إذا قمت بدمج خدمة CI مثل Circle CI أو TravisCI وشيء مثل AWS Device Farm أو Sauce Labs أو BrowserStack ، بينك فجأة يحصل العداء على الإنترنت ، ويجب أن تصل هذه البيانات إلى المستلمين.

تحاول مجموعة عمل W3C Browser Testing and Tools ، المكونة من بائعي المتصفح وشركاء Selenium ، تصميم كيف يجب أن يبدو كل شيء للتأكد من أنه يمكننا ضمان التوافق عبر المتصفح منذ البداية ، دون اللجوء إلى تصحيحات غريبة من الهاكر والتسليم الشخصي لهذه المتصفحات.

اريد معرفة المزيد؟



الحلقة 2 - التنقل
في هذه الحلقة ، سنلقي نظرة على قدر كبير من العمل المتعلق بالملاحة.

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")


ما نراه أعلاه ... يبدو بسيطًا جدًا ، صحيح ... ولكن ها هو!

في الواقع ، هذا يقودني إلى مقابلة قاسية. إذا طلب منك شخص ما وصف ما يحدث في المتصفح عندما تكتب عنوان URL واضغط على Enter ، فهناك احتمال كبير بأنه ليس لديه فكرة حقيقية عما يحدث في التنقل. على أي حال ... العودة إلى السيلينيوم والملاحة. بمجرد أن نرسل الطلب من خلال طبقة النقل ، تبدأ المتعة الحقيقية. نحتاج إلى معرفة المكان الذي نريد الذهاب إليه ، ونطلب من المتصفح الذهاب إلينا. لسوء الحظ ، سيؤدي هذا إلى أول مشاكل عديدة من أجل الأتمتة.

driver.get



الشهادات


إذا كنت قد عملت من قبل في شركات كبيرة ، حيث لا تكون التكنولوجيا هي الشركة الرئيسية ، فأنت تفهم نوع الألم الذي قد يواجهه فريق التطوير. الآن ضاعف هذا الألم ، ويمكنك أن تتخيل الألم الذي يتعين على المختبرين ومهندسي الأتمتة التعامل معه.

واحدة من هذه الآلام هي الشهادات. الشركات بخيلة وستقوم بعمل شهادات موقعة ذاتيًا وتشوهات أخرى. خاصة في الأيام الأولى من السيلينيوم ، عندما لم تكن هناك خدمات مثل Let's Encrypt . وحتى الآن ، نادرًا ما يكون لدى معظم المطورين ومجموعات QA حق الوصول إلى تغييرات التكوين في بيئات الاختبار الخاصة بهم أو على خوادم CI الخاصة بهم. كنا بحاجة إلى إيجاد طريقة حول الشهادات. ( هذا هو أحد الأسباب الأولى التي يُنظر فيها إلى السيلينيوم على أنه خطر أمني. )

وبالتالي ، يتخطى كل مستعرض الشهادات التي تم تكوينها بشكل سيئ أثناء التشغيل التلقائي. إذا لم يدركوا ذلك ، فلن يكون لدى العديد من المختبرين / المطورين فرصة اختبار مواقعهم.

الآن ... عندما تحدثنا حول المشكلة الأولى ، نحتاج إلى الانتقال إلى تحميل الصفحة.

جار التحميل


بمجرد استلام الشهادات ، نحصل على الصفحة للتحميل. لحسن الحظ ، لسنا بحاجة إلى القيام بأي شيء أكثر تعقيدًا من المعادل

location = "https://www.theautomatedtester.co.uk"; 
// 
window.location.href = "https://www.theautomatedtester.co.uk";


منجز ...


عندما "يكمل" السيلينيوم الفريق ، سنسترد أموالك. لذا ، نحتاج فقط إلى انتظار تحميل الصفحة. لأكون صريحًا تمامًا ، ماذا يعني "التحميل النهائي" ؟

سيقوم المتصفح بإطلاق العديد من الأحداث المختلفة. سنعرف متى سيتم عرض الصفحة ، ثم ما هي readyState. سيختبر السيلينيوم كل هذا وسوف ينتظر أيضًا DOMContentLoaded.

ثم تنشأ مشكلة إذا كنت على الصفحة وتحاول القفز إلى نقطة الارتساء في تلك الصفحة. دعونا نلقي نظرة على المثال التالي.

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")
driver.get("https://www.theautomatedtester.co.uk#someAnchor")


أوه ، فقط انظر ، لن يتم إطلاق أي من أحداث تحميل الصفحة! صف دراسي؟ يعمل متصفح غبي بكفاءة ويذهب فقط إلى المرساة. هذا يعني أنه لا يمكننا الاعتماد فقط على الأحداث المنبثقة من الصفحة.

لا ، لذلك ، نحن بحاجة إلى رمز خاص لهذه الحالة وفهم لما يعنيه "جاهز" في هذه الحالة. إذا ارتكبنا خطأ ، فسيؤدي ذلك إلى العديد من الاختبارات غير المستقرة. الاختبارات غير المستقرة تجعل الناس غاضبين ، ولا نريد مطورين غاضبين ، فهناك ما يكفي منهم في العالم وبدون اختبارات غير مستقرة.

بعد الانتهاء من عمليات التحقق هذه ، ويمكنك معالجة الطريقة التي ننظر بها إلى هذه الأحداث ، إذا كنت تريد تحميلها بشكل أسرع باستخدام إستراتيجيات تحميل الصفحة. هذه أكثر من ميزة مستخدم رصف ، لذلك لن أزعجهم بشأنها الآن ، لكنها تؤثر على سرعة أوامر التنقل.

ماذا عن أطر عمل جافا سكريبت والملاحة


هذا هو المكان الذي يتركز فيه كل "المرح". سيستمر تحميل العديد من أطر العمل بعد التحميل الأولي على الصفحة. إذا كنت قد عملت في أي وقت على تطبيق من صفحة واحدة أو استخدمته للتو ، فقد رأيت العديد من العناصر معروضة أثناء تحميلها. لسوء الحظ ، هذا يعني أنه لا يمكنك الاعتماد فقط على عودة أمر التنقل. ستحتاج إلى إضافة أمر WebDriverWaitإلى التعليمات البرمجية الخاصة بك ، كما هو موضح أدناه ، للتأكد من أن الاختبار في الحالة الصحيحة قبل أن تذهب للقيام بما يحتاجه.

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”))


استنتاج


عند تحميل صفحة ، لا تعتمد دائمًا على عودة السيلينيوم عند انتهاء تحميل الصفحة. إذا كنت بحاجة إلى إلقاء نظرة على عنصر في الصفحة ، فقم بذلك. ما عليك سوى معرفة كيف يمكن لـ JavaScript على الصفحة تغييره بعد التحميل الأولي.

لمزيد من القراءة






تعلم المزيد عن الدورة .



All Articles