Selenium中的几种等待方式,需特别注意implicitlyWait的用法
来源:互联网 发布:vs2015 php开发 编辑:程序博客网 时间:2024/05/17 23:43
Selenium中的几种等待方式,需特别注意implicitlyWait的用法
最近在项目过程中使用selenium 判断元素是否存在的时候 遇到一个很坑爹的问题, 用以下方法执行的时候每次都会等待很长一段时间,原因是因为对selenium实现方法了解不足导致一直找不到解决方法。
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
不明所以, 经过追踪源码才发现启动Driver的时候 使用driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 此处设置的等待时间 是针对全局设置的,webdriver中执行所有命令 的超时时间都设置为30秒了, 如上面的findElement方法,找不到元素会默认等待三十秒。 有些时候只需简单判断元素是否存在,立马执行,而此处的设置导致 脚本执行缓慢。 将Selenium中的等待时间贴出来给大家张张经验。
Selenium的延迟等待分为 显式等待(Explicit Wait) & 隐式等待(Implicit Wait).
1.显式等待
显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception.
如:
1
new
WebDriverWait(driver,
15
).until(
2
ExpectedConditions.presenceOfElementLocated(By.cssSelector(
"css locator"
))
3
);
这里,15是要等待的秒数.如果没有满足until()方法中的条件,就会始终在这里wait 15秒,依然找不到,就抛出异常.
也可以这样写:
01
WebDriver driver =
new
FirefoxDriver();
02
driver.get( www.baidu.com
);
03
WebElement e = (
new
WebDriverWait( driver,
10
)) .until(
04
new
ExpectedCondition< WebElement>(){
05
@Override
06
public
WebElement apply( WebDriver d) {
07
return
d.findElement( By.id(
"id locator"
));
08
}
09
}
10
);
这样就通过回调函数,直接获得了这个WebElement.也就是页面元素.
如果只是仅仅想判断页面是不是加载到某个地方了,就可以用第一种方法; 但如果需要得到某个WebElement,两种方式都可以,只是第一种方式还需要再多一步获取的操作.
1
Wait w =
new
Wait(){
2
@Override
3
public
boolean
until() {
4
return
webElement.isDisplayed();
5
}
6
};
另外这种等待的方式,在加载js代码的时候做判断会比较方便,反正我只在代码里这么见过,但是没用过,有兴趣的朋友可以研究一下.
2.隐式等待
1
driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS);
隐式等待, 此处的隐式等待是针对Driver 每次执行命令的 最长执行时间也可以理解为超时时间, 一些人对此处有误解,认为是让Driver等一段时间, 确实某些时候能让Driver等一段时间, 但是影响是全局的,每次Driver执行 找不到元素都会等待此处设置的时间, 假设某处将此值设置的太长,必须在执行完成之后还原回来,否则判断一个元素是否存在的时候,就会遇到很坑爹的问题。 改进后的方法如下:
WebDriver会进行一个隐式等待,但参数只有时间,这就导致我需要什么元素出现,我不一定能等到它,
private boolean isElementPresent(By by) {
try {
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
- Selenium中的几种等待方式,需特别注意implicitlyWait的用法
- Selenium中的几种等待方式,需特别注意implicitlyWait的用法
- Selenium中的几种等待方式,需特别注意implicitlyWait的用法
- Selenium中的几种等待方式,需特别注意implicitlyWait的用法
- Selenium中的几种等待方式,需特别注意implicitlyWait的用法
- Selenium中的几种等待方式,需特别注意implicitlyWait的用法
- Selenium中的几种等待方式,需特别注意implicitlyWait的用法
- Selenium中的几种等待方式,需特别注意implicitlyWait的
- Selenium中的几种等待方式,需特别注意implicitlyWait的
- selenium 延迟等待的三种方式
- selenium的三种等待方式
- Selenium显性等待的方式
- Python selenium —— 一定要会用selenium的等待,三种等待方式解读
- Python selenium —— 一定要会用selenium的等待,三种等待方式解读
- Python selenium —— 一定要会用selenium的等待,三种等待方式解
- Python selenium中一定要会用selenium等待的三种等待方式解读
- myBatis中的语句映射几种特别方式
- 线程等待的几种方式
- jquery获取复选框被选中的值
- 有关僵尸进程
- 缺失值NA的影响
- Linux-Shell脚本编程-学习-8-函数
- easyui ——正则验证手机号码例子
- Selenium中的几种等待方式,需特别注意implicitlyWait的用法
- Generate settings
- 如何制作透明窗口
- C语言在MAC的Terminal 里面运行方法
- 如何在几何画板中用线段标记三角形的边
- codeblocks 使用汇总
- 使用VMware克隆功能的一个网络配置问题
- Mybatis的配置Mapper方法
- 前端面试题