poium测试库之JavaScript API封装原理
poium一直我在维护的一个开源项目,它的定位是以极简的方式在自动化项目中Page Objects设计模式。我在之前的文章中也有介绍。
本篇文章主要介绍一个JavaScript元素操作的封装原理。
为什么要封装JavaScript的API?
因为有些场景下Selenium提供的API并不能满足我们需求。比如,滑动浏览滚动条,控制元素的显示/隐藏,日历控件的操作等,都可以通过JavaScrip实现,而且Selenium为我们提供了 execute_script()方法可以用来运行JavaScrip脚本。
旧的设计思路
先看旧的设计代码和调用。
# =====封装代码======
class Page(object):
def __init__(self, driver):
self.driver = driver
def set_text(self, css_selector, value):
"""
JavaScript API, Only support css positioning
Simulates typing into the element.
"""
js = """var elm = document.querySelector("{css}");
elm.style.border="2px solid red";
elm.value = "{value}";""".format(css=css_selector(), value=value)
self.driver.execute_script(js)
def click(self, css_selector):
"""
JavaScript API, Only support css positioning
Click element.
"""
js = """var elm = document.querySelector("{css}");
elm.style.border="2px solid red";
elm.click();""".format(css=css_selector())
self.driver.execute_script(js)
class CSSElement(object):
def __init__(self, css):
self.css = css
def __call__(self):
return self.css
# =======调用代码==============
from selenium import webdriver
class baiduPage(Page):
search_input = CSSElement("#kw")
search_button = CSSElement("#su")
dr = webdriver.Chrome()
dr.get("http://www.baidu.com")
page = baiduPage(dr)
page.set_text(page.search_input, "poium")
page.click(page.search_button)
dr.close()
如果你看不懂上面的封装代码的话,可以重点看下面的调用代码,针对元素的点击和输入。
page.set_text()
page.click()
表示操作的方法,在Page类中实现。
page.search_input
page.search_button
表示操作的对象,在Page的继承类baiduPage中定义。
page.set_text(page.search_input, "poium")
page.click(page.search_button)
操作的动作 和 操作的对象 都是以 page. 调用,万一我要操作的对象也命名为 click 那不就和操作的动作 傻傻分不清楚了, 所以,这样的语法不是很怪么?
所以,这个问题一直困扰我挺久的,我一直没想到更好的设计。
新的设计思路
直到前几天又重新学习了Python的 __get__ 和 __set__ 内置方法,才把这个问题解决。
# =====封装代码======
class Page(object):
def __init__(self, driver):
self.driver = driver
class CSSElement(object):
driver = None
def __init__(self, css):
self.css = css
def __get__(self, instance, owner):
if instance is None:
return None
global driver
driver = instance.driver
return self
def set_text(self, value):
global driver
driver.execute_script("""var elm = document.querySelector("{css}");
elm.style.border="2px solid red";
elm.value = "{value}";""".format(css=self.css, value=value))
def click(self):
global driver
driver.execute_script("""var elm = document.querySelector("{css}");
elm.style.border="2px solid red";
elm.click();""".format(css=self.css))
# =======调用代码==============
from selenium import webdriver
class baiduPage(Page):
search_input = CSSElement("#kw")
search_button = CSSElement("#su")
dr = webdriver.Chrome()
dr.get("http://www.baidu.com")
page = baiduPage(dr)
page.search_input.set_text("poium")
page.search_button.click()
dr.close()
如果看不懂封装代码的话,直接看调用代码。
page.search_input.set_text("poium")
page.search_button.click()
page 表示页面; search_input 表示页面上的某个对象; set_text() 表示对象的动作。
这样的语法是不是要比前面好了很多?而保持了与Selenium API 封装的语法一致性。
项目地址:https://github.com/defnngj/poium
做开源项目的生活就是这么朴实无华,且有趣!
poium测试库之JavaScript API封装原理的更多相关文章
- poium测试库介绍
poium测试库前身为selenium-page-objects测试库,我在以前的文章中也有介绍过:这可能是最简单的Page Object库,项目的核心是基于Page Objects实现元素定位的封装 ...
- Page Object设计模式(二)——poium测试库
一.简介 poium是一个基于Selenium/appium的Page Object测试库,最大的特点是简化了Page层元素的定义. 项目地址:https://github.com/SeldomQA/ ...
- RF框架自定义测试库开发
静态库 方法(methods)直接映射为关键字名称.关键字接受和方法相同的参数, 通过抛异常来 报告错误, 通过往标准输出里写入来写 log, 同时可以通过return 来返回结果. 创建步骤: ▲ ...
- 第一百三十五节,JavaScript,封装库--拖拽
JavaScript,封装库--拖拽 封装库新增1个拖拽方法 /** tuo_zhuai()方法,将一个弹窗元素实现拖拽功能 * 注意:一般需要在css文件将元素里的某一个区块光标设置成提示可以拖拽, ...
- 第一百三十四节,JavaScript,封装库--遮罩锁屏
JavaScript,封装库--遮罩锁屏 封装库新增1个方法 /** zhe_zhao_suo_ping()方法,将一个区块元素设置成遮罩锁屏区块 * 注意:一般需要在css文件将元素设置成隐藏 ** ...
- 第一百三十三节,JavaScript,封装库--弹出登录框
JavaScript,封装库--弹出登录框 封装库,增加了两个方法 yuan_su_ju_zhong()方法,将获取到的区块元素居中到页面,chuang_kou_shi_jian()方法,浏览器窗口事 ...
- 第一百三十二节,JavaScript,封装库--下拉菜单
JavaScript,封装库--下拉菜单 封装库,增加了3个方法 shu_biao_yi_ru_yi_chu()方法,给元素设置鼠标移入移出事件,接收两个参数,参数是移入和移出时的执行函数(包含代码) ...
- 第一百三十一节,JavaScript,封装库--CSS
JavaScript,封装库--CSS 将封装库里的方法,改成了原型添加方法 增加4个方法 tian_jia_class()方法,给获取到的元素添加class属性,参数是class属性值,可以连缀1 ...
- 第一百三十节,JavaScript,封装库--连缀
JavaScript,封装库--连缀 学习要点: 1.连缀介绍 2.改写库对象 本章我们重点来介绍,在调用库的时候,我们需要能够在前台调用的时候可以同时设置多个操作,比如设置CSS,设置innerHT ...
随机推荐
- 小白学python之整型,布尔值,十进制二进制转换和字符串详解for循环!
整型与字符串转化 十进制转二进制. python2,存在int 整型和long(长整型),在python3里就是int/获取的是浮点数 小数 print(bin(15)) 这样可以通过代码来计算十进制 ...
- Shiro在Web环境下集成Spring的大致工作流程
1,Shiro提供了对Web环境的支持,其通过一个 ShiroFilter 入口来拦截需要安全控制的URL,然后进行相应的控制. ①配置的 ShiroFilter 实现类为:org.spri ...
- webService 的使用
webService Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些 ...
- Adaboost原理推导
Adaptive Boosting是一种迭代算法.每轮迭代中会在训练集上产生一个新的学习器,然后使用该学习器对所有样本进行预测,以评估每个样本的重要性(Informative).换句话来讲就是,算法会 ...
- laravel5.6 使用迁移创建表
laravel 使用迁移创建表 创建迁移文件 --table 和 --create 选项可以用于指定表名以及该迁移是否要创建一个新的数据表.这些选项只需要简单放在上述迁移命令后面并指定表名: php ...
- 解读equals()和hashCode()
前面部分摘自:https://blog.csdn.net/javazejian/article/details/51348320 一:Object中equals方法的实现原理 public boole ...
- difflib python
difflib -帮助进行差异化比较 这个模块提供的类和方法用来进行差异化比较,它能够生成文本或者html格式的差异化比较结果,如果需要比较目录的不同,可以使用filecmp模块. 例子: # -*- ...
- win10去除快捷方式小箭头
切忌删除注册表项: HKEY_CLASSES_ROOT -> lnkfile -> IsShortcut 这个方法以前是可以的,但是在2018年之后更新的系统就会出现任务栏图标打不开的情况 ...
- 开启java之门
一.Java语言概述 Java语言诞生于1995年,由Sun公司推出. 2009年,Sun公司被甲骨文公司收购,所以我们现在访问oracle官网即可:https://www.oracle.com Ja ...
- 深入了解String和intern
引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8 ...