我是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秒)
对于明确的等待也是如此?
请帮忙
答案 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 从未在我们的代码中正确实现。
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')]")));