显式等待 return 奇怪的 findElement 值
Explicit wait return strange findElement value
我正在尝试在我的框架中创建一个显式等待方法来处理用户的输入。该方法应该处理所有类型的搜索:id、xpath 和 css。
但是,当我尝试测试此方法时,错误返回一个奇怪的错误
显式等待方法
public static void isDisplaying(String variable){
wait = new WebDriverWait(driver,3);
System.out.println("Looking for: " + variable);
if (driver.findElement(By.id(variable)).isDisplayed()){
System.out.println("Found variable via id");
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(variable)));
} else if (driver.findElement(By.xpath(variable)).isDisplayed()) {
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(variable)));
System.out.println("Found variable via xpath");
} else if (driver.findElement(By.cssSelector(variable)).isDisplayed()){
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(variable)));
System.out.println("Found variable via css");
} else {
System.out.println(variable +" is not displayed.");
}
}
我收到的错误:
org.openqa.selenium.NoSuchElementException: Unable to locate element: #\/\/div\[\@id\=\'slideOut\-nav\'\]\/ul\/li\[2\]\/a
我不知道为什么它会返回带有所有这些反斜杠和正斜杠的值。我的猜测是应用程序在尝试使用 id 搜索 xpath 字符串后立即失败。但是它不应该移动到下一个 else if 语句吗?如果确实是这个问题,我该如何处理?
当我简单地找到元素并单击时,它工作正常并且 returns 正确的路径:
//div[@id='slideOut-nav']/ul/li[2]/a
我已经在这个问题上停留了很长时间,所以非常感谢任何帮助!!
如果未找到元素,对 driver.findElement(By.id(variable))
的调用必然会立即抛出异常。
尝试用 driver.findElements()
替换对 driver.findElement()
的调用,因为此调用不会抛出异常,但当调用失败时它 returns 是一个空的网络元素列表。
如果你真的想构建一个泛型方法,那么你应该首先解析 variable
的内容,看看它是否代表 xPath
或 css
,最后回退到使用id (or) name
.
大家可以看看this implementation参考一下
我不确定你的函数是用来做什么的。您正在检查元素是否显示,如果显示,则等待它显示。如果显示某个元素,则它已经可见。
不是传递 String
,而是传递定位器 By
。传递定位器可以减少检查所有不同定位器类型的必要。
我已将 return 类型的 boolean
添加到您的函数中,以便您可以重复使用它。它最多等待 3 秒以使元素可见。如果它没有超时,该元素是可见的并且它 returns true
。如果确实超时,则该元素不可见并且 returns false
。您可以将代码缩减为以下内容。
public static boolean isDisplaying(By locator)
{
try
{
new WebDriverWait(driver, 3).until(ExpectedConditions.visibilityOfElementLocated(locator));
return true;
}
catch (TimeoutException e)
{
return false;
}
}
你可以这样称呼它
System.out.println(isDisplaying(By.xpath("//div[@id='slideOut-nav']/ul/li[2]/a")));
或
System.out.println(isDisplaying(By.id("someId")));
public void waitUntilElementclickable(WebElement element){
//Waits Until Element is Clickable on screen
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(element));
}
我正在尝试在我的框架中创建一个显式等待方法来处理用户的输入。该方法应该处理所有类型的搜索:id、xpath 和 css。 但是,当我尝试测试此方法时,错误返回一个奇怪的错误
显式等待方法
public static void isDisplaying(String variable){
wait = new WebDriverWait(driver,3);
System.out.println("Looking for: " + variable);
if (driver.findElement(By.id(variable)).isDisplayed()){
System.out.println("Found variable via id");
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(variable)));
} else if (driver.findElement(By.xpath(variable)).isDisplayed()) {
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(variable)));
System.out.println("Found variable via xpath");
} else if (driver.findElement(By.cssSelector(variable)).isDisplayed()){
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(variable)));
System.out.println("Found variable via css");
} else {
System.out.println(variable +" is not displayed.");
}
}
我收到的错误:
org.openqa.selenium.NoSuchElementException: Unable to locate element: #\/\/div\[\@id\=\'slideOut\-nav\'\]\/ul\/li\[2\]\/a
我不知道为什么它会返回带有所有这些反斜杠和正斜杠的值。我的猜测是应用程序在尝试使用 id 搜索 xpath 字符串后立即失败。但是它不应该移动到下一个 else if 语句吗?如果确实是这个问题,我该如何处理?
当我简单地找到元素并单击时,它工作正常并且 returns 正确的路径:
//div[@id='slideOut-nav']/ul/li[2]/a
我已经在这个问题上停留了很长时间,所以非常感谢任何帮助!!
如果未找到元素,对 driver.findElement(By.id(variable))
的调用必然会立即抛出异常。
尝试用 driver.findElements()
替换对 driver.findElement()
的调用,因为此调用不会抛出异常,但当调用失败时它 returns 是一个空的网络元素列表。
如果你真的想构建一个泛型方法,那么你应该首先解析 variable
的内容,看看它是否代表 xPath
或 css
,最后回退到使用id (or) name
.
大家可以看看this implementation参考一下
我不确定你的函数是用来做什么的。您正在检查元素是否显示,如果显示,则等待它显示。如果显示某个元素,则它已经可见。
不是传递 String
,而是传递定位器 By
。传递定位器可以减少检查所有不同定位器类型的必要。
我已将 return 类型的 boolean
添加到您的函数中,以便您可以重复使用它。它最多等待 3 秒以使元素可见。如果它没有超时,该元素是可见的并且它 returns true
。如果确实超时,则该元素不可见并且 returns false
。您可以将代码缩减为以下内容。
public static boolean isDisplaying(By locator)
{
try
{
new WebDriverWait(driver, 3).until(ExpectedConditions.visibilityOfElementLocated(locator));
return true;
}
catch (TimeoutException e)
{
return false;
}
}
你可以这样称呼它
System.out.println(isDisplaying(By.xpath("//div[@id='slideOut-nav']/ul/li[2]/a")));
或
System.out.println(isDisplaying(By.id("someId")));
public void waitUntilElementclickable(WebElement element){
//Waits Until Element is Clickable on screen
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(element));
}