Menerapkan pola Objek Halaman dalam Python + pytest

Ketika saya mulai belajar otomatisasi pengujian, saya tidak bisa mengerti - “apa Page Obyek dan bagaimana mengimplementasikannya dalam Python + pytest?”. Mempelajari Internet, saya menemukan implementasi dalam bahasa dan kerangka kerja lain: artikel pendidikan yang tidak bisa dipahami oleh saya. Karena itu, saya memutuskan untuk menulis analisis ini. Idenya adalah untuk menunjukkan implementasi dalam Python + pytest dan menjelaskannya dalam bahasa yang dapat diakses.


Apa itu Objek Halaman


Ini adalah pola populer yang merupakan standar de facto dalam otomatisasi pengujian produk web. Ide dasarnya adalah untuk memisahkan logika pengujian dari implementasi.


Setiap halaman web proyek dapat digambarkan sebagai objek kelas. Interaksi pengguna dijelaskan dalam metode kelas, dan hanya logika bisnis yang tersisa dalam pengujian. Pendekatan ini membantu menghindari masalah dengan pengujian saat mengubah tata letak aplikasi web. Anda hanya perlu memperbaiki kelas yang menjelaskan halaman.


Objek Halaman mendefinisikan bagian-bagian:


  • Base Page \ Base Class - Menerapkan metode yang diperlukan untuk bekerja dengan webdriver.
  • Objek Halaman \ Kelas Halaman - Menerapkan metode untuk bekerja dengan elemen pada halaman web.
  • Tes - Menerapkan tes yang dijelaskan oleh logika bisnis dari kasus uji.

Skema pola Obyek Halaman.
gambar
Untuk menjelaskan topik dengan jelas, kami menerapkan tes otomatis.


Bagian teoritis dari implementasi


Langkah-langkah :


  1. Pengguna membuka browser;
  2. Pengguna memasukkan https://ya.ru/ di bilah alamat;
  3. Pengguna memasukkan kata "Halo" ke dalam bilah pencarian;
  4. Pengguna mengklik tombol "Temukan".

Hasil yang Diharapkan :
Pengguna diarahkan ke pencarian. Hasil pencarian memiliki sub-item (video, gambar, dll.).


Periksa : pada halaman pencarian ada bilah navigasi dan elemen "gambar" dan "video".


Bagian praktis dari implementasi


Untuk memahami artikel tersebut, Anda perlu mengetahui konstruksi dasar Python, OOP, memahami prinsip dan fungsi Selenium.


Kami akan menggunakan perpustakaan: selenium dan pytest. Anda dapat menginstalnya melalui manajer paket pip.


pip install selenium pip install pytest 

Juga jangan lupa mengunduh driver untuk browser. Artikel ini menggunakan webdriver chrome. Anda dapat mengunduhnya di sini . Untuk mengatasinya, letakkan file di direktori root proyek.


Buat perlengkapan


Pertama, Anda perlu menerapkan inisialisasi untuk WebDriver. Kami akan menjelaskannya di pertandingan. Jadwal di pytest adalah fungsi yang memiliki periodisitas eksekusi sendiri.
Ini adalah pengganti alternatif untuk metode SetUp dan TearDown di unittest. Dengan menggunakan perlengkapan, Anda dapat menyiapkan kondisi awal sistem untuk pengujian.


Di pytest ada nama yang disediakan untuk file fixture - conftest.py .


Kami membuat file conftest.py dan mengimplementasikan fungsinya dengan nama - browser.


Kami menandainya dengan dekorator @ pytest.fixture dan meneruskan parameter lingkup dengan nilai sesi. Ini berarti bahwa fungsi fixture ini akan dieksekusi hanya 1 kali per sesi tes.


 import pytest from selenium import webdriver @pytest.fixture(scope="session") def browser(): driver = webdriver.Chrome(executable_path="./chromedriver") yield driver driver.quit() 

Selanjutnya, kami menjelaskan bagian yang akan dieksekusi sebelum tes. Ini menginisialisasi driver web dengan indikasi di mana chromedriver berada. Selanjutnya, kami menggunakan konstruk hasil, yang membagi fungsi menjadi beberapa bagian - sebelum pengujian dan setelah pengujian.


Di bagian "setelah pengujian", kami memanggil fungsi berhenti, yang mengakhiri sesi dan membunuh instance webdriver.


Halaman dasar


Buat file BaseApp.py. Di kelas BasePage, kami mendefinisikan metode dasar untuk bekerja dengan 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) 

Di kelas BasePage, buat konstruktor yang menerima driver - instance dari webdriver. Tentukan base_url, yang akan digunakan untuk membuka halaman.


Selanjutnya, kita membuat metode find_element (mencari satu elemen dan mengembalikannya) dan find_elements (mencari set dan kembali sebagai daftar).


Ini adalah pembungkus di atas WebdriverWait, yang bertanggung jawab atas ekspektasi eksplisit di Selenium.


Dalam fungsi ini, kami menentukan waktu, yang secara default adalah 10 detik. Ini adalah waktu untuk mencari item. Metode Go_to_site - Memanggil fungsi get dari WebDriver. Metode ini memungkinkan Anda untuk pergi ke halaman yang ditunjukkan. Kami meneruskan base_url ke sana.


Objek halaman


Kelas halaman web kami diimplementasikan dalam file 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 

Kami membuat kelas YandexSeacrhLocators. Ini hanya untuk menyimpan pelacak.
Di kelas, kami menggambarkan pelacak:


LOCATOR_YANDEX_SEARCH_FIELD - pencari string lokasi
LOCATOR_YANDEX_SEARCH_BUTTON - pelacak tombol "Temukan"
LOCATOR_YANDEX_NAVIGATION_BAR - locator bilah navigasi (Gambar, Video, dll.)


Buat SearchHelper kelas, mewarisi dari BasePage.


Kami menerapkan metode bantu untuk bekerja dengan pencarian:
enter_word - mencari elemen dari string pencarian, mengklik dan memasukkan kata yang diinginkan ke dalam pencarian;
click_on_the_search_button - Mencari elemen tombol pencarian dan mengkliknya;
check_navigation_bar - Mencari item navigasi dan mendapatkan atribut teks. Membuat daftar dan memfilter menurut kondisi. Jika panjang string lebih besar dari nol, maka tambahkan item ke daftar. Misalnya, mendefinisikan kembali waktu default dengan mengaturnya menjadi 2 detik.


Tes


 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 

Kami membuat fungsi tes test_yandex_seacrh, yang akan menerima perlengkapan browser. Selanjutnya, baris pertama membuat objek halaman - yandex_main_page. Dari objek, kami memanggil metode untuk berinteraksi dengan elemen halaman. Fungsi ini menjelaskan logika tingkat atas dari tindakan pengguna.


Mari mentransfer semua yang kami terapkan ke skema, mirip dengan skema Obyek Halaman. Ganti nama blok di bawah nama file dari artikel.


gambar


Seperti yang Anda lihat, kami dapat menerapkan pola tersebut.


Saya akan meninggalkan tautan ke repositori yang sudah jadi. Terima kasih sudah membaca!

Source: https://habr.com/ru/post/id472156/


All Articles