我正在向某些输入字段发送一些密钥。当焦点从此元素中删除时,如果我输入的值有效,则会向服务器发送ajax请求。 如果是,则没有任何反应,如果没有出现错误消息。 有几个这样的领域。
当我说:
driver.findElementById(firstId).sendKeys(firstValue);
driver.findElementById(secondId).sendKeys(secondValue);
第二个值不会被发送到第二个元素,因为同时会有非常短的ajax请求。但由于值正常(firstValue),它不会显示任何文本或其他任何内容。
我如何告诉Selenium等待这个ajax完成?我不想使用Thread.sleep。
答案 0 :(得分:7)
Selenium不会等待AJAX加载。它会自动等待页面加载。要等待AJAX类型加载,您必须使用隐式和显式等待。
您可以使用隐式等待和显式等待等待特定的Web元素,直到它出现在页面中。您可以定义的等待时间取决于应用程序。
明确等待
显式等待是您定义的代码,用于在进一步执行代码之前等待某个条件发生。如果达到的条件将终止等待并继续进一步的步骤。
<强>代码:强>
WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(strEdit)));
或者
WebElement myDynamicElement = (new WebDriverWait(driver, 30))
.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.id("myDynamicElement"));
}});
在抛出TimeoutException之前等待最多30秒,或者如果它发现元素将在0-30秒内返回它。默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到它成功返回。成功返回的是ExpectedCondition类型是布尔返回true或非null返回值,用于所有其他ExpectedCondition类型。
您可以根据需要使用ExpectedConditions类。
隐含等待
隐式等待是告诉WebDriver在尝试查找一个或多个元素时,如果它们不能立即可用,则会在一定时间内轮询DOM
<强>代码:强>
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
要记住的一件事是,一旦设置了隐式等待 - 它将保留WebDriver对象实例的生命周期
有关详细信息,请使用此链接http://seleniumhq.org/docs/04_webdriver_advanced.jsp
You can use these waits during your AJAX loading.
我希望这会有所帮助。