目录
🌴等待
🚩强制等待
🚩隐式等待
🚩显示等待
🌳浏览器导航
🌲弹窗
🚩警告弹窗+确认弹窗
🚩提示弹窗
🎄上传文件
🍀浏览器参数设置
🚩设置无头模式
🚩设置浏览器加载策略
🌴等待
首先由以下代码:百度搜索迪丽热巴后,在点击百度百科,使用选择器
执行结果:发现报错了,而且是说没有找到这个元素
那么这个元素不存在吗?我们查看一下 ,发现这个元素是真实存在的。
使用xpath:
执行结果:还是没有找到
注意:复制过来的选择器或者xpath,粘贴之后不能修改!
NoSuchElementException异常:
如果避免因为渲染过慢出现的自动化误报的问题呢?可以使用selenium中提供的三种等待方法:
🚩强制等待
Thread.sleep()
代码:
执行结果:正常退出
使用xpath是一样的,这里不在过多演示。
该方法就是死等,()中的参数单位为毫秒,必须等到该时间之后才开始执行代码,也就是阻塞程序的方式来等待。
- 优点:写法简单,好理解,直接阻塞程序执行
- 缺点:极大的增加了自动化的执行时间
🚩隐式等待
隐式等待是一种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则不再等待,代码继续执行,直到超时没找到元素才会报错。
implicitlyWait() 参数:Duration类中提供的毫秒、秒、分钟等方法
代码:隐式等待3s,表示使用隐式等待去查找元素,若元素在1s的时候查找到了,则不在继续等待,如何等待的呢?在3s之内,会轮询的查找元素。
源码:
执行结果:
隐式等待作用域是整个脚本的所有元素。即只要driver对象没有被释放掉(driver.quit()),隐式等待就一直生效。
例如上述代码,在隐式等待这行代码执行完成后,执行了点击"百度百科"操作,我们再清空迪丽热巴之后,再次搜索邓紫棋,且获取"邓紫棋"文本。
代码:
执行结果:要获取的是邓紫棋,然后返回的迪丽热巴
我们分别去查看"迪丽热巴"文本标签和"邓紫棋"文本标签,发现两个标签是一样的,也就是程序执行的速度太快了,隐式等待的作用只是看一下元素是否存在,而不是元素对不对,所以上述代码的隐式等待只会查找你的输入框,按钮,文本是否存在,对于点击,清空,输入不会管,当查找到"邓紫棋"文本标签时,"邓紫棋"还没有输入呢,这当然能找到,但是迪丽热巴的名字。
如何解决?在查找邓紫棋关键词之前强制等待3s,在这3s里claer,sendkeys都能执行完成。
- 优点:智能等待,作用于全局
- 缺点:只能查找元素,每次查找元素都要等待
🚩显示等待
显示等待也是一种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码
这里面有两个参数,第一个是驱动对象,第二个参数是要设置指定的超时时间,until是需要满足一个什么样的条件,是一个表达式。
$express:涉及到selenium.support.ui.ExpectedConditions包下的ExpectedConditions类
返回值:boolean
ExpectedConditions预定义方法的一些示例:
- elementToBeClickable(By locator)‒用于检查元素是否可以点击,以便你可以单击它。是一个By类
- textToBe (Bylocator, String str)-检查元素是否复合预期(精确匹配)。
- presenceOfElementLocated(Bylocator)‒检查页面的元素是否存在。
- urlToBe(java.lang.String url)‒检查当前页面的URL是一个特定的URL。
代码:检查元素是否可以点击
执行结果:
- 优点:显示等待是智能等待,可以自定义显示等待的条件,操作灵活
- 缺点:写法复杂,只能作用在当前条件上
代码:检查元素是否复合预期(查找百度首先"新闻"文本)
执行结果:匹配成功
隐式等待和显示等待一起使用效果如何呢?
代码:
执行结果:
结果:重试多次,最终打印的等待时间有10s、11s....
结论:注意混合隐式和显式等待,可能会导致不可预测的等待时间。
🌳浏览器导航
常见操作:
1)打开网站
driver.navigate().to("https://baidu.com/");
driver.get("https://baidu.com/");
2)浏览器前进,后退,刷新
driver.navigate().back(); =>前进
driver.navigate().forward(); =>后退
driver.navigate().refresh(); =>刷新
🌲弹窗
弹窗是在页面是找不到任何元素的,这种情况怎么处理?使用selenium提供的Alert接口
🚩警告弹窗+确认弹窗
我们在网页上,点击了某个元素就会触发弹窗,然后再通过点击确认来关闭弹窗,若想通过页面元素的定位这个确认按钮,关闭这个弹窗,此时这个弹窗是无法定位的。
在selenium处理弹窗的方式:
由于driver是作用于网页上,不能作用于driver,所以先要切换弹窗
🚩提示弹窗
若有弹窗未处理会报一个异常,无法继续执行页面元素相关操作
处理弹窗:
🎄上传文件
点击文件上传的场景下会弹窗系统窗口,进行文件的选择。 selenium无法识别非web的控件,上传文件窗口为系统自带的,无法识别窗口元素,但是可以使用sendkeys来上传指定路径的文件,达到的效果是一样的。
代码:
执行结果:
🍀浏览器参数设置
🚩设置无头模式
简单来说,设置成无头模式,表示自动化程序在后台执行,不会打开浏览器页面,实际上是执行了的,只不过在当前电脑界面上看不到效果。上述我们所执行的代码,都是能看到浏览器页面的,当我们增加无头模式后,就看不到了
代码:
在工作中,运行自动化不会人工一直盯着自动化的执行效果,一般都是设置无头模式,通过自动化执行的结果来分析。
🚩设置浏览器加载策略
在有的情况下,可能会发现自己手动打开的网页加载非常快,但是通过自动化脚本代码打开的网页加载很慢,慢到等待都报错了。
增加浏览器的加载模式:有三种
代码: