如何在尝试查找不存在的元素时检查Web元素是否显示而不会崩溃?

时间:2016-01-17 15:10:41

标签: scala selenium selenium-webdriver

我想检查id某些元素是否与selenium一起显示,当你尝试找到某些元素时购买:

    val editInvoiceString = driver.findElement(By.xpath( """//*[@id="edit_invoice"]/div[2]/div/div[10]/div[5]/div[1]"""))
    editInvoiceString

if (editInvoiceString.isDisplayed)
do something

如果元素不在页面上,程序将崩溃。

它已经在分配中崩溃了,因为那里有一个findElement并且没有找到元素

如何在不崩溃的情况下检查它是否显示?

5 个答案:

答案 0 :(得分:0)

只需处理NoSuchElementException

try {
    val editInvoiceString = driver.findElement(By.xpath( """//*[@id="edit_invoice"]/div[2]/div/div[10]/div[5]/div[1]"""));
    println("element found");
    // check the displayedness
}
catch {
    case e: NoSuchElementException => println("no such element");
}

答案 1 :(得分:0)

如果您使用driver.find代替driver.findElement,则会返回Option,然后您可以在其上调用isDefined以验证是否找到该元素。

您使用的是WebBrowser吗?

答案 2 :(得分:0)

你可以通过以下方式实现它:

    public bool IsElementPresent(By by, IWebDriver driver)
    {
        try
        {
            driver.FindElement(by);
            return true;
        }
        catch (NoSuchElementException)
        {
            return false;
        }
    }

    public bool IsElementPresent(By by, IWebDriver driver, int sec)
    {
        bool itemExist = false;

        itemExist = IsElementPresent(by, driver);
        while (!itemExist && sec >= 0)
        {
            thread.Sleep(1);
            itemExist = IsElementPresent(by, driver);
            sec--;
        }

        if (sec == -1)
            return false;
        else
            return true;
    }

呼叫:

if(IsElementPresent(By.xpath("""//*[@id="edit_invoice"]/div[2]/div/div[10]/div[5]/div[1]"""),driver,5))
{
//case exist
}
else
{
// case not exist
}

答案 3 :(得分:0)

如果使用Wait类(扩展FluentWait)忽略异常,则不需要使用try-catch子句:

Wait wait = new FluentWait(driver)
   .withTimeout(30, SECONDS)
   .pollingEvery(5, SECONDS)
   .ignoring(NoSuchElementException.class);
WebElement foo = wait.until(ExpectedConditions.presenceOfElementLocated(
  By.xpath(".//*[@id="edit_invoice"]/div[2]/div/div[10]/div[5]/div[1]"))
);

答案 4 :(得分:0)

使用findElements而不是FindElement。

这将返回找到的WebElements列表。如果未找到任何元素,则列表将为空。它看起来像这样(注意我不是Scala人,所以下面的语法可能稍微不正确。)

val editInvoiceString = driver.findElements(By.xpath( """//*[@id="edit_invoice"]/div[2]/div/div[10]/div[5]/div[1]"""))

if (editInvoiceString size > 0)
do something