显式等待 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 的内容,看看它是否代表 xPathcss,最后回退到使用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));
}