我正在使用selenium框架,我正在检查完成三个标题标签的加载,其中id为head1,head2,head3。我要等待的总等待时间,以确保所有三个标题标签的加载是12秒。三个标题标签的加载可以在任何时间发生1,2,3,4 ......秒。
现在我想每隔2秒进行一次定期检查,直到12秒,检查是否所有三个标题标签都已加载,这样我就可以跳转到代码的其他部分了。我尝试了很少的代码,但无法确定符合我要求的确切代码。
以下代码包含等待标题标记加载,每隔2秒检查一次h1标记,直到12秒。
Selenium Code
WebDriver driver = new FirefoxDriver();
driver.get("http://URL.com/Sample.jsp");
driver.manage().window().maximize();
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(12, TimeUnit.SECONDS)
.pollingEvery(2, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("h1")));
if((driver.findElement(By.id("h1")).getText()).length() >0)
System.out.println("Element Loaded");
else
System.out.println("Element yet to be Loaded");
Html代码
<script type="text/javascript">
myFunction();
function myFunction()
{
setTimeout(function(){populateDiv1();},3000);
setTimeout(function(){populateDiv2();},6000);
setTimeout(function(){populateDiv3();},9000);
}
function populateDiv1()
{
document.getElementById('div1').innerHTML = "<h1 id='head1'>Div1 Loaded</h1>";
}
function populateDiv2()
{
document.getElementById('div2').innerHTML = "<h1 id='head2'>Div2 Loaded</h1>";
}
function populateDiv3()
{
document.getElementById('div3').innerHTML = "<h1 id='head3'>Div3 Loaded</h1>";
}
</script>
</head>
<body>
<div id="div1">
</div>
<div id="div2">
</div>
<div id="div3">
</div>
</body>
答案 0 :(得分:3)
好的,花了我一段时间才找到解决方案,但我觉得这个应该适合您的情况
ExpectedCondition e = new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
return driver.findElements(By.cssSelector("div[id*='div']")).size() >= 2;
}
};
WebDriverWait wait = new FluentWait<WebDriver>(driver)
.withTimeout(12, TimeUnit.SECONDS)
.pollingEvery(2, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
wait.until(e);
您当然可以将条件设置为您想要的任何内容,例如单独查找每个元素,您只需要返回boolean
。这是您可以创建自己的ExpectedConditions
以自定义Seleniums行为的方法。