Я читал об объектах страницы и шаблонах проектирования на сайте проекта Webdriver и наткнулся на фабрика страниц. Не похоже, что API Webdriver для Python включает pagefactory. Это правда?
Поддерживает ли Webdriver pagefactory для Python?
Ответы (3)
Я не думаю, что в Python есть какие-либо эквиваленты аннотаций Java (@Find(By.xxx) и т. д.). Но это не значит, что вы не можете использовать шаблон PageObject.
Вы можете найти хороший пример того, как это сделать здесь: https://github.com/SeleniumHQ/selenium/blob/master/py/test/selenium/webdriver/common/google_one_box.py
Языки с динамической типизацией, такие как Python, менее одержимы шаблонами проектирования для создания объектов, потому что тривиально легко просто создать объект любого типа (с соответствующими методами) и вернуть его. Шаблоны — это общие решения общих проблем. Если что-то не является проблемой, вам не нужен шаблон, чтобы справиться с этим :-) ООП изначально был шаблоном проектирования в C.
Редактировать, декабрь 2017 г.:
В нашей собственной структуре для автоматизации страниц (для автоматизированного тестирования пользовательского интерфейса и других целей) мы используем шаблон проектирования pageobject, но нам не нужна фабрика страниц. Наследование старой школы от нашего пользовательского BasePage покрывало все наши (весьма разнообразные) потребности. Мы используем несколько приемов для создания элементов страницы и проверки правильности создания экземпляра страницы, и, основываясь на этом опыте, мне нравится, что наш объект PageObject прост.
Кроме того, Python допускает множественное наследование, если ваши потребности становятся более сложными.
По моему опыту (использую Python, Selenium и WebDriver уже более 5 лет), отсутствие шаблона фабрики страниц является признаком того, что он вам не нужен, а не того, что его невозможно реализовать.
Я создал модуль под названием pageobject_support
, который реализует шаблон PageFactory питоническим способом.
С помощью этого модуля страница поиска Google может быть смоделирована следующим образом:
from pageobject_support import cacheable, callable_find_by as find_by
from selenium.webdriver.common.by.By
class GoogleSearchPage(object):
_search_box = find_by(how=By.NAME, using='q', cacheable=True)
_search_button = find_by(name='btnK')
def __init__(self, driver):
self._driver = driver
def search(self, keywords):
self._search_box().click()
self._search_box().send_keys(keywords)
self._search_button().click()
Ваш отзыв приветствуется. Дополнительные сведения см. на странице https://jeremykao.wordpress.com/2015/06/10/pagefactory-pattern-in-python/