1、web自动化selenium测试的过程中,浏览器和driver的匹配至关重要。
如果在浏览器启动时就报一些看不懂的异常,多半是driver和浏览器版本不匹配,这时,先确认和更换driver版本。
2、访问的页面过慢怎么办?
因为driver打开的浏览器不会使用自己本地的用户设置和缓存。
解决方案:让driver调用自己的本地用户文件。
1、找到自己的用户文件存放位置:通过在浏览器地址栏输入chrome://version/进行查看
2、在代码中通过options添加
3、在启动chromedriver时,带上options设置。
注意:使用用户文件时,记得关闭已经打开的chrome浏览器,否则文件会冲突。
3、web自动化最核心的操作:元素定位
定位的进阶方法:手写xpath。
//a[text()='笔记本']
//表示从html文档中的任意层级开始进行查找
a是元素的名称(类型)
[属性='属性值']
1、针对于元素标签之间的文本内容,属性是[text()='文本内容']
2、针对于元素开始标签中的属性,属性写法是:[@属性='属性值']
通过按下F12或者在元素上右键选择检查元素打开开发者工具,使用chrome开发者工具两个定位验证辅助功能,确认元素表达式绝对正确,减少代码出错时排查的错误选项:
1、ctrl+f 打开搜索栏,在搜索栏中逐步输入自己的手写表达式,帮助完成编写
2、console控制台中的$x("xpath表达式")方法,验证表达式是否能够正确定位以及元素是否能够响应你想要的操作。
4、element not interactable 以及 nosuch element报错是大家在web自动化过程当中经常会碰到的异常。
解决方案:
笔记本元素无法点击的原因:元素需要前置将鼠标移动到电脑配件。
nosuch element:
1、当出现新窗口时,需要指定selenium进行跳转:
selenium当中通过句柄来唯一确定一个窗口:
Set<String> handleSet= driver.getWindowHandles();
System.out.println(handleSet);
//用一个变量来记录目标句柄
String targetHandle="";
//循环遍历当前的句柄,找出谁是我想要的句柄
for(String handle:handleSet) {
//切换到句柄对应的窗口并且获取它的标题
String title= driver.switchTo().window(handle).getTitle();
//判断一下当前窗口标题是否是我想要的
if(title.equals("商品列表")) {
targetHandle=handle;
}
}
//切换到我想要的句柄
driver.switchTo().window(targetHandle);
2、页面中存在iframe时,需要进行切换。
iframe切换时使用driver.switchTo().frame(arg0)
可以用iframe的id或者name属性,iframe元素本身。
5、在运行过程中为了避免由于脚本执行过快,浏览器刷新跟不上的情况,加上等待条件。
最好的方案:直接加上隐式等待,全局设置在定位元素时,等待元素加载完成,只需要加一次。
推荐在浏览器drvier实例化完成之后立即加上,在整个浏览器操作过程中全局生效.
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
6、如果需要对页面进行js调试,或者在代码中执行js脚本,那么,首先在开发者工具console当中验证
比如:window.scrollto进行浏览器滚动条滑动
然后在脚本中执行js语句。
7、如果需要在脚本执行过程中等待某个特定事件的发生,可以使用显式等待来指定事件和等待时间。一般来说用一个隐式等待能够完成需求。