【问题标题】:Selenium Ajax wait if Ajax returns no elements?如果 Ajax 不返回任何元素,Selenium Ajax 会等待吗?
【发布时间】:2013-01-24 09:53:34
【问题描述】:

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

当我说:

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

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

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

【问题讨论】:

  • 你可以使用 selenium 隐式等待和显式等待。
  • @Manigandan 什么是隐式等待和显式等待?

标签: java ajax selenium


【解决方案1】:

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 对所有其他 ExpectedCondition 类型返回 true 或非 null 返回值。

您可以根据应用程序的需要使用 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.

我希望这会有所帮助。

【讨论】:

  • 谢谢。所以我要等一段时间?因为在我的情况下 AJAX 不会使任何元素可见或不可见..
猜你喜欢
  • 2011-11-15
  • 1970-01-01
  • 2017-08-14
  • 2013-04-01
  • 2013-11-24
  • 2018-04-21
  • 2017-06-02
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多