Python的新Selenium框架,带有基本页和元素

zelenium的Python项目详细描述


泽兰

Python的新Selenium框架,带有基本页和元素

安装

pip install zelenium

使用

Zelenium提供了几个可以与经典相结合的功能 硒的使用:

  • 驱动单体配置
  • 带有BaseElements的BasePage
  • 基本元素的后缀和格式机制
  • 它对Appium测试也很有用。在

zelenium配置

要设置zelenium的配置,您只需使用Config

^{pr2}$

因为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)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将值插入sql表的选定列。使用c等参数#   IF语句的java JList数据添加   java在这种情况下有没有更好的方法来调整哈希值?   java@Valid不会触发@Repository中的验证   java如何在安卓中调整位图的大小   iTextJava。lang.NoClassDefFoundError:com/itextpdf/text/DocumentException   java使用ResourceBundleMessageSource加载一个ressource包(message.properties)的全部内容   java如何通过JasperReports 6动态设置Excel工作表名称。十、   java是编写这个程序的最佳方式   JAVA伊奥。FileNotFoundException:C:\Program Files\Apache软件基金会\Tomcat 8.0\。。\webapps\ROOT\\u cips\config。伊尼   java我正在尝试创建一个TictaToe程序,但是JOptionPane和绘图有问题   垃圾收集为什么java中的finalize()方法不在Finalizer类中?为什么它是在对象类中定义的?   java如何用括号编码替换url中的括号?   java web集成移动应用程序   在netbeans中运行MIDP2应用程序时出现java错误