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 ...
随机推荐
- 软件测试必须掌握的linux命令大全
测试工程师的四大基础技能:数据库.linux.网络协议.测试工具,不管是刚入门还是已经工作多年,这几个方向都是要掌握的.今天我们再讲一下测试工程师必须要掌握的linux命令. 测试工程师需要掌握lin ...
- vijos P1911 珠心算测验
#include<iostream> using namespace std; int main() { int n; int sum = 0; int num[200]; cin > ...
- 关于python3与python2同时存在情况下导入pyqt失败解决记录
最近感觉tkinter功能还是比较不适合新手做出高大上的界面,故开始使用pyqt,通过pip安装好了之后,利用qt设计师设计好界面之后,cmd运行之,报错提示没有找到pyqt5模块,IDE运行能正常加 ...
- 基于ng-zorro的ASP.NET ZERO前端实现之代码生成器
上一篇介绍了集成ng-zorro的过程,本篇我们来看下如何用abp官方的生成器来生成前端代码. Abp官方提供了一个强大的代码生成器 ASP.NET Zero Power Tools,它的Visual ...
- C#编程.异常处理(Exception Handling Statements)
C#语言包含结构化异常处理(Structured Exception Handling,SEH). throw The throw statement is used to signal the oc ...
- CentOS 下配置JDK
从官网上下载jdk到系统中,并解压好 tar –axvf jdk.tr.gz 1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找 ...
- [NLP] 相对位置编码(一) Relative Position Representatitons (RPR) - Transformer
对于Transformer模型的positional encoding,最初在Attention is all you need的文章中提出的是进行绝对位置编码,之后Shaw在2018年的文章中提出了 ...
- Python基础总结之第一天(新手可相互督促)
我是大刘啊~ 坚持每周更新最少一次,为年薪20万迈进! 我为什么要学Python? 答:我想要涨工资...家里有矿我就不会来烧脑了...... 先写点什么呢? 新手,hhh,激动无比,无从下爪.... ...
- Java常用命令及参数
Java的基本指令参数 javac [-d 目录|-verbose] file java [-classpath(cp) dir] file jar -zcvf dir file javap [-pr ...
- js获取手机系统语言
只需 navigator.language 就可以获取手机系统语言,要做国际化的童鞋可以看看 如图:(第一次是简体,第二次切换English),zh-CN,en-US是语言代码 更多语言代码,请查看h ...