我在 Webdriver 项目站点上阅读有关页面对象和设计模式的信息,并遇到了pagefactory。它看起来不像 Python API 的 Webdriver 包含 pagefactory。这是真的?
3 回答
我认为 Python 中没有任何等效的 Java 注释(@Find(By.xxx) 等)。但这并不意味着您不能使用 PageObject 模式。
你可以在这里找到如何做的好例子:https ://github.com/SeleniumHQ/selenium/blob/master/py/test/selenium/webdriver/common/google_one_box.py
像 Python 这样的动态类型语言不太热衷于创建对象的设计模式——因为只需创建任何类型的对象(使用适当的方法)并返回它就很容易了。模式是常见问题的常见解决方案。如果某事不是问题,则不需要模式来处理它:-) OOP 最初是 C 中的一种设计模式。
编辑,2017 年 12 月:
在我们自己开发的页面自动化框架(用于自动化 UI 测试和其他目的)中,我们确实使用了 pageobject 设计模式,但不需要页面工厂。从我们的自定义 BasePage 继承的老式继承涵盖了我们所有(相当多样化的)需求。我们确实使用了一些技巧来创建页面元素并确保实例化了正确的页面,并且基于这种经验,我喜欢我们的 PageObject 很简单。
此外,如果您的需求变得更加复杂,Python 允许多重继承。
根据我的经验(使用 Python、Selenium 和 WebDriver 超过 5 年),缺少页面工厂模式表明您不需要它,而不是它无法实现。
我创建了一个名为的模块pageobject_support
,它以 Python 的方式实现 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/