1

我是 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 秒。从上面的日志看来,它似乎只在 4 毫秒内引发了异常。我可以在控制台上看到,一旦它到达那条线,它就会抛出异常。

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

我在这里有什么遗漏吗。

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

显式等待也一样吗?

请帮忙

4

2 回答 2

2

让我们分析一下我们的代码中发生了什么。

我们定义了两个WebElements searchBasketsearchproduct如下:

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

我们没有尝试立即在我们的代码中使用这些 WebElement,所以没有影响

接下来,我们尝试了WebDriverWaitWebElement如下:

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

最后,导致错误Unable to locate element: {"method":"xpath","selector":"//a[contains(.,'Search&Baskets')]"}的最重要因素是, WebDriverWait实例是wait. 而不是使用wait我们一直试图使用pWait

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


混合ImplicitWaitExplicitWait

Selenium 文档清楚地提到了以下内容:

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

于 2017-12-06T14:32:18.580 回答
0

ExpectedConditions.elementToBeClickableEXISTING 上的调用isDisplayed()和方法。isEnabled()WebElement

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

wait使用until确保您的元素存在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')]")));
于 2017-12-06T14:21:20.087 回答