硒超时不正确

时间:2018-01-02 21:46:26

标签: java selenium selenium-chromedriver

我有一个代码段,如下所示。在我列出之前,我想告诉你

waitForXPathVisibility(错误,秒,睡眠,单位,xpath);

基本相同
WebDriverWait wait = new WebDriverWait(driver, seconds * 1000, sleep * 1000);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(xpath)));

"错误"是超时时打印的错误消息。所以我有代码

    try {
        waitForXPathVisibility("applicationStatusTab", seconds, 10, TimeUnit.SECONDS, APP_STATUS_TAB_SELECTED_X);
    } catch (Throwable ex) {
        // There seems to be some sort of problem with it not waiting the full amount
        // or throwin an error when there is not, so check for that.
        System.out.println("Timout After: " + new Date() + " ... This may NOT be an actual error:");
        if (!isXPathDisplayed(APP_STATUS_TAB_SELECTED_X)) {
            throw ex;
        }
    }

我们告诉它使用的时间单位。我指定了几秒钟。

现在页面需要很长时间才能加载。没有尝试,页面可能会等待大约90秒左右,并抛出超时错误。我添加了捕获,现在它捕获它并且没有给出错误,因为xpath就在那里,即使它超时并且sait它不是:

WARNING: WebDriverException thrown by findElement(By.xpath: 
//div[@id='pt1:r1']//a[contains(@id,'disAcr') and 
contains(text(),'Application Status')  and contains(@class,'Selected') ])
org.openqa.selenium.TimeoutException: timeout

然而,isXPathDisplayed()成功。 (此方法基本上采用xpath,执行findElementsBy()并验证大小至少为一。

我想知道的是,由于页面需要很长时间才能显示,所以当查找操作时,它会在页面显示在Chrome之前找到该元素。 (之前我已经看到页面代码可用且准备就绪,但有时需要Chrome一段时间来更新显示内容。)

所以也许wait()中的find找到了元素并退出但由于页面还没有显示在终端上,否则其他人可能认为该元素不存在并抛出错误。

这有意义吗?您可以发出某种等待,等待Chrome显示屏与Selenium正在查看的代码相匹配吗?还是我在错误的树上吠叫?

顺便说一下,即使我发现错误,仍会显示堆栈回溯,但捕获成功并且程序继续。

哦,这是Eclipse和Selenium以及Chrome的Java。

1 个答案:

答案 0 :(得分:0)

您需要考虑以下因素:

  • 首先,功能 waitForXPathVisibility (error, seconds, sleep, unit, xpath); 对我来说是一个开销。基本上不需要在 WebDriverWait 之上编写单独的包装函数。
  • 正如您所说,代码中的 waitForXPathVisibility (error, seconds, sleep, unit, xpath); 功能与 WebDriverWait 相同。我们来看看 WebDriverWait

WebDriverWait

根据 WebDriverWait Selenium v3.8.1 的当前实施情况,构造函数如下:

  • WebDriverWait(WebDriver driver, Clock clock, Sleeper sleeper, long timeOutInSeconds, long sleepTimeOut)
  • <强> WebDriverWait(WebDriver driver, long timeOutInSeconds)

    WebDriverWait将忽略NotFoundExceptio条件中默认遇到的until n个实例。

  • <强> WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis)

    WebDriverWait将忽略NotFoundException条件下默认遇到的until个实例。

关于此问题

根据您的问题,我们非常不清楚为什么您需要像waitForXPathVisibility (error, seconds, sleep, unit, xpath);这样的函数:

  • error - until条件将始终忽略NotFoundException(错误)
  • seconds - long timeOutInSeconds本身可用。
  • sleep - long sleepInMillis可用。
  • xpath - 哪些可以传递给ExpectedConditions

正如您提到的page takes a long time to loadwait maybe 90 secondsWebDriverWait如果以这种方式配置,也不会抱怨。

现在,如果不查看代码或相关的HTML,就很难进一步分析。但有几点:

  • 您构建的xpath在逻辑上是正确的,但性能会很差。我们总能构建一个更好的xpath org.openqa.selenium.TimeoutException: timeout 例外可能会导致以下任何ExpectedConditions

    elementToBeClickable(By locator)
    elementToBeSelected(By locator) 
    elementSelectionStateToBe(By locator, boolean selected) 
    
  • 即使投掷 org.openqa.selenium.TimeoutException: timeout ,该元素也可以可见。因此 isXPathDisplayed()成功

解决方案

对于您的下一个操作帖子 WebDriverWait 没有任何可见性,一个简单的解决方案是:

  • wait time设置为 120秒
  • Polling设置为 1000毫秒
  • ExpectedConditions设置为 elementToBeClickable(按定位器)