【问题标题】:Selenium script fails due to AJAX loaderSelenium 脚本由于 AJAX 加载程序而失败
【发布时间】:2016-06-21 12:05:53
【问题描述】:

我正在尝试自动化具有 AJAX 加载程序的应用程序。当我尝试单击元素并装载机当时处于活动状态。该元素不可访问。

我已经为 click() 创建了一个包装器方法,它确保 AJAX 完成并且可以单击元素。

我尝试了 jQuery.active === 0。但是,在那之后,由于加载程序,它也失败了。

所以,我在包装方法中使用了 isElementPresent 作为加载器。但是,这需要花费大量时间。 isElementPresent 需要 6-8 秒。我为加载器尝试了 className、cssSelector。但是,没有运气。

下面是我的代码:

 public void WaitForAjax() throws InterruptedException {

    while (true) {

        Boolean ajaxIsComplete = (Boolean) ((JavascriptExecutor) driver)
                .executeScript("return (document.readyState == 'complete') && (jQuery.active === 0);");
        if (ajaxIsComplete) {
            if (isElementPresent(By.className("z-loading-indicator"))) {
                continue;
            } else {
                break;
            }
        }
        Thread.sleep(100);
    }
}


   public void clickElement(WebElement element) throws InterruptedException {
    WaitForAjax();
    Thread.sleep(500);
    waitForElementVisible(element);
    waitForElementClickable(element);
    element.click();
   }

请帮忙!

【问题讨论】:

  • 你应该尝试ExpectedConditions.invisibilityOfElementLocated 而不是所有这些..
  • 当你说“引发错误”时,说出错误是什么总是有用的。
  • @apokryfos:更新了问题。
  • @SaurabhGaur:已经试过了。点击也需要6-8秒。 :(
  • 您真的不想将所有这些等待链接在一起,而且绝对不是每次点击。这很可能是你所有时间都被浪费的地方。我会避免像 clickElement() 这样的过于通用的函数。 WaitForAjax() 显然不起作用,或者您不需要所有其他等待。我建议您找到指示 AJAX 部分已完成的元素状态。等待它出现,然后你就知道 AJAX 已经完成了。例如,一个元素出现或消失等。

标签: javascript java jquery ajax selenium-webdriver


【解决方案1】:

@Bhargav 使用 xpath 或任何其他 seleniumBy 方法尝试以下代码。

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath('xpath of the loader...')));

希望这会有所帮助。

【讨论】:

  • 这可能是做你想做的事情的最佳方式。长时间的延迟可能是由于您在 click 元素中的所有堆叠等待,或者可能是由于隐式和显式等待的混合。请参阅上面的我的 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多