显式等待返回奇怪的findElement值

时间:2017-02-27 02:40:39

标签: java selenium-webdriver wait explicit

我正在尝试在我的框架中创建一个显式的wait方法来处理用户的输入。该方法应该处理所有类型的搜索:id,xpath和css。 但是,当我尝试测试此方法时,错误返回奇怪的错误

显式等待方法

m

我收到的错误:

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.");
    }
}

我不知道为什么它会返回带有所有后退和正斜杠的值。我的猜测是,一旦尝试使用id搜索xpath字符串,应用程序就会失败。但是,如果声明,它不应该转移到下一个其他地方吗?如果这确实是问题,我应该如何处理这个问题呢?

当我只是找到元素并单击时,它可以正常工作并返回正确的路径:

org.openqa.selenium.NoSuchElementException: Unable to locate element: #\/\/div\[\@id\=\'slideOut\-nav\'\]\/ul\/li\[2\]\/a

我一直坚持这个问题,所以任何帮助都会非常感激!!

3 个答案:

答案 0 :(得分:1)

如果找不到该元素,对driver.findElement(By.id(variable))的调用必然会立即抛出异常。

尝试用driver.findElement()替换对driver.findElements()的调用,因为此调用不会抛出异常,但会在调用失败时返回一个空的webelements列表。

如果您真的想要构建一个通用方法,那么您应首先解析variable内容以查看它是否代表xPathcss,最后再回到使用{{} 1}}。

您可以查看this implementation以供参考。

答案 1 :(得分:0)

我不确定你的功能是做什么的。您正在检查是否显示该元素,然后是否等待显示该元素。如果显示元素,则它已经可见。

传递定位器String,而不是传递By。传递定位器减少了必须检查所有不同的定位器类型。

我已为您的功能添加了boolean的返回类型,以便您可以重复使用它。它等待最多3秒钟才能看到元素。如果它没有超时,则元素可见并返回true。如果确实超时,则元素不可见并返回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")));

答案 2 :(得分:0)

public void waitUntilElementclickable(WebElement element){
    //Waits Until Element is Clickable on screen
    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.elementToBeClickable(element));
}