我正在使用Selenium2(2.0-b3)网络驱动程序 我想等待一个元素出现在页面上。我可以像下面这样写,它工作正常。
但我不想把这些块放在每一页上。
// Wait for search to complete
wait.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver webDriver) {
System.out.println("Searching ...");
return webDriver.findElement(By.id("resultStats")) != null;
}
});
我想将它转换为一个函数,我可以传递elementid并且函数等待指定的时间,并根据元素的查找返回我的错误。
public static boolean waitForElementPresent(WebDriver driver,String elementId,int noOfSecToWait){
}
我正在阅读等待不会返回,直到页面加载等,但我想写上面的方法,以便我可以点击链接到页面并调用waitForElementPresent方法等待下一页中的元素,然后我做任何事情与页面。
请你帮我写一下这个方法,因为我不知道怎么重构上面的方法才能传递参数。
由于 麦克
答案 0 :(得分:3)
这就是我在C#中的表现(每250毫秒检查元素是否出现):
private bool WaitForElementPresent(By by, int waitInSeconds)
{
var wait = waitInSeconds * 1000;
var y = (wait/250);
var sw = new Stopwatch();
sw.Start();
for (var x = 0; x < y; x++)
{
if (sw.ElapsedMilliseconds > wait)
return false;
var elements = driver.FindElements(by);
if (elements != null && elements.count > 0)
return true;
Thread.Sleep(250);
}
return false;
}
像这样调用函数:
bool found = WaitForElementPresent(By.Id("resultStats"), 5); //Waits 5 seconds
这有帮助吗?
答案 1 :(得分:2)
您可以这样做,新增一个类并添加以下方法:
public WebElement wait4IdPresent(WebDriver driver,final String elementId, int timeOutInSeconds){
WebElement we=null;
try{
WebDriverWait wdw=new WebDriverWait(driver, timeOutInSeconds);
if((we=wdw.until(new ExpectedCondition<WebElement>(){
/* (non-Javadoc)
* @see com.google.common.base.Function#apply(java.lang.Object)
*/
@Override
public WebElement apply(WebDriver d) {
// TODO Auto-generated method stub
return d.findElement(By.id(elementId));
}
}))!=null){
//Do something;
}
}catch(Exception e){
//Do something;
}
return we;
}
不要尝试实现接口ExpectedCondition&lt;&gt;,这是一个坏主意。我之前遇到了一些问题。 :)
答案 2 :(得分:0)
来自here:
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.id("myDynamicElement"));
}});