Selenium WebDriver显式等待间歇性地不起作用

时间:2018-01-17 10:12:49

标签: selenium selenium-webdriver webdriver

大家好日子,

我需要你帮助这个方法。我有一个网页,当页面加载时会有一个加载屏幕用户界面,我在点击按钮之前等待它完成。

这是我的代码:

@Step("Go to Audit Inquiry Screen")
public void launchAuditInquiry(){
    WebDriver webDriver = Driver.webDriver;
    WebDriverWait wait = new WebDriverWait(webDriver, 10);

    wait.until(ExpectedConditions.invisibilityOfElementLocated(By.className("loading-container")));

    WebElement auditInquiryBtn = webDriver.findElement(By.linkText("Audit Inquiry"));
    auditInquiryBtn.click();
}

我的问题有时候,这段代码运行正常。在单击按钮之前,它将等待加载ui div不可见。但有时它会产生这个错误:

Error Message: org.openqa.selenium.WebDriverException: unknown error: Element <a class="module-item" href="/audit/inquiry">...</a> is not clickable at point (822, 436). Other element would receive the click: <div class="loading-container" style="display: flex; opacity: 0.899842;">...</div>

我尝试添加另一个显式等待,然后单击按钮以确保,如下所示:

    wait.until(ExpectedConditions.invisibilityOfElementLocated(By.className("loading-container")));

    WebElement auditInquiryBtn = webDriver.findElement(By.linkText("Audit Inquiry"));
    wait.until(ExpectedConditions.elementToBeClickable(By.linkText("Audit Inquiry")));
    auditInquiryBtn.click();

但它有时会产生同样的错误,有时它会正常工作。

我对如何解决问题感到困惑。

2 个答案:

答案 0 :(得分:0)

首先要尝试的是删除 invisibilityOfElementLocated 等待,然后使用 elementToBeClickable 。我从未真正相信Selenium所考虑过的东西&#34;可见&#34;和&#34;隐形&#34;。

我过去遇到的问题是点击的元素完全不在屏幕上,因此Selenium会自动滚动,直到在视口中进行考虑。但由于浮动的页脚,它没有足够的滚动,仍然在页脚后面,所以无法点击。它仍然被认为是#34;可见&#34;因为它在视口中。

但是,如果您确定,可以尝试强制点击坐标而不是元素。

new Actions(driver).moveToElement(auditInquiryBtn).click().perform();

答案 1 :(得分:0)

感谢大家的评论,尤其是:Selenium Web Driver & Java. Element is not clickable at point (36, 72). Other element would receive the click

这很有帮助,但有些项目,我已经尝试过,但效果不佳。我检查过的部分是那里的一个项目,这里也有一个评论强制点击:

new Actions(driver).moveToElement(auditInquiryBtn).click().perform();

但是我对此有了第二个想法,因为,当加载容器div仍然覆盖页面时,可能会发生这样的情况,然后我强制点击提交按钮,它还会产生另一个加载容器div,并且如果有两个装载容器div,我不确定会发生什么。

现在,我的解决方法是调整等待函数的睡眠定时器:

WebDriverWait wait = new WebDriverWait(webDriver, 10, 2500L);

它现在有效,因为它在第一次等待检查之前给出了加载器div时间。加载器渲染500毫秒有点快。我还在测试这个,但如果它不起作用,我可能会做上面的解决方案。

再次感谢。