5

我正在向某些输入字段发送一些键。当从这个元素中移除焦点时,如果我输入的这个值是有效的,一个 ajax 请求就会发送到服务器。如果是,则不会发生任何事情,如果不是,则会出现错误消息。有几个这样的字段。

当我说:

driver.findElementById(firstId).sendKeys(firstValue);
driver.findElementById(secondId).sendKeys(secondValue);

第二个值不会被发送到第二个元素,因为同时会有一个非常短的 ajax 请求。但由于该值是 ok (firstValue),它不会显示任何文本或其他任何内容。

我如何告诉 Selenium 等待这个 ajax 完成?我不想使用 Thread.sleep。

4

1 回答 1

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 类型的成功返回是 Boolean 返回 true 或所有其他 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.

我希望这会有所帮助。

于 2013-01-24T13:22:55.340 回答