Рубрики
Без рубрики

Модель объекта страницы (POM) в Selenium Python

Автоматизация тестирование является неотъемлемой частью процесса тестирования. Основная цель любого типа t … с меткой Python, Selenium, Automation, POM.

Автоматизация тестирование является неотъемлемой частью процесса тестирования. Основной целью любого типа процесса тестирования (автоматизация или руководство) является улучшение качества продукта, сообщая об ошибках и устанавливая их командой разработчиков. Независимо от модели разработки программного обеспечения в проекте, увеличение покрытия автоматизации тестов может рассматриваться как важный ключевой показатель производительности (KPI) для измерения эффективности тестового кода.

В этом блоге мы смотрим на модель объекта Page (POM) в Selenium, шаблоне проектирования, который помогает создать репозиторий объекта, в котором хранится все веб -элементы. POM уменьшает усилия по обслуживанию, уменьшая дублирование кода.

Что такое модель объекта страницы?

Модель объекта Page – это шаблон проектирования, где основной фокус на уменьшение дублирования кода и минимизации усилий, связанных с обновлением/обслуживанием кода. В рамках модели объекта страницы классы страниц создаются для всех веб -страниц, которые являются частью тестирования автоматизации (AUT).

Это делает код более модульным, так как Локаторы/Элементы Используемые сценариями тестирования/тестовых сценариев хранятся в отдельном файле класса, а тестовые примеры (которые содержат логику теста Core) в другом файле. Следовательно, любые изменения в элементах веб -пользовательского интерфейса потребуют минимальных (или нет изменений) в тестовых сценариях, поскольку локаторы и тестовые сценарии хранятся отдельно.

Реализация на основе модели объекта страницы (POM) содержит приведенные ниже важные элементы:

  • Элемент объекта страницы (класс страницы/объект страницы) – Класс страниц является репозиторием объекта для элементов WebElements/Web UI тестируемых веб-страниц. Он также содержит реализацию интерфейсов/методов для выполнения операций в этих веб -элементах. Он свободно основан на основе объектно-ориентированного программирования.
  • Тестовые случаи – Как следует из названия, Тестовые случаи содержать реализацию фактических тестовых сценариев. Он использует методы/методы страниц в классе страницы для взаимодействия с элементами пользовательского интерфейса страницы. Если в пользовательском интерфейсе есть изменение веб -страницы, необходимо обновить только класс страниц, а код тестового тестирования остается неизменным.

Может быть несколько классов страниц, содержащих методы различных веб -страниц в некоторых сложных сценариях тестирования. Рекомендуется следовать единой номенклатуре именования при выборе соответствующих имен методов страниц.

Зачем использовать объект страницы (POM)?

По мере продвижения программного проекта сложность кода разработки и тестового кода увеличивается. Следовательно, при разработке тестового кода автоматизации необходимо соблюдать правильную структуру проекта; Иначе, код может стать неуправляемым.

Веб -продукт (или проект) состоит из различных веб -страниц, которые используют различные веб -размеры (например, элементы меню, текстовые поля, флажки, радиопроизводительные кнопки и т. Д.). Тестовые случаи будут взаимодействовать с этими элементами, и сложность кода будет увеличиваться в коллекторе, если локаторы не будут управляться правильно.

Дублирование исходного кода или использования дублированных локаторов может сделать код менее читаемым, что приведет к увеличению накладных расходов для обслуживания кода. Например, вашей команде необходимо проверить функциональность входа на веб-сайт электронной коммерции. Используя тестирование автоматизации с помощью селена, тестовый код может взаимодействовать с основным пользовательским интерфейсом или локаторами веб -страницы. Что произойдет, если пользовательский интерфейс обновлен или путь элементов на этой странице? Сценарии тестирования автоматизации потерпят неудачу, поскольку сценарии больше не найдут эти локаторы на веб -странице.

Предположим, вы следите за тем же подходом к разработке тестов для большего количества веб-страниц. В этом случае необходимо потратить значительные усилия на обновление локаторов, которые могут быть разбросаны (или дублирования) по разным файлам. Этот подход также подвержен ошибкам, поскольку разработчики должны найти и обновить путь локаторов. В таких сценариях модель объекта страницы может быть выгодной, поскольку она предлагает следующее:

  • Облегчает работу по обслуживаемости кода
  • Увеличивает читаемость и повторное использование коэффициент

Преимущества объектной модели страницы

Теперь, когда вы знаете основы модели объекта Page, давайте посмотрим на некоторые основные преимущества использования этого шаблона проектирования:

  • Увеличенная способность повторного использования – Методы объекта страницы в разных классах POM могут быть повторно использованы в разных тестовых случаях/тестовых комплексах. Следовательно, общий размер кода уменьшится с хорошей маржой из -за увеличения коэффициента повторного использования методов страниц.
  • Улучшенная обслуживаемость – Поскольку тестовые сценарии и локаторы хранятся отдельно, это делает код чище, и меньше усилий тратится на поддержание тестового кода.
  • Минимальное воздействие из -за изменений пользовательского интерфейса – Даже если в пользовательском интерфейсе частые изменения, изменения могут потребоваться только в репозитории объекта (который хранит локаторы). Существует минимально, чтобы не влиять на реализацию тестовых сценариев.
  • Интеграция с несколькими тестовыми рамками – Поскольку реализация теста отделяется от хранилища объектов страницы (или классов страниц), мы можем использовать один и тот же репозиторий с различными тестовыми рамками. Например, тестовый пример – 1 может использовать платформу робота, Case TESE – 2 может использовать платформу Pytest и т. Д. Одно тестовый набор может содержать тестовые примеры, реализованные с использованием Различные тестовые рамки Анкет

Модель объекта страницы В селене и питоне

Разработчики и тестеры широко используют селена WebDriver с такими языками программирования, как C#, Java, Python, JavaScript, PHP и многое другое. Преимущество использования селена WebDriver-разработчики, разработчики могут проверить свои веб-сайта или веб-сайт на различных типах и версиях браузеров, операционных систем и многого другого.

Из-за многоплатформенной поддержки, Селен является наиболее предпочтительной структурой в отношении тестирования автоматизации.

Модель объекта страницы В селене и питоне В действии (Пример 1)

Чтобы продемонстрировать модель объекта Page в Selenium и Python, мы приведем пример поиска Google, где поисковый термин является rambdatest. Мы использовали Pycharm IDE (сообщество Edition), который можно загрузить из Здесь для реализации. Ниже приводится реализация с помощью Framework, в которой создан экземпляр Selenium webdriver для выполнения необходимых взаимодействий с веб -браузером.

import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from time import sleep
import warnings
import urllib3

class GoogleSeachTest(unittest.TestCase):
    def setUp(self):
        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

    def test_GoogleSearch(self):
        driver_chrome = webdriver.Chrome()
        self.driver = driver_chrome
        driver_chrome.maximize_window()
        driver_chrome.get('http://www.google.com')

        # Perform search operation
        elem = driver_chrome.find_element(By.NAME, "q")
        elem.send_keys("Lambdatest")
        elem.submit()

    def tearDown(self):
        # Close the browser.
        self.driver.close()
        self.driver.quit()

if __name__ == '__main__':
    unittest.main()

Чтобы перенести эту реализацию в модель объекта Page в Selenium & Python, мы следуем структуре каталога, которая может использоваться независимо от масштаба и сложности проекта. Выбор структуры каталогов зависит от требований к тестированию, сложности тестов, а также опыта работы в команде разработки и тестирования.

Ниже показана структура каталогов, которую мы использовали для демонстрации модели объекта Page в Selenium & Python:

Project-Directory
     |--------- Src
                    |--------- PageObject
                                       |--------- Pages
                                                    |--------- *Page.py (Implementation of methods that make use of the respective Locators declared in Locators.py) 
                                       |--------- Locators.py
                    |--------- TestBase
                                       |--------- WebDriverSetup.py
     |--------- Test
                    |--------- Scripts
                                       |--------- test_*.py (Implementation of test code)(There should be 1:1 mapping of *Page.py and test_*.py as it helps in making the code more modular)
                    |--------- TestSuite
                                       |--------- TestRunner.py (contains TestSuite, which is a collection of test cases)

Как показано в приведенной выше структуре, Directory Project-Directory \ PageObject содержит locators.py, где добавляются локаторы элементов в зависимости от требований. Вот locators.py для примера поиска Google:

Имя файла – поиск \ pageObject \ locators.py

class Locator(object):

    #Google Search Page
    search_text="//input[@name='q']"
    submit="//div[@class='FPdoLc tfB0Bf']//input[@name='btnK']"
    # //input[@name='Google Search']"
    logo="//*[@id='hplogo']"

Поскольку локаторы добавляются на основе тестируемых веб -страниц, любая проблема с локаторами потребует изменений в файле, в котором размещаются локаторы (т.е. locators.py) и никаких изменений тестового кода. Ниже приведена страница (homepage.py), где используются локаторы.

Имя файла – Поиск \ pageObject \ pages \ homepage.py

import sys
sys.path.append(sys.path[0] + "/....")
# import os
# Uncomment if the above example gives you a relative path error
# sys.path.append(os.getcwd())

from selenium.webdriver.common.by import By
from Src.PageObject.Locators import Locator

class Home(object):
    def __init__(self, driver):
        self.driver = driver
        self.logo = driver.find_element(By.XPATH, Locator.logo)
        self.search_text = driver.find_element(By.XPATH, Locator.search_text)
        self.submit = driver.find_element(By.XPATH, Locator.submit)

    def getSearchText(self):
        return self.search_text

    def getSubmit(self):
        return self.submit

    def getWebPageLogo(self):
        return self.logo

Давайте проведем кодовое прохождение:

Мы используем относительный путь к импортным модулям или классам, которые расположены в другом каталоге. Следовательно, мы сначала добавим путь модуля Python к Syspath, используя sys.path.append (sys. Путь [0] + “/….”).

Locators.py находится в поиске каталогов \ src \ pageobject и homepage.py находится в поиске каталога \ pageObject \ pages. Чтобы добавить правильный путь, вы можете использовать Pycharm IDE, где после того, как вы добавите необходимые уровни (в отношении структуры каталога), класс или модуль будут распознаны. Например, ниже приведен скриншот, где используется неправильный относительный путь для использования класса локатора на homepage.py.

Поскольку локаторы. Относительные изменения пути в линии (5) предназначены только для демонстрации, и вы можете удалить…. В окончательной реализации.

Инициализация и настройка селена WebDriver отделены от тестовых наборов и тестовых сценариев для улучшения управляемости и переносимости кода. Когда вы планируете выполнять Автоматическое тестирование браузера Используя удаленный веб -драйвер, изменение требуется только в настройке WebDriver. Остальная часть реализации остается неизменной! Ниже показана реализация методов setup () и teardown () селена Webdriver.

Имя файла – Search \ src \ testbase \ webdriversetup.py

import unittest
from selenium import webdriver
import time
from time import sleep
import warnings
import urllib3

class WebDriverSetup(unittest.TestCase):
    def setUp(self):
        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(10)
        self.driver.maximize_window()

    def tearDown(self):
        if (self.driver != None):
            print("Cleanup of test environment")
            self.driver.close()
            self.driver.quit()

Цель использования модели объекта Page (POM) состоит в том, чтобы минимизировать процент повторяющегося кода и сделать код более портативным, разделяя реализацию на следующие разделы:

  • Локаторы, страницы (на основе тестируемой веб -страницы)
  • Тестовые сценарии (на основе тестируемой веб -страницы)
  • Тестовые люксы (Агрегация тестовых случаев)

Теперь, когда настройка WebDriver и реализация необходимых страниц готовы, мы реализуем соответствующие тестовые примеры.

Ниже приведена реализация функций поиска, которая использует тестовую инфраструктуру (локаторы + страницы), которую мы завершили до сих пор.

Имя файла – поиск \ test \ scripts \ test_home_page.py

import sys
sys.path.append(sys.path[0] + "/...")

from Src.TestBase.WebDriverSetup import WebDriverSetup
from Src.PageObject.Pages.HomePage import Home
import unittest
from selenium import webdriver

class Google_HomePage(WebDriverSetup):

    def test_Home_Page(self):
        driver = self.driver
        self.driver.get("https://www.google.com/")
        self.driver.set_page_load_timeout(30)

        web_page_title = "Google"

        try:
            if driver.title == web_page_title:
                print("WebPage loaded successfully")
                self.assertEqual(driver.title,web_page_title)
        except Exception as error:
            print(error+"WebPage Failed to load")

        # Create an instance of the class so that you we can make use of the methods
        # in the class
        home_page = Home(driver)

if __name__ == '__main__':
    unittest.main()

Имя файла – поиск \ test \ scripts \ test_google_search.py

import sys
sys.path.append(sys.path[0] + "/...")
# import os
# Uncomment if the above example gives you a relative path error
# sys.path.append(os.getcwd())

import unittest
from time import sleep
from Src.TestBase.WebDriverSetup import WebDriverSetup
from Src.PageObject.Pages.HomePage import Home

class Google_Search(WebDriverSetup):
    def test_GoogleSearch(self):

        driver = self.driver
        self.driver.get("https://www.google.com/")
        self.driver.set_page_load_timeout(30)

        # Create an instance of the class so that you we can make use of the methods
        # in the class
        home = Home(driver)
        home.search_text.send_keys("LambdaTest")
        sleep(5)
        home.search_text.submit()
        sleep(10)

if __name__ == '__main__':
    unittest.main()

Для начала создается экземпляр домашнего класса, чтобы методы можно было использовать в последующих разделах реализации. search_text.send_keys () и search_text.submit () методы используются для выполнения операции поиска на домашней странице Google. Вот реализация тестового набора, откуда запускаются соответствующие тесты:

Имя файла – Поиск \ test \ testSuite \ testrunner.py

import sys
import os
sys.path.append(sys.path[0] + "/...")
# Uncomment if the above example gives you a relative path error
sys.path.append(os.getcwd())

from unittest import TestLoader, TestSuite, TextTestRunner
from Test.Scripts.test_Home_Page import Google_HomePage
from Test.Scripts.test_Google_Search import Google_Search

import testtools as testtools

if __name__ == "__main__":

    test_loader = TestLoader()
    # Test Suite is used since there are multiple test cases
    test_suite = TestSuite((
        test_loader.loadTestsFromTestCase(Google_HomePage),
        test_loader.loadTestsFromTestCase(Google_Search),
        ))

    test_runner = TextTestRunner(verbosity=2)
    test_runner.run(test_suite)

    # Refer https://testtools.readthedocs.io/en/latest/api.html for more information
    parallel_suite = testtools.ConcurrentStreamTestSuite(lambda: ((case, None) for case in test_suite))
    parallel_suite.run(testtools.StreamResult())
        self.driver.set_page_load_timeout(30))

Ниже приведен скриншот выполнения, где тестовый набор запускается из терминала

Модель объекта страницы В селене и питоне В действии (пример 2)

Мы рассмотрим еще один пример, где тестовая веб -страница протекает безумно. Ниже приведены широкие требования к тестированию:

  1. Настройка селена Webdriver для веб -браузера Chrome.
  2. Откройте тестовую веб -страницу https://www.lambdatest.com Анкет
  3. Найдите кнопку входа на страницу и войдите в систему, используя зарегистрированные учетные данные.
  4. Проверьте, успешна ли операция входа в систему, и Lambdatest Automation Dashboard доступен.
  5. Выполните операцию очистки перед выходом из теста.

Структура каталога, используемая для примера поиска Google, также используется ранее, также используется для этого теста. Вы можете использовать инструмент осмотра, доступный в браузере Chrome/Firefox, чтобы найти информацию о локаторе.

В текущем сценарии тестирования нам нужно найти локаторы для домашней страницы Lambdatest ( https://www.lambdatest.com/ ) и страница Lambdatest вход ( https://accounts.lambdatest.com/Вход ).

Имя файла – rambdatest \ pageObject \ locators.py

# The intent is to test login functionality on LambdaTest
# The user has already registered on LambdaTest
# Step 1 - Open https://www.lambdatest.com/
# Step 2 - Locate the Login Button and Sign-In using Credentials
# Step 3 - Check whether the page https://accounts.lambdatest.com/dashboard is displayed
#          and Welcome - Dashboard is shown as the Title of the web page

class LT_Locator(object):

#Locators for Lambdatest Home Page
    lt_logo = "//img[@alt='LambdaTest']"
    lt_signup = "//a[.='Start Free Testing']"
    lt_login = "//a[.='Log in']"
    lt_automation = "//ul[@class='navbar-nav']//a[.='Automation']"

#Locators for Login Page - https://accounts.lambdatest.com/login
    lt_login_user_name = "//input[@name='email']"
    lt_login_password = "//input[@id='userpassword']"
    lt_login_button = "//*[@id='app']/div/div/div/div/form/div[3]/button"

Поскольку есть две веб -страницы, которые будут протестированы, мы создаем страницы для домашней страницы и функциональности входа в систему. Ниже приводится реализация логингии, где используются необходимые локаторы, и необходимые методы [например, get_lt_username (), get_lt_login_button () и т. Д.] Для использования в тестовом примере/тестовых комплексах реализованы

Имя файла – Lambdatest \ src \ pageobject \ pages \ lt_loginpage.py

import sys
sys.path.append(sys.path[0] + "/....")
# import os
# Uncomment if the above example gives you a relative path error
# sys.path.append(os.getcwd())

from selenium.webdriver.common.by import By
from Src.PageObject.Locators import LT_Locator

class LT_Login(object):
    def __init__(self, driver):

        self.driver = driver

        self.lt_login_user_name = driver.find_element(By.XPATH, LT_Locator.lt_login_user_name)
        self.lt_login_password = driver.find_element(By.XPATH, LT_Locator.lt_login_password)
        self.lt_login_button = driver.find_element(By.XPATH, LT_Locator.lt_login_button)

    def get_LT_username(self):
        return self.lt_login_user_name

    def get_LT_password(self):
        return self.lt_login_password

    def get_LT_login_button(self):
        return self.lt_login_button

Вот реализация функциональности домашней страницы:

Имя файла – lambdatest \ pageObject \ pages \ lt_homepage.py

import sys
sys.path.append(sys.path[0] + "/....")

from selenium.webdriver.common.by import By
from Src.PageObject.Locators import LT_Locator

class LT_Home(object):
    def __init__(self, driver):

        self.driver = driver
        self.lt_logo = driver.find_element(By.XPATH, LT_Locator.lt_logo)
        self.lt_signup = driver.find_element(By.XPATH, LT_Locator.lt_signup)
        self.lt_login = driver.find_element(By.XPATH, LT_Locator.lt_login)
        self.lt_automation = driver.find_element(By.XPATH, LT_Locator.lt_automation)

    def get_LT_logo(self):
        return self.lt_logo

    def get_LT_signup(self):
        return self.lt_signup

    def get_LT_login(self):
        return self.lt_login

    def get_LT_automation(self):
        return self.lt_automation

В аналогичных линиях у нас есть страница для тестирования функциональности дома на сайте rambdatest; Следовательно, мы создаем LambDatest \ pageObject \ pages \ lt_homepage.py. С объявлением требуемых локаторов (в локаторов.

Ниже показана реализация тестового примера, используемого для проверки функциональности дома:

Имя файла – lambdatest \ test \ scripts \ test_lt_homepage.py

import sys
sys.path.append(sys.path[0] + "/...")

from Src.TestBase.WebDriverSetup import WebDriverSetup
from Src.PageObject.Pages.LT_HomePage import LT_Home
import unittest
from selenium import webdriver
from time import sleep

class test_LT_HomePage(WebDriverSetup):

    def test_Home_Page(self):
        driver = self.driver
        self.driver.get("https://www.lambdatest.com/")
        self.driver.set_page_load_timeout(30)

        web_page_title = "Free Cross Browser Testing Tool | Selenium Automation Testing Online"

        try:
            if driver.title == web_page_title:
                print("WebPage loaded successfully")
                self.assertEqual(driver.title,web_page_title)
        except Exception as error:
            print(error+"WebPage Failed to load")

        # Create an instance of the class so that you we can make use of the methods
        # in the class
        lt_home_page = LT_Home(driver)
        if lt_home_page.get_LT_logo().is_displayed():
            print(lt_home_page.get_LT_logo().get_attribute('alt')+" logo is successfully displayed")
        else:
            print("Lambdatest logo is not displayed")

        sleep(10)

if __name__ == '__main__':
    unittest.main()

Ниже показана реализация тестового примера, используемого для проверки функциональности входа в систему:

Имя файла – lambdatest \ test \ scripts \ test_lt_loginpage.py

import sys
# import os
sys.path.append(sys.path[0] + "/...")
# Uncomment if the above example gives you a relative path error
# sys.path.append(os.getcwd())

import unittest
from time import sleep
from Src.TestBase.WebDriverSetup import WebDriverSetup
from Src.PageObject.Pages.LT_HomePage import LT_Home
from Src.PageObject.Pages.LT_LoginPage import LT_Login

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Add your username and password
username = "user-name@gmail.com"
password = "password"

class test_LT_LoginPage(WebDriverSetup):
    def test_Login_Page(self):

        driver = self.driver
        self.driver.get("https://lambdatest.com/")
        self.driver.set_page_load_timeout(360)

        # Create an instance of the class so that you we can make use of the methods
        # in the class
        lt_home_page = LT_Home(driver)

        # Click the login button to go to the next page https://accounts.lambdatest.com/login
        lt_home_page.lt_login.click()

        sleep(5)

        # Re-verify whether the page is loaded successfully
        web_page_title = "Login - LambdaTest"

        try:
            if driver.title == web_page_title:
                print("Login Page loaded successfully")
                self.assertEqual(driver.title, web_page_title)
        except Exception as error:
            print(error + "WebPage Failed to load")

        # Create an object of the Login Class
        lt_login_obj = LT_Login(driver)

        sleep(5)

        lt_login_obj.lt_login_user_name.send_keys(username)
        lt_login_obj.lt_login_password.send_keys(password)

        sleep(5)

        # Click the login button to go to the dashboard
        lt_login_obj.lt_login_button.click()

        sleep(5)

        # See if the login is successful by checking the title, if successful than exit
        # else report an Error
        web_page_title = "Welcome - LambdaTest"

        try:
             if driver.title == web_page_title:
                 print("User Logged in successfully")
                 self.assertEqual(driver.title, web_page_title)
        except Exception as error:
             print(error + "WebPage Failed to load")

        sleep(10)

        # Click on the automation tab and than exit
        automation_element = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, '//a[.='Automation']
'))
        )
        automation_element.click()

        sleep(5)

        print("Login test completed successfully")

if __name__ == '__main__':
    unittest.main()

Как видно из реализации, первоначально создается экземпляр домашнего класса (LT_HOME). При успешном творении мы используем lt_login.click () для перемещения на экране входа в систему.

Теперь, когда мы находимся на другой веб -странице, то есть https://accounts.lambdatest.com/login создается экземпляр класса входа (LT_LOGIN). Его соответствующие методы LT_LOGIN_USER_NAME () и LT_LOGIN_PASSWORD () используются с Send_Keys () для заполнения поля имени пользователя и пароля на странице.

Проверка того, является ли вход успешным, выполняется путем сравнения заголовка страницы (отображаемой страницы) с предполагаемым заголовком страницы. Если заголовки страниц соответствуют, то логин успешен, а деятельность по очистке выполняется. Два тестовых случая инициируются из испытательного набора; Реализация показана ниже

Имя файла – rambdatest \ test \ testsuite \ testrunner.py

import sys
# sys.path.append(sys.path[0] + "/...")
import os
sys.path.append(os.getcwd())

from unittest import TestLoader, TestSuite, TextTestRunner
from Test.Scripts.test_LT_HomePage import test_LT_HomePage
from Test.Scripts.test_LT_LoginPage import test_LT_LoginPage

import testtools as testtools

if __name__ == "__main__":

    test_loader = TestLoader()
    # Test Suite is used since there are multiple test cases
    test_suite = TestSuite((
        test_loader.loadTestsFromTestCase(test_LT_HomePage),
        test_loader.loadTestsFromTestCase(test_LT_LoginPage),
        ))

    test_runner = TextTestRunner(verbosity=2)
    test_runner.run(test_suite)
    # Refer https://testtools.readthedocs.io/en/latest/api.html for more information
    parallel_suite = testtools.ConcurrentStreamTestSuite(lambda: ((case, None) for case in test_suite))
    parallel_suite.run(testtools.StreamResult())

Для получения дополнительной информации о тестовом примере и внедрении набора тестов с использованием платформы Unittest, пожалуйста, обратитесь к нашим более ранним блогам, где эти темы обсуждаются более подробно. Ниже показано скриншот выполнения тестов, выполненных на тестировании URL -адреса, то есть лямбдейл.

Автоматическое тестирование браузера с использованием модели объекта страницы

Модель объекта страницы – это очень полезный шаблон проектирования, который помогает вам разработать и реализовать тестовый код, который более подготовлен с минимальным/без кодового дублирования. В ходе тестирования веб -приложений могут быть частые изменения в пользовательском интерфейсе, а отделение локаторов в тестовом коде от ядра улучшает модульность тестового кода.

Однако проверка в различных версиях/типах браузеров, операционных систем и устройств может быть сложной задачей, если тестирование выполняется в локальной среде. Наличие локальной настройки для тестирования браузера Cross не является ни масштабируемым, ни поддерживаемой.

Следовательно, вы должны перенести свои тесты в облачный Cross Browser Testing Платформа, где вы можете выполнять тесты на различных комбинациях браузеров, операционных систем и устройств, не размещая их локально. Автоматизированная платформа для тестирования браузеров, такая как LambDatest, позволяет вам выполнять автоматические и живые интерактивные тестирование браузера на 2000+ реальных браузерах и операционных системах в Интернете. Для переноса тестового кода из локального селена Webdriver требуется минимальные изменения в удаленную настройку селена WebDriver. Платформа также позволяет вам провести параллельное тестирование, что приводит к значительному сокращению с точки зрения усилий и времени, проведенного на автоматическом тестировании Cross Browser.

Чтобы начать, вам нужно сделать учетную запись на LambDatest. После входа в систему вы можете получить доступ к Lambdatest Automation Dashboard , который показывает тесты браузера Cross, которые вы выполнили на LambDatest. Вы также можете выполнить визуальное тестирование пользовательского интерфейса, тестирование в режиме реального времени (которое не требует реализации тестирования) и повысить ошибки с помощью регистрации ошибок в одном клике, интегрируясь с Jira, Asana, Slack, Bitbucket, командной работой, командами Microsoft или другими проблемами отслеживания проблем. Анкет

Чтобы увидеть автоматизированное тестирование браузера Cross на LambDatest в действии, давайте перенесем код тестирования LambDatest Login. Изменения в методе Setup () (расположенном в WebDriversetup.py) выполняются для выполнения тестирования на LambDatest Platform. Вход на LambDatest Platform выполняется с использованием имени пользователя и PassKey, которые можно получить из https://accounts.lambdatest.com/profile Анкет Желаемые возможности браузера передаются в удаленный интерфейс веб -драйвера Selenium для настройки среды браузера. Вы также можете генерировать желаемые возможности из Желаемый генератор возможностей Анкет Ниже приведены изменения, которые мы внесли для проведения автоматического тестирования браузера по пересечению на LambDatest.

Имя файла-\ src \ testbase \ webdriversetup-lambdatest-remote-webdriver.py

import unittest
from selenium import webdriver
import time
from time import sleep
import warnings
import urllib3

#Set capabilities for testing on Firefox
ff_caps = {
    "build" : "Page Object Model on Lambdatest using Unittest",
    "name" : "Page Object Model on Lambdatest using Unittest",
    "platform" : "Windows 10",
    "browserName" : "Firefox",
    "version" : "64.0",
}

user_name = " your-user-name "
app_key = " app-key-generated-during-account-creation"

# Obtain details from https://accounts.lambdatest.com/profile
# user_name = "your-user-name"
# app_key = "app-key-generated-during-account-creation"

class WebDriverSetup(unittest.TestCase):
    def setUp(self):
        global remote_url
        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
        remote_url = "https://" + user_name + ":" + app_key + "@hub.lambdatest.com/wd/hub"
        # self.driver = webdriver.Chrome()
        driver = webdriver.Remote(command_executor=remote_url, desired_capabilities=ff_caps)
        self.driver = driver
        self.driver.implicitly_wait(10)
        self.driver.maximize_window()
        # driver.get('http://www.google.com')

    def tearDown(self):
        if (self.driver != None):
            print("Cleanup of test environment")
            self.driver.close()
            self.driver.quit()

Вы должны выполнить тестовый набор из терминала, как вы делали для более ранних тестов. Чтобы проверить статус теста, вам нужно посетить вкладку «Автоматизация», расположенную в Lambdatest Dashboard и нажмите на тест, который соответствует названию сборки, которое вы упомянули в настройке, то есть модель объекта страницы LambDatest, используя Unittest в нашем случае.

Следовательно, выполнение автоматического тестирования поперечного браузера на облачной платформе, такой как LambDatest, может быть полезным независимо от масштаба и сложности проекта/продукта.

Вывод

Модель объекта Page может использоваться, чтобы сделать тестовый код более подготовленным и минимизировать объем дублирования кода в вашем проекте/продукте. Хотя он помогает сделать код более модульным, его общее влияние может быть больше, если он используется в сочетании с автоматизированной платформой тестирования браузера.

Модель объекта Page в Selenium & Python широко популярна, а код тестового кода с локальным селенам Webdriver в удаленное Selenium webdriver требует минимальных изменений реализации. Следовательно, структура модели объекта страницы для тестирования автоматизации с селенам должна изучаться командой Test & Development независимо от того, частые изменения пользовательского интерфейса в веб -приложении/веб -сайте.

Оригинал: “https://dev.to/himanshusheth004/page-object-model-pom-in-selenium-python-25m”