Python的新Selenium框架,带有基本页和元素
zelenium的Python项目详细描述
泽兰
Python的新Selenium框架,带有基本页和元素
安装
pip install zelenium
使用
Zelenium提供了几个可以与经典相结合的功能 硒的使用:
- 驱动单体配置
- 带有BaseElements的BasePage
- 基本元素的后缀和格式机制
- 它对Appium测试也很有用。在
zelenium配置
要设置zelenium的配置,您只需使用Config
:
因为Config是singleton—您不能将它用于两个不同的 网络驱动程序。但如果需要,可以使用私有类:
fromzeleniumimportConfigfromzelenium.base.configimport_Configconfig1=Config.get_instance()config2=_Config()assertnot(config1isconfig2)# No assertion
BasePage和BaseElement
您的基本功能:
- 不需要传递webdriver实例-它将从 自动配置
- 一些预定义的方法,在测试中很有用
- 后缀机制
定义新页面
假设我们已经为配置设置了webdriver, 开始创建新页面:
fromselenium.webdriver.common.byimportByfromzeleniumimportBasePageclassLoginPage(BasePage):title=(By.CSS_SELECTOR,"[data-test='title']")username=(By.CSS_SELECTOR,"[data-test='username']")password=(By.CSS_SELECTOR,"[data-test='password']")submit=(By.CSS_SELECTOR,"[data-test='submit']")defmain():login_page=LoginPage()print(login_page.title().text)main()
如果我们在浏览器中打开某个东西后执行它,它会发现 元素并在其中打印文本。在
它是如何工作的?在
好吧,BasePage还有一个metaclass
,它将覆盖整个page类
字段,如果字段是包含两个字符串的元组,则将替换为
BaseElement
。在
BaseElement
本身有一个神奇的__call__
方法,当
“调用”类实例:
fromzeleniumimportBEelem=BE("by","selector")web_element=elem()# Here you calls class instance and it will return# WebElement for you. Just classic WebElement
继承页面
例如,您有几个页面,它们具有相同的结构,但有些 不同的逻辑,例如:
fromselenium.webdriver.common.byimportByfromzeleniumimportBasePageclassLoginPage(BasePage):title=(By.CSS_SELECTOR,"[data-test='title']")username=(By.CSS_SELECTOR,"[data-test='username']")password=(By.CSS_SELECTOR,"[data-test='password']")submit=(By.CSS_SELECTOR,"[data-test='submit']")deflogin(self,username,password):self.username().send_keys(username)self.password().send_keys(password)self.submit().click()classRegisterPage(LoginPage):full_name=(By.CSS_SELECTOR,"[data-test='full_name']")defregister(self,full_name,username,password):self.full_name().send_key(full_name)self.username().send_keys(username)self.password().send_keys(password)self.submit().click()
使用这个-你不需要在不同的页面上重新定义元素- 如果它们有相同的定位器(或者完全相同),你可以继承它们。在
格式化元素
有时需要用相似的定位器定义许多元素。 Zelenium提供了两种解决方法。首先是BaseElement格式:
fromselenium.webdriver.common.byimportByfromzeleniumimportBasePage,BEclassDevicesPage(BasePage):_cell=BE(By.CSS_SELECTOR,"[data-test='devicesPageCell_{}']")user=_cell.format("user")imei=_cell.format("imei")iccid=_cell.format("iccid")model=_cell.format("model")
{and formats}返回一个新的方法 基本元素的。在
第二种机制是后缀:
fromselenium.webdriver.common.byimportByfromzeleniumimportBasePageclassDevicesPage(BasePage):__suffix="devicesPageCell_"user=(By.CSS_SELECTOR,"[data-test='{s}_user']")imei=(By.CSS_SELECTOR,"[data-test='{s}_imei']")iccid=(By.CSS_SELECTOR,"[data-test='{s}_iccid']")model=(By.CSS_SELECTOR,"[data-test='{s}_model']")
这两种机制的主要区别是:
- 后缀自动添加到定位器
- 后缀可以继承
- 格式可以在类之外的任何地方使用-你可以格式化 元素根据页面上的变化而变化。在
- 格式要求使用BaseElement类本身
后缀继承示例:
fromselenium.webdriver.common.byimportByfromzeleniumimportBasePageclassLoginPage(BasePage):__suffix="loginPageForm_"title=(By.CSS_SELECTOR,"[data-test='{s}title']")username=(By.CSS_SELECTOR,"[data-test='{s}username']")password=(By.CSS_SELECTOR,"[data-test='{s}password']")submit=(By.CSS_SELECTOR,"[data-test='{s}submit']")classRegisterPage(LoginPage):__suffix="registerPageForm_"email=(By.CSS_SELECTOR,"[data-test='{s}email']")confirm=(By.CSS_SELECTOR,"[data-test='{s}confirm']")classRenamedRegisterPage(RegisterPage):__suffix="renamedRegisterPageForm_"defmain():log=LoginPage()reg=RegisterPage()ren=RenamedRegisterPage()print(log.title)print(log.username)print(log.password)print(log.submit)print(reg.title)print(reg.username)print(reg.password)print(reg.submit)print(reg.email)print(reg.confirm)print(ren.title)print(ren.username)print(ren.password)print(ren.submit)print(ren.email)print(ren.confirm)if__name__=='__main__':main()
此代码将输出:
Element [data-test='loginPageForm_title'] (css selector) Element [data-test='loginPageForm_username'] (css selector) Element [data-test='loginPageForm_password'] (css selector) Element [data-test='loginPageForm_submit'] (css selector) Element [data-test='registerPageForm_title'] (css selector) Element [data-test='registerPageForm_username'] (css selector) Element [data-test='registerPageForm_password'] (css selector) Element [data-test='registerPageForm_submit'] (css selector) Element [data-test='registerPageForm_email'] (css selector) Element [data-test='registerPageForm_confirm'] (css selector) Element [data-test='renamedRegisterPageForm_title'] (css selector) Element [data-test='renamedRegisterPageForm_username'] (css selector) Element [data-test='renamedRegisterPageForm_password'] (css selector) Element [data-test='renamedRegisterPageForm_submit'] (css selector) Element [data-test='renamedRegisterPageForm_email'] (css selector) Element [data-test='renamedRegisterPageForm_confirm'] (css selector)
- 项目
标签: