selenium隐式和显式等待,找不到超时异常元素

时间:2017-12-06 11:53:31

标签: java selenium-webdriver

我是selenium的新手(但是经验丰富的java开发人员)。

我正在使用以下内容:

WebElement searchBasket = pDriver.findElement(By.xpath("//a[contains(.,'Search&Baskets')]"));
WebElement searchproduct = pDriver.findElement(By.xpath("//a[contains(.,'Search a product')]"));

//if search an agreement is not show up, then click on other menu, then click it back
pWait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'Search&Baskets')]")));
pDriver.findElement(By.xpath("//a[contains(.,'Search&Baskets')]")).click();

// click on search an agreement
try {
    pWait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'Search&Baskets')]")));
    action = new Actions(pDriver);
    action.moveToElement(searchBasket).build().perform();

    pWait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'Search a product')]")));
    searchproduct.click();
} catch (TimeoutException e) {
}

其中pWait是:

WebDriverWait wait = new WebDriverWait(driver, 15);

然而,当我运行测试用例时,我得到以下错误:

Unable to locate element: {"method":"xpath","selector":"//a[contains(.,'Search&Baskets')]"}
Command duration or timeout: 4 milliseconds

我认为它应该至少等待15秒才会抛出此异常。从上面的日志看起来它只在4ms内抛出异常。 我可以在控制台上看到,一旦它击中该行,它就会抛出异常。

我将隐式等待设置为0并使用显式等待。

我在这里遗漏了什么。

另外,在显式和隐式等待中,是时间还是确切的那么多时间, 例如,如果我将隐式等待设置为10秒,则意味着等待10秒或等待10秒(如果找到元素然后继续,即使元素founf在第6秒)

对于明确的等待也是如此?

请帮忙

2 个答案:

答案 0 :(得分:1)

让我们分析代码中发生的事情。

我们已定义了两个WebElements searchBasket searchproduct ,如下所示:

WebElement searchBasket = pDriver.findElement(By.xpath("//a[contains(.,'Search&Baskets')]"));
WebElement searchproduct = pDriver.findElement(By.xpath("//a[contains(.,'Search a product')]"));

我们没有立即尝试在我们的代码中使用这些Web元素,因此无影响

接下来,我们尝试了 WebDriverWait WebElement,如下所示:

pWait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'Search&Baskets')]")));

我们再次没有捕获结果的return type,因此无影响

现在,在try{}块内,我们再次尝试 WebDriverWait

pWait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'Search&Baskets')]")));

但我们再次捕获/采取了return type的结果。这就是为什么我们这样做的原因:

action.moveToElement(searchBasket).build().perform();

searchBasket 引用我们之前存储的WebElement

WebElement searchBasket = pDriver.findElement(By.xpath("//a[contains(.,'Search&Baskets')]"));

由于第一个搜索结果(没有 WebDriverWait )可能根本没有返回任何WebElement并返回 Null

最后,错误的最重要因素无法找到元素:{"方法":" xpath","选择器":&# 34; // a [包含(。,'搜索& Baskets')]"} WebDriverWait 实例为wait。我们总是尝试使用wait

,而不是pWait

因此,由于所有这些原因, WebDriverWait 从未在我们的代码中正确实现。

混合 ImplicitWait & ExplicitWait

Selenium Documentation明确提到以下内容:

  

警告:不要混合隐式和显式等待。这样做会导致不可预测的等待时间。例如,设置10秒的隐式等待和15秒的显式等待可能会导致20秒后发生超时。

答案 1 :(得分:0)

ExpectedConditions.elementToBeClickable在现有isDisplayed()上调用isEnabled()WebElement个方法。

您提供By作为参数,这意味着,驱动程序必须首先找到您的元素。它未能做到这一点。

使用wait直到presenceOfElementLocatedBy(By by)确保您的元素存在。

示例:

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocatedBy(By.xpath("//a[contains(.,'Search&Baskets')]")));
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'Search&Baskets')]")));