عندما بدأت دراسة أتمتة الاختبار ، لم أستطع أن أفهم - "ما هو كائن الصفحة وكيفية تنفيذه في Python + pytest؟". عند دراسة الإنترنت ، وجدت تطبيقًا بلغات وأُطُر أخرى: مقالات تربوية كانت غير مفهومة بالنسبة لي. لذلك ، قررت أن أكتب هذا التحليل. تتمثل الفكرة في إظهار التطبيق في Python + pytest وشرحه بلغة يمكن الوصول إليها.
ما هو كائن الصفحة
هذا نمط شائع هو المعيار الفعلي في أتمتة اختبار منتجات الويب. الفكرة الأساسية هي فصل منطق الاختبار عن التنفيذ.
يمكن وصف كل صفحة ويب للمشروع ككائن فئة. يتم وصف تفاعل المستخدم في أساليب الفصل ، ويبقى منطق العمل فقط في الاختبارات. يساعد هذا الأسلوب في تجنب مشاكل الاختبارات عند تغيير تخطيط تطبيق ويب. تحتاج إلى تصحيح فقط الفصل الذي يصف الصفحة.
يحدد كائن الصفحة الأجزاء:
- Base Page \ Base Class - تنفذ الأساليب اللازمة للعمل مع webdriver.
- كائن الصفحة \ فئة الصفحة - تنفذ أساليب العمل مع العناصر الموجودة على صفحات الويب.
- الاختبارات - تنفذ الاختبارات الموضحة في منطق الأعمال لحالة الاختبار.
مخطط نمط كائن الصفحة.

لشرح الموضوع بوضوح ، نقوم بتنفيذ اختبار تلقائي.
الجزء النظري للتنفيذ
خطوات :
- يفتح المستخدم متصفح.
- يدخل المستخدم https://ya.ru/ في شريط العناوين ؛
- يقوم المستخدم بإدخال كلمة "Hello" في شريط البحث ؛
- ينقر المستخدم على زر "بحث".
النتيجة المرتقبة :
تتم إعادة توجيه المستخدم إلى البحث. تحتوي نتائج البحث على عناصر فرعية (الفيديو والصور وما إلى ذلك).
تحقق : في صفحة البحث يوجد شريط تنقل وعناصر "صورة" و "فيديو".
الجزء العملي للتنفيذ
لفهم المقال ، تحتاج إلى معرفة الإنشاءات الأساسية لبيثون ، OOP ، لفهم مبادئ ووظائف السيلينيوم.
سوف نستخدم المكتبات: السيلينيوم و pytest. يمكنك تثبيتها من خلال مدير حزمة pip.
pip install selenium pip install pytest
أيضا لا تنسى تحميل برنامج التشغيل للمتصفح. يستخدم هذا المقال chrome webdriver. يمكنك تنزيله من هنا . للعمل معها ، ضع الملف في الدليل الجذر للمشروع.
إنشاء لاعبا اساسيا
تحتاج أولاً إلى تنفيذ التهيئة لـ WebDriver. سنصفها في المباريات. تركيبات في pytest هي الوظائف التي لها دورية التنفيذ الخاصة بهم.
هذا بديل بديل لأساليب SetUp و TearDown في unittest. باستخدام التركيبات ، يمكنك إعداد الحالة الأولية للنظام للاختبار.
في pytest هناك اسم محجوز لملف تركيبات - conftest.py .
نقوم بإنشاء ملف conftest.py وتنفيذ الوظيفة باستخدام اسم المتصفح.
نقوم بتمييزه باستخدام @ pytest.fixture decorator ونمرر معلمة النطاق بقيمة الجلسة. هذا يعني أنه سيتم تنفيذ وظيفة التثبيت هذه مرة واحدة فقط لكل جلسة اختبار.
import pytest from selenium import webdriver @pytest.fixture(scope="session") def browser(): driver = webdriver.Chrome(executable_path="./chromedriver") yield driver driver.quit()
بعد ذلك ، نصف الجزء الذي سيتم تنفيذه قبل الاختبارات. يقوم بتهيئة مفكرة الويب مع الإشارة إلى مكان وجود chromedriver. بعد ذلك ، نستخدم بنية المحصول ، التي تقسم الوظيفة إلى أجزاء - قبل الاختبارات وبعد الاختبارات.
في الجزء "بعد الاختبارات" ، نسمي وظيفة الإقلاع عن التدخين التي تنهي الجلسة وتقتل مثيل مفكرة الويب.
الصفحة الأساسية
قم بإنشاء ملف BaseApp.py. في فئة BasePage ، نقوم بتعريف الطرق الأساسية للعمل مع WebDriver.
from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class BasePage: def __init__(self, driver): self.driver = driver self.base_url = "https://ya.ru/" def find_element(self, locator,time=10): return WebDriverWait(self.driver,time).until(EC.presence_of_element_located(locator), message=f"Can't find element by locator {locator}") def find_elements(self, locator,time=10): return WebDriverWait(self.driver,time).until(EC.presence_of_all_elements_located(locator), message=f"Can't find elements by locator {locator}") def go_to_site(self): return self.driver.get(self.base_url)
في فئة BasePage ، قم بإنشاء مُنشئ يقبل برنامج التشغيل - مثيل لبرنامج webdriver. حدد base_url ، والذي سيتم استخدامه لفتح الصفحة.
بعد ذلك ، نقوم بإنشاء أساليب find_element (تبحث عن عنصر واحد وتعيده) و find_elements (تبحث عن المجموعة وتعود كقائمة).
هذا غلاف عبر WebdriverWait ، وهو المسؤول عن التوقعات الواضحة في السيلينيوم.
في الوظيفة ، نقوم بتحديد الوقت ، والذي يكون افتراضيًا 10 ثوانٍ. هذا هو الوقت المناسب للبحث عن العنصر. طريقة Go_to_site - لاستدعاء وظيفة get من WebDriver. تسمح لك الطريقة بالانتقال إلى الصفحة المشار إليها. نمر base_url إليها.
كائن الصفحة
يتم تطبيق فئة صفحة الويب الخاصة بنا في ملف YandexPages.py.
from BaseApp import BasePage from selenium.webdriver.common.by import By class YandexSeacrhLocators: LOCATOR_YANDEX_SEARCH_FIELD = (By.ID, "text") LOCATOR_YANDEX_SEARCH_BUTTON = (By.CLASS_NAME, "search2__button") LOCATOR_YANDEX_NAVIGATION_BAR = (By.CSS_SELECTOR, ".service__name") class SearchHelper(BasePage): def enter_word(self, word): search_field = self.find_element(YandexSeacrhLocators.LOCATOR_YANDEX_SEARCH_FIELD) search_field.click() search_field.send_keys(word) return search_field def click_on_the_search_button(self): return self.find_element(YandexSeacrhLocators.LOCATOR_YANDEX_SEARCH_BUTTON,time=2).click() def check_navigation_bar(self): all_list = self.find_elements(YandexSeacrhLocators.LOCATOR_YANDEX_NAVIGATION_BAR,time=2) nav_bar_menu = [x.text for x in all_list if len(x.text) > 0] return nav_bar_menu
نخلق فئة YandexSeacrhLocators. سيكون فقط لتخزين المواقع.
في الفصل ، وصفنا لتحديد المواقع:
LOCATOR_YANDEX_SEARCH_FIELD - محدد موقع سلسلة البحث
LOCATOR_YANDEX_SEARCH_BUTTON - محدد موقع الزر "بحث"
LOCATOR_YANDEX_NAVIGATION_BAR - محدد شريط التنقل (صور ، مقاطع فيديو ، إلخ)
إنشاء فئة SearchHelper ، ترث من BasePage.
نحن ننفذ أساليب مساعدة للعمل مع البحث:
enter_word - يبحث عن عنصر في سلسلة البحث ، وينقر ويدخل الكلمة المطلوبة في البحث ؛
click_on_the_search_button - يبحث عن عنصر زر البحث وينقر عليه ؛
check_navigation_bar - يبحث عن عناصر التنقل ويحصل على سمة النص. يخلق قائمة والمرشحات حسب الشرط. إذا كان طول السلسلة أكبر من الصفر ، فقم بإضافة العنصر إلى القائمة. على سبيل المثال ، أعد تحديد الوقت الافتراضي من خلال تعيينه على ثانيتين.
اختبارات
from YandexPages import SearchHelper def test_yandex_search(browser): yandex_main_page = SearchHelper(browser) yandex_main_page.go_to_site() yandex_main_page.enter_word("Hello") yandex_main_page.click_on_the_search_button() elements = yandex_main_page.check_navigation_bar() assert "" and "" in elements
نقوم بإنشاء وظيفة الاختبار test_yandex_seacrh ، والتي ستقبل تثبيت المستعرض. بعد ذلك ، يقوم السطر الأول بإنشاء كائن الصفحة - yandex_main_page. من الكائن ، ندعو أساليب للتفاعل مع عناصر الصفحة. تصف الوظيفة منطق المستوى الأعلى لإجراءات المستخدم.
دعنا ننقل كل شيء قمنا بتطبيقه على المخطط ، على غرار مخطط كائن الصفحة. إعادة تسمية الكتل تحت اسم الملفات من المقالة.

كما ترون ، تمكنا من وضع هذا النمط موضع التنفيذ.
سأترك رابطًا إلى المستودع المكتمل . شكرا للقراءة!