poium测试库前身为selenium-page-objects测试库,我在以前的文章中也有介绍过:这可能是最简单的Page Object库,项目的核心是基于Page Objects实现元素定位的封装。该项目由我个人在维护,目前在公司项目中已经得到的应用。

### poium的优势

Page Objects设计模式大家都懂,以往我们对Page层的封装大概是这样的。

class BasePage():

   def __init__(self, driver):
self.dr =driver def by_id(self, elem):
returnself.dr.find_element_by_id(elem) class BaiduIndexPage(BasePage): # 搜索框
@property
def search_input(self):
return self.by_id("kw") # 搜索按钮
@property
def search_button(self):
return self.by_id("su")

大体上是每个操作元素封装为一个方法,这样并没什么不好的,只是不够简洁。而poium可以极大的简化元素的定义,甚至接近,配置文件。

from poium import Page, PageElement

class BaiduIndexPage(Page):
search_input= PageElement(css="#kw", describe="搜索框")
search_button= PageElement(css="#su", describe="搜索按钮")

几百个元素的也只不过几百行代码,使用也远比配置文件简单。将元素写到配置文件里,你还要考虑如何读取。

不管是前一种page层封装,还是使用poium封装在测试用例中的使用并无太大的差别。

from selenium import webdriver
import unittest defbaiduTest(unittest.TestCase): defsetUp(self):
self.driver =webdriver.Chrome()
self.base_url ="https://www.baidu.com" def tearDown(self):
self.driver.quit() def test_search(self):
page= BaiduIndexPage(driver)
page.get(self.base_url)
page.search_input.send_keys("poium")
page.search_button.click()
# .....

### JavaScript API

在我们项目中,时常要用到JavaScript操作,比如日期控件不好操作,那会通过JS的removeAttribute() 删除掉元素的某些属性,使他可以通过输入完成日期的“选择”。比如,有些元素用Selenium点击不了,但JS的click()却可以,再比如有些弹窗不是必现的,就必须使用异常捕捉,但JS可以更轻松的处理弹窗。

于是,我封装了一组由JS实现的API。

from poium import Page

class BaiduPage(Page):
# 元素定位只支持CSS语法
search_input ="#kw"
search_button ="#su" def test_attribute(self):
"""
元素属性修改/获取/删除
:param browser: 浏览器驱动
"""
driver= webdriver.Chrome()
page =BaiduPage(browser)
page.get("https://www.baidu.com")
page.remove_attribute(page.search_input,"name")
page.set_attribute(page.search_input, "type", "password")
value =page.get_attribute(page.search_input, "type")
assert value =="password"

不过,JS实现的API中的只支持CSS定位。

强列推荐使用CSS定位,因为poium还可以将操作过的元素在自动化的运行过程中给你标记出来。

这样当程序运行失败需要截图时就比较清晰了,但是,这个功能还不完善。

### appium 支持

为什么不是不叫selenium-page-objects了?因为poium也支持appium了呀,使用之前的名字如何表达对appium的支持呢?

from appium import webdriver
from poium import Page,PageElement class CalculatorPage(Page):
number_1 = PageElement(id_="com.android.calculator2:id/digit_1")
number_2 = PageElement(id_="com.android.calculator2:id/digit_2")
add = PageElement(id_="com.android.calculator2:id/op_add")
eq = PageElement(id_="com.android.calculator2:id/eq") # APP定义运行环境
desired_caps = {
'deviceName': 'AndroidEmulator',
'automationName': 'appium',
'platformName': 'Android',
'platformVersion': '7.0',
'appPackage': 'com.android.calculator2',
'appActivity': '.Calculator',
}
driver =webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
page =CalculatorPage(driver)
page.number_1.click()
page.add.click()
page.number_2.click()
page.eq.click() driver.quit()

在appium中的使用与selenium是一致的!当然,appium扩展了更多的定位方法。

  • ios_uiautomation
  • ios_predicate
  • ios_class_chain
  • android_uiautomator
  • android_viewtag
  • android_datamatcher
  • accessibility_id
  • image
  • custom

poium同样支持这些定位,在appium中如何使用,那么这里也是一样的。

最后,poium并不会对你的现有自动化产生太多的影响,它只是对元素操作的封装,你可以在项目当中随意的选择是否要用它。

项目地址:poium

支持pip安装:

pip install poium

poium测试库介绍的更多相关文章

  1. Page Object设计模式(二)——poium测试库

    一.简介 poium是一个基于Selenium/appium的Page Object测试库,最大的特点是简化了Page层元素的定义. 项目地址:https://github.com/SeldomQA/ ...

  2. poium测试库之JavaScript API封装原理

    poium一直我在维护的一个开源项目,它的定位是以极简的方式在自动化项目中Page Objects设计模式.我在之前的文章中也有介绍. 本篇文章主要介绍一个JavaScript元素操作的封装原理. 为 ...

  3. Android开发中用到的框架、库介绍

    Android开发中用到的框架介绍,主要记录一些比较生僻的不常用的框架,不断更新中...... 网路资源:http://www.kuqin.com/shuoit/20140907/341967.htm ...

  4. logminer使用测试库进行挖掘分析,10.2.0.5

    上一篇测试是在dg环境进行测试挖掘,但是如果客户存在一个测试库,那样使用日志挖掘的影响性更小.本篇进行测试分析. 测试环境介绍: oracle linux  5.6,vmware虚拟机,安装两套单实例 ...

  5. Robot Framework(十四) 扩展RobotFramework框架——创建测试库

    4.1创建测试库 Robot Framework的实际测试功能由测试库提供.有许多现有的库,其中一些甚至与核心框架捆绑在一起,但仍然经常需要创建新的库.这个任务并不复杂,因为正如本章所示,Robot ...

  6. Robot Framework(五)使用测试库

    使用测试库 测试库包含那些最低级别的关键字,通常称为 库关键字,实际上与被测系统交互.所有测试用例总是使用某些库中的关键字,通常是通过更高级别的用户关键字.本节介绍如何使用测试库以及如何使用它们提供的 ...

  7. Python的标准库介绍与常用的第三方库

    Python的标准库介绍与常用的第三方库 Python的标准库: datetime:为日期和时间的处理提供了简单和复杂的方法. zlib:以下模块直接支持通用的数据打包和压缩格式:zlib,gzip, ...

  8. RF框架自定义测试库开发

    静态库 方法(methods)直接映射为关键字名称.关键字接受和方法相同的参数, 通过抛异常来 报告错误, 通过往标准输出里写入来写 log, 同时可以通过return 来返回结果. 创建步骤: ▲ ...

  9. Robot Framework(5)- 使用测试库

    如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html 前言 在RF 测 ...

随机推荐

  1. GC参考手册 —— GC 算法(实现篇)

    学习了GC算法的相关概念之后, 我们将介绍在JVM中这些算法的具体实现.首先要记住的是, 大多数JVM都需要使用两种不同的GC算法 —— 一种用来清理年轻代, 另一种用来清理老年代. 我们可以选择JV ...

  2. 【java线程池】

    一.概述 1.线程池的优点 ①降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗: ②提高系统响应速度,当有任务到达时,无需等待新线程的创建便能立即执行: ③方便线程并发数的管控,线 ...

  3. 五行Python代码教你用微信来控制电脑摄像头

    如果说强大的标准库奠定了Python发展的基石,丰富的第三方库则是python不断发展的保证.今天就来通过itchart库来实现通过微信对电脑的一些操作. 一.安装库 安装itchat itchat ...

  4. 使用阿里云的图片识别成表格ocr(将图片表格转换成excel)

    为了简便财务总是要对照着别人发来的表格图片制作成自己的表格 图片识别 识别成表格 表格识别 ocr 使用阿里云api 购买(印刷文字识别-表格识别) https://market.aliyun.com ...

  5. python默认编码设置

      打开python 的gui,输入 1 2 import sys sys.getdefaultencoding() 查询系统当前默认编码 默认情况下显示编码方式为ASCII 在python安装目录下 ...

  6. Celery工具

    什么是Celery Celery的功能 Celery是基于python实现的第三方组件,可以实现定时任务.周期任务等. Celery的组成 Celery的角色 - 任务,创建或发布任务. - 使用re ...

  7. revit二次开发wpf里button按钮无法实现事务

    不能在revit提供的api外部使用事务,解决此方法, 1.把button里要实现的功能写到外部事件IExternalEventHandler中,注册外部事件,在button事件中.raise()使用 ...

  8. Java运行时环境---ClassLoader类加载机制

    背景:听说ClassLoader类加载机制是进入BAT的必经之路. ClassLoader总述: 普通的Java开发其实用到ClassLoader的地方并不多,但是理解透彻ClassLoader类的加 ...

  9. Struts2中五个重要的常量

    一.五个常量的位置:位于xwork核心包下的Action字节码文件里 二.五个常量的介绍: a: SUCCESS public static final String SUCCESS = " ...

  10. 如何将workerman部署到windows服务器上面

    一直以来对php的即时通讯都很好奇,其实是不知道应该怎么来实现,后来了解到了swoole和workerman这两个神器,他们都可以实现即时通信的功能,其中swoole是C语言编写的php扩展,其配置起 ...