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. Kubernetes 笔记 10 Job 机器人加工厂

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Hi,大家好, ...

  2. 距离度量以及python实现(一)

    1. 欧氏距离(Euclidean Distance)        欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式. (1)二维平面上两点a(x1,y1)与b(x2,y2)间 ...

  3. RomUtil【Android判断手机ROM,用于判断手机机型】

    参考资料 Android判断手机ROM 正文 有时候需要判断手机系统的ROM,检测ROM是MIUI.EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件查找是否有对应属性 ...

  4. springboot~Integer和int如何选择,Integer的意义何在

    今天说一下自己在项目中遇到的问题,然后总结一下Integer引用类型和int值类型 关于默认值 Integer默认为null int默认为0 为什么把数据实体设计成Integer或者不是int 大叔认 ...

  5. 深入解析ThreadLocal 详解、实现原理、使用场景方法以及内存泄漏防范 多线程中篇(十七)

    简介 从名称看,ThreadLocal 也就是thread和local的组合,也就是一个thread有一个local的变量副本 ThreadLocal提供了线程的本地副本,也就是说每个线程将会拥有一个 ...

  6. [Nodejs] 用node写个爬虫

    寻找爬取的目标 首先我们需要一个坚定的目标,于是找个一个比较好看一些网站,将一些信息统计一下,比如 url/tag/title/number...等信息 init(1, 2); //设置页数,现在是1 ...

  7. 我的python渗透测试工具箱之自制netcat

    此工具的目的是实现在目标主机上的文件传输,控制命令行的功能,主要逻辑依靠python的subprocess模块.`sys`模块和`getopt`模块. 知识准备 studin和studut studi ...

  8. C# 添加Word页眉、页脚和页码

    在Word文档中,我们可以通过添加页眉.页脚的方式来丰富文档内容.添加页眉.页脚时,可以添加时间.日期.文档标题,文档引用信息.页码.内容解释.图片/LOGO等多种图文信息.同时也可根据需要调整文字或 ...

  9. Dubbo和Spring Cloud微服务架构'

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...

  10. java 线程池 ---- newFixedThreadPool()

    class MyThread implements Runnable{ private int index; public MyThread(int index){ this.index = inde ...