关于selenium的智能等待页面加载的问题
我们经常会碰到用selenium操作页面上某个元素的时候,需要等待页面加载完成后,才能操作, 否则页面上的元素不存在,会抛出异常。
或者碰到AJAX异步加载,我们需要等待元素加载完成后,才能操作。
首先来讲,我们最不推荐的就是使用 Thread.sleep( ) ; 这个也叫做线程休眠。
这种写法通常是固定了一个时间,然而我们不知道页面具体的等待情况,有快有慢,虽然很百搭,但是并不适用于框架中。
selenium 中提供了非常简单,智能的方法,来判断元素是否存在。我来简单的举例说明几种(在我使用的过程中,我会逐步添加到这里)
阅读目录(ctrl+F,根据自己所需来搜索查看吧):
- 实例要求
- 隐式等待
- 显式等待
实例要求
实例:set_timeout.html
下面的html 代码, 实现的是点击click 按钮5秒后, 页面上会出现一个红色的div快, 我们需要写一段自动化脚本智能的去判断这个div是否存在, 然后把这个div高亮。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<title>Set Timeout</title>
<style>
.red_box {background-color: red; width:20%; height: 100px; border: none;}
</style>
<script>
function show_div(){
setTimeout("create_div()", 5000);
} function create_div(){
d = document.createElement('div');
d.className = "red_box";
document.body.appendChild(d);
}
</script>
</head>
<body>
<button id = "b" onclick = "show_div()">click</button>
</body>
</html>
隐式等待
通常,我们会这么写
WebDriver driver = new FirefoxDriver();
driver.get("file:///C:/Users/Tank/Desktop/set_timeout.html"); driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
WebElement element = driver.findElement(By.cssSelector(".red_box"));
((JavascriptExecutor)driver).executeScript("arguments[0].style.border = \"5px solid yellow\"",element);
其中
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
意思是, 总共等待10秒, 如果10秒后,元素还不存在,就会抛出异常 org.openqa.selenium.NoSuchElementException。
换句话说,当元素没有立即出现,隐式等待将等待一段时间再查找。
一旦设置了隐式等待,则会存在整个WebDriver对象实例的声明周期中,它将寻找每个元素的时候都进行等待,增加整个测试执行的时间。
即针对全局设置的,webdriver中执行所有命令的超时时间都设置为10秒了。
显式等待
显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间或条件之内都没找到,那么就跳出Exception.
一般使用ExpectedConditions类中自带方法,点击查看API页
显式等待可以自定义等待的条件,用于更加复杂的页面等待条件
|
等待的条件 |
WebDriver方法 |
|
页面元素是否在页面上可用和可被单击 |
elementToBeClickable(By locator) |
|
页面元素处于被选中状态 |
elementToBeSelected(WebElement element) |
|
页面元素在页面中存在 |
presenceOfElementLocated(By locator) |
|
在页面元素中是否包含特定的文本 |
textToBePresentInElement(By locator) |
|
页面元素值 |
textToBePresentInElementValue(By locator, java.lang.String text) |
|
标题 (title) |
titleContains(java.lang.String title) |
只有满足显式等待的条件满足,测试代码才会继续向后执行后续的测试逻辑
如果超过设定的最大显式等待时间阈值, 测试程序会抛出异常。
public static void testWait2(WebDriver driver) {
driver.get("file:///C:/Users/Ice/Desktop/set_timeout.html");
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".red_box")));
WebElement element = driver.findElement(By.cssSelector(".red_box"));
((JavascriptExecutor) driver).executeScript("arguments[0].style.border = \"5px solid yellow\"", element);
}
以上就是对Java selenium 等待页面加载的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!
关于selenium的智能等待页面加载的问题的更多相关文章
- java selenium (十三) 智能等待页面加载完成
我们经常会碰到用selenium操作页面上某个元素的时候, 需要等待页面加载完成后, 才能操作. 否则页面上的元素不存在,会抛出异常. 或者碰到AJAX异步加载,我们需要等待元素加载完成后, 才能操 ...
- Java Selenium (十二) 操作弹出窗口 & 智能等待页面加载完成 & 处理 Iframe 中的元素
一.操作弹出窗口 原理 在代码里, 通过 Set<String> allWindowsId = driver.getWindowHandles(); 来获取到所有弹出浏览器的句柄, 然 ...
- selenium 等待页面加载完成
一.隐形加载等待: file:///C:/Users/leixiaoj/Desktop/test.html 该页面负责创建一个div <html> <head> <tit ...
- selenium+python登录登出百度,等待页面加载,鼠标定位
#coding:gbk from selenium import webdriver from selenium.webdriver.common.keys import Keys from sele ...
- selenium等待页面加载完成
https://blog.csdn.net/hu_zhenghui/article/details/77429505 38行 这种方法 不准确 还在空白页时候 就会 返回 comp ...
- Selenium_等待页面加载完毕
隐式等待 WebDriver driver = new FirefoxDriver(); driver.get("www.baidu.com"); driver.manage(). ...
- 一个等待页面加载完毕的loading动画
1 html 部分 <!DOCTYPE html><html><head><meta http-equiv="Content-Type" ...
- [转载]Python & Selenium -- 页面加载时间过长&启动指定FF
原文链接:https://my.oschina.net/u/2344787/blog/400507?p={{page}} 1. selenium webdriver在get方法会一直等待页面加载完毕才 ...
- Selenium 页面加载慢
Selenium 页面加载慢 问题描述: 使用Selenium获取网页,发现webdriver.get方法会阻塞直到网页全部加载完成,官方提供的三种wait方法仅对网页的ajax有比较明显的效果.对于 ...
随机推荐
- 内置函数 sorted
内置函数 sorted 语法: sorted(iterable,key = None,reverse= false)iterable: 可迭代的对象key:排序规则(排序函数),在sorted内部将& ...
- Basestation函数解析(一)
---恢复内容开始--- 1._tmain _tmain()是微软操作系统(windows)提供的对unicode字符集和ANSI字符集进行自动转换用的程序入口点函数. 首先,这个_tmain() ...
- python中pandas里面的dataframe数据的筛选小结
pandas大家用的都很多,像我这种用的不够熟练,也不够多的就只能做做笔记,尽量留下点东西吧. 筛选行: a. 按照列的条件筛选 df = pandas.DataFrame(...) # suppos ...
- hadoop学习;hdfs操作;执行抛出权限异常: Permission denied;api查看源代码方法;源代码不停的向里循环;抽象类通过debug查找源代码
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010026901/article/details/26587251 eclipse快捷键alt+s ...
- Golang - 数据库操作
1. 下载安装包 go get github.com/Go-SQL-Driver/MySQL go install github.com/Go-SQL-Driver/MySQL 2. 连接池 This ...
- Ansible--01
一.ansible是什么: 类似puppet之类的运维自动化工具 二.为什么选择ansible: 1. ansible是python语言开发的,python语言进入门槛低,方便基于pytnon对ans ...
- iPhone X进入DFU模式
下面把iphoneX进dfu模式的方法分享给大家.在开机状态下,按一下音量加键后松开,然后按一下音量减键后松开,接着按住电源键,屏幕完全熄灭后,松开电源键,接着同时按住电源键和音量减,保持5秒左右,再 ...
- HDU 3577Fast Arrangement(线段树模板之区间增减更新 区间求和查询)
Fast Arrangement Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- docker - kubernetes 网络(转)+ 架构图
1.host网络 连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样.可以通过--network=host指定使用 host 网络.docker ...
- iPhone将NSString转换编码集为gb2312或者gbk的方法
很多时候软件读取的中文网页编码集是gb2312,所以显示出来的是乱码.这时需要将NSString文字编码转换.你可以试试以下代码 NSURL *url = [NSURL URLWithString:u ...