您的位置:首页 > 其它

Selenium的延迟等待

2013-07-11 10:29 330 查看
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(
http:
//somedomain/url_that_delays_loading);
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);
WebDriver会进行一个隐式等待,但参数只有时间,这就导致我需要什么元素出现,我不一定能等到它,只是让driver延迟一段时间再继续而已. 不过我们也可以把它小小的封装一下,变废为宝:

1
public
boolean
isByElementDisplayed(By
by,
int
time)
{
2
boolean
status
=
false
;
3
if
(driver.findElement(by).isDisplayed()
==
false
)
{
4
driver.manage().timeouts().implicitlyWait(time,
TimeUnit.SECONDS);
5
}
else
{
6
status
=
true
;
7
}
8
return
status;
9
}
得不到某个元素,我们就延迟一下...

最后还有一个最低效的做法:

1
Thread.sleep()
额,不建议使用.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: