《selenium webdriver实战宝典》记
最近在整理已有的selenium 知识,于是借来一本之前学习过程的书重新快读了两遍,结合自己的知识记录下其中的一些内容方便以后回顾;
内容并不是selenium学习教程、答疑,且为自己做的笔记加上一些自己的经验,本是记录在word中,后来还是决定放在网络上保存便于随时查看(从word里面复制过来的编号会有“ [if!supportLists]3. [endif]“” ,手动删掉),希望对某些正在selenium学习路上的人有一点点作用;有些内容记录较为抽象,或者没有注意大小写,如果有一定的selenium经验会有助于对该文章内容的理解,涵盖的内容也存在跨度,笔记的顺序和书中内容顺序相同;
还请见谅没有过多的时间进行详尽的整理,由于有些内容个人比较熟悉,所以某些与selenium学习有帮助的内容或许并没有出现在该文章中或者是一笔带过;
Ui自动化之痛:
1.编写代码存在门槛,脚本执行时间:
2.创建脚本、维护调试、排错时间长
3.业务变更、页面变更、脚本稳定性、人员流动性
4.多浏览器、多兼容设备、环境
自动化创新
1.实用:减轻测试工作量,提高测试效率,减轻企业人员成本
2.效率:让自动化高效、实用
3.稳定性、易维护性
4.简单:降低自动化技术门槛
以下是记录内容:
初级自动化:
TestNG:
优点:
1.漂亮html报告;
2.支持并发测试;如:testng配置文件设置
3.参数化测试;
4.支持输出日志;
5.支持更多注释;
Testng生成报告在工程目录下“test-output”目录里面,index.html报告;
Testng常用注解:before after suite\group\test\class\method
Testng报告自定义日志:
Reporter.log(‘记录日志’);
Xpath定位方法:
相对路径、索引号、属性值、模糊属性、xpath轴定位(parent\child\ancestor\descendant\following-sibling\preceding-sibling)、文本定位
特殊用法,某些特殊要求可能会用到,所有拥有子元素a的div://div[a]
Css定位:
相对路径、属性值(其中包含id(#),class(.),部分属性(^\$\*))、子元素(>)、伪类定位(first-child\nth-child(n)\last-child\focus\enabled\checked)、同级兄弟(+)
Firefox上以上两者定位无差别,chrome兼容性稍差,注:Xpath在ie上兼容情况并不好,定位慢,以秒为单位,容易出错,不稳定,css未大量实践过
等待alert弹窗:
public static void waitForAlert(WebDriverWait wait) {
wait.until(ExpectedConditions.alertIsPresent());
}
操作浏览器:
Driver.navigate().to(url);
Driver.navigate().back();
Driver.navigate().forward();
Driver.navigate().refresh();
看到有人面试遇到关于页面刷新的问题,关于个人想到的selenium 浏览器刷新方法:
1.Driver.navigate().refresh();
2.模拟按键F5刷新;
3.js刷新;
操作浏览器窗口:
Driver.manage().window().setPosition(point);
Driver.manage().window().setsize(dimension);
Driver.manage().window().maximize();
杀掉windows浏览器进程:
1. WindowsUtils.tryToKillByName(“chrome.exe”);
2.java执行command命令:
Process p = Runtime.getRuntime().exec(command);
command: taskkill /f /im chrome.exe
执行js:
String text = (String) (JavascriptExecutor)driver.executeScript(“var button = document.getElementById(‘std’); return button.value;”)
拖拽:
New actions(driver).dragAndDropBy(element, 0, 10).build().perform();
Selenium Action模拟键盘操作
普通键(table\space等,没有字母按键),修饰键(ctrl\shift\alt\win等):
Action action= new Action(driver);
actions.sendKeys(Keys.ALT); //相当于actions.keyDown(keysToSend),而如果在现实的应用中想要模拟按下并且释放这些修饰键,应该再调用 action.sendKeys(keys.NULL) 来完成这个动作。
action.sendKeys(keys.NULL);
action.keyDown(Keys.ALT);
action.keyUp(Keys.ALT);
使用java Robot类操作keys没有枚举的按键:
比如字母键 a、b、c、d … z,一些符号键比如:‘ {}\[] ’、‘ \ ’、‘。’、‘ ? ’、‘:’、‘ + ’、‘ - ’、‘ = ’、、‘“”’,还有一些不常用到的功能键如PrtSc、ScrLk/NmLk
Robot robot = new Robot();
robot.keyPress(java.awt.event.KeyEvent.VK_ALT);
robot.keyRelease(java.awt.event.KeyEvent.VK_ALT);
上传附件:
1.element.sendkey(“d:\\a.txt”); //注:一定要符合type="file"的input元素控件,适用范围小
2.autoit工具上传;
模拟鼠标右键
action.contextClick(driver.findElement(By.id(“test”))).perfom();
悬浮:
action.moveToElement().perform(); Thread.sleep(1000);
鼠标左键单击和长按:
Action.clickandHold(ele).perform();
Action.release(ele).perform();
显示等待常用:
ExpectedConditions.presenceOfElementLocated(by);-----------页面元素在页面中是否存在
ExpectedConditions.elementToBeClickable(by);-------------------页面元素是否在页面上可用和可被单击
建议擅用自定义显示等待:
(new WebDriverWait(driver, time)).until(new ExpectedCondition<Boolean>()){
@Override
public Boolean apply(WebDriver arg0){
return _____________________;
}
}
自定义显示等待ajax请求加载完成;
return(Boolean)js.executeScript(“return jQuery.active==0”);
ajax了解,w3school:
http://www.w3school.com.cn/ajax/index.asp
AJAX是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。
XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
GET 还是 POST?
与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。
然而,在以下情况中,请使用 POST 请求:
无法使用缓存文件(更新服务器上的文件或数据库)
向服务器发送大量数据(POST 没有数据量限制)
发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠
中级自动化:
WebDriver高级应用(绝大部分涉及到js操作):
1. 使用js语句代替某些无法操作的元素,如点击无效:
((JavascriptExecutor)driver).executeScript(“arguments[0].click();”,element);
2. 设置一个页面元素的属性:
((JavascriptExecutor)driver).executeScript(“arguments[0].setAttribute(argument[1],arguments[2]);”,element, attributeName, value);
3. 某些日期控件设置日期:
Element.sendkeys(“12/31/2012”);
4. 滚动条操作:
a) 将页面滚动条滑动到最下方
((JavascriptExecutor)driver).executeScript(“window.scrollTo(0,document.body.scrollHeight)”);
b) 滑动800像素
((JavascriptExecutor)driver).executeScript(“window.scrollTo(0,800)”);
c) 滚动到指定的元素显示在浏览器中
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoViewIfNeeded(true);", element);
5. 启动带有用户配置信息的Firefox窗口
6. Java 的Robot类操作对象,模拟键盘按键
7. 对象库(UI Map),可了解,属于高级自动化相关部分:
目的:使用配置文件存储元素定位,做到将定位的配置文件和测试程序分离;可提供给不具备编码能力的人员修改定位;
8. 操作富文本框
a) 使用js设置富文本框值
Driver.switchTo().frame(富文本框的frame);
// document.getElementsByTagName(‘body’)[0]获取富文本框编辑区域对象
((JavascriptExecutor)driver).executeScript(“document.getElementsByTagName(‘body’)[0].innerHTML
= ‘内容’ ”);
b) Robot类模拟键盘操作:
可以通过先将光标置于页面某个元素,然后模拟键盘table按键将光标跳转到富文本框内,再模拟复制粘贴操作将文本框内容写入;
9. 高亮显示正在操作的元素,需要自行封装定位元素操作,加上高亮代码:
((JavascriptExecutor)driver).executeScript(“arguments[0].setAttribute(‘style’,arguments[1]);”, element, “background:yellow; border: 2px solid red;”);
10. 控制视频播放
页面对象(PO)模式:
关于页面跳转问题实现:在页面跳转的方法里面new下一个页面对象作为返回值;
数据驱动测试:
Testng数据驱动注解:@DataProvider
a) 使用csv、Excel文件进行数据驱动
b) 使用数据库进行数据驱动
行为驱动BBD(Behavior Driven Development), Cucumber框架
关键词:
Given: 用例开始的前置条件
When: 用例的关键操作步骤
Then:验证步骤
And: 一个步骤中存在多个Given操作,后面的Given用And替代
But: 一个步骤中存在多个Then操作,后面的Then用But替代
高级自动化:
Selenium grid组件用于远程分布式测试或并发测试;可以在一台计算机上分发多个测试用例给多台计算机(不同操作系统、浏览器环境)并发执行,解决某些限时执行、兼容性要求;
Selenium grid 使用hub和node模式(一个中心、多个节点);
对于一个节点执行一种浏览器的情况(个人观点):
可以考虑使用Jenkins创建不同的任务(分别用于不同的浏览器兼容环境测试),取同一套自动化代码(项目目录下有专门存放各种properties配置文件的文件夹),在Jenkins配置执行command命令,从专门放置properties配置文件夹里面取出不同的兼容环境的properties配置文件(该文件中浏览器参数配置不同的浏览器,不同的grid节点)拷贝覆盖执行时使用的properties配置文件(command命令原理:copy testng配置文件夹路径\**-testng.xml testng.xml);在testng配置文件里将所有class用例划分成多个test组,每个test组使用一个线程并行运行里面包含的class,实现可持续集成远程分布兼容环境并发性测试;
自动化测试框架常见的4种模式:
1. 数据驱动测试框架
2. 关键字驱动测试框架(用户输入框,输入,内容)
3. 混合型测试框架(数据驱动+关键字)
4. 行为驱动
Web自动化测试框架搭建步骤:
1. 筛选可自动化执行的用例和功能;
2. 根据业务类型以及自身能力选择框架类型;
3. 确定框架后,将常用的浏览器选择、测试数据处理、文件操作、数据库操作、页面元素的原始操作、日志和报告等功能进行类方法的封装实现,放在项目工具类的包中。
4. 采用pageobject模式和testng框架结合设计的自动化框架展开自动化脚本编写,加强复用操作的封装性,尽可能的贯彻数据与代码的分离的思想,降低脚本编写的复杂度;
5. 根据项目需求进行Jenkins持续集成;
6. 编写自动化框架常用api文档,以供他人参阅;
7. 不断收集自动化框架在实际使用中的问题,优化提升框架功能;
框架搭建本身比实现单个用例要复杂很多,主要是抽象、提取、文件分离、易修改、可重用的思想,但是一个好的框架对于实现大量自动化脚本来说是磨刀不误砍柴功;
如项目中存在四类包:
1. cn.gloryroad.appModules:实现复用业务逻辑的封装
2. cn.gloryroad.pageObjects: 实现被测试对象的页面类
3. cn.gloryroad.testScripts: 实现具体测试脚本逻辑,测试用例实现
4. cn.gloryroad.util: 实现测试过程汇总调用的工具类方法,如文件操作、mapObject、页面元素操作等;
关键字驱动:
将操作方法关键字存在放在Excel中固定列,通过java反射机制获取关键字类keyWordsaction中所有的方法:method = keyWordsaction.getCalss().getMethods();
找到keywordsaction类的映射方法后,通过invoke方法完成函数调用
Method[i].invoke(keywordsaction,value);
关键字框架比数据驱动框架更加高级,可以进一步提高自动化测试工作实施效率,实现在一个文件中完成测试用例的维护:
1. 使用外部测试数据文件,用Excel管理测试用例集、测试步骤,实现在一个文件中完成用例的维护;
2. 每个测试用例的结果可以再文件中查看;
3. 通过定义关键字、操作元素定位表达式、操作值来实现测试步骤;
4. 实现表达式和代码的分离,实现表达式在单一文件中进行维护;
5. 框架提供日志功能;
6. 基于关键字的框架使得测试人员不懂开发技术也可以实现自动化测试,便于在团队中推广和使用,降低门槛;
7. 可以进行任意的关键字扩展,可以满足更加复杂的自动化测试需求;
希望自动化越走越远,也祝正在学习自动化的同学能够更好的推进自动化发展。