使用带有FirefoxDriver的Selenium 2.0b3 Java API按钮时出现问题。单击该按钮会将表单发送到Web服务器,然后由于表单提交,浏览器将转到新页面。
当使用element.click()单击元素时,selenium正在等待浏览器完成其操作。浏览器等待页面加载完成。但是,由于某些广告请求,有时页面加载会花费大量时间。
如何解决element.click()与页面加载之间的同步问题?
修改
中所述单击此元素。如果这导致了 要加载的新页面,此方法将 阻止页面加载。
由于
答案 0 :(得分:2)
仅针对firefoxdriver wiki页面http://code.google.com/p/selenium/wiki/FirefoxDriver的最后一部分中列出的Firefox试用测试版功能
你需要至少2.9版本,我建议使用最新的2.18(2.0b3现在差不多一年了!)
答案 1 :(得分:1)
driver.get()实际上应该阻止,直到页面加载完毕。但是,有时它不会在主HTML加载后继续加载JavaScript。在这种情况下,您有时会遇到单击尚未出现的元素的问题。您可以使用WebDriverWait()等待元素出现,或者使用以下内容增加隐式等待时间:
driver.manage().timeouts().implicitlyWait(X, TimeUnit.SECONDS);
以下是使用WebDriverWait的等价物:
public void waitAndClick(WebDriver driver, By by) {
WebDriverWait wait = new WebDriverWait(driver, 10000);
Function<WebDriver, Boolean> waitForElement = new waitForElement(by);
wait.until(waitForElement);
Actions builder = new Actions(driver);
builder.click(driver.findElement(by)).perform();
}
和waitForElement类:
public class waitForElement implements Function<WebDriver, Boolean> {
private final By by;
private String text = null;
public waitForElement(By by) {
this.by = by;
}
public waitForElement(By by, String text) {
this.by = by;
this.text = text;
}
@Override
public Boolean apply(WebDriver from) {
if (this.text != null) {
for (WebElement e : from.findElements(this.by)) {
if (e.getText().equals(this.text)) {
return Boolean.TRUE;
}
}
return Boolean.FALSE;
} else {
try {
from.findElement(this.by);
} catch (Exception e) {
return Boolean.FALSE;
}
return Boolean.TRUE;
}
}
}
答案 2 :(得分:0)
这是完全未经测试的,但我想我会把它丢给你。我想也许你可以通过构建自定义动作来解决它。
protected static void maybeAsyncClick(WebElement element, WebDriver driver)
{
Actions builder = new Actions(driver);
Action newClick = builder.moveToElement(element)
.click()
.build();
newClick.perform();
}