【问题标题】:How can I use Selenium 'Until' function without throwing an Exception?如何在不引发异常的情况下使用 Selenium 'Until' 函数?
【发布时间】:2018-12-14 21:32:43
【问题描述】:

我正在尝试使用 selenium 创建一个测试脚本,该脚本可能与元素交互,但如果元素不存在,则不会。我需要补充一点,该元素可能需要一些时间才能出现。问题是,如果我使用 FindElement,我会遇到异常。如果我使用 FindElements 则需要很长时间。所以,我尝试使用“直到”函数,它可以很好地等待元素出现......但如果它没有出现,它会抛出一个异常,我想避免这种情况。

我知道我可以使用 try catch。但是,有没有更好的方法来做到这一点? 我现在有这个:

IWebElement button;
try{
    string x = "search query";
    button = this.WaitDriver.Until(d => d.FindElement(By.XPath(x)));
}catch{
    button = null;
}

【问题讨论】:

    标签: c# selenium webdriverwait


    【解决方案1】:

    如果您想在没有try-catch 的情况下测试是否存在,则必须使用.FindElements()。使用相同的等待时间不应超过.FindElement(),但如果元素不存在,等待将超时......这很痛苦。解决此问题的一种方法是执行以下操作。基本上就是你所做的一些调整。

    public bool ElementExists(By locator)
    {
        try
        {
            new WebDriverWait(driver, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.ElementExists(locator));
            return true;
        }
        catch (Exception e) when (e is NoSuchElementException || e is WebDriverTimeoutException)
        {
            return false;
        }
    }
    

    我更喜欢检查存在而不是返回null,因为那样你还必须检查null。通过将它放在一个函数中,您可以随时调用它,并且您的测试保持清洁。你会像这样使用它

    By locator = By.Id("someId");
    if (ElementExists(locator))
    {
        IWebElement e = driver.FindElement(locator);
        // do something with e
    }
    

    【讨论】:

    • OP 明确提到 我可以使用 try catch。但是,有没有更好的方法来做到这一点? 但你的答案包含 try catch{} 以附加包装器的形式。你真的读过这个问题吗?
    • @DebanjanB 是的,我做到了。看过我的回答了吗?我首先解释说,只要您不需要等待,就可以在没有try-catch 的情况下完成。一旦你需要等待,你必须使用try-catch。那部分只有4句话……
    • 您可以使用 findElements 搜索 WebElements 并将结果存储在 arrayList 中。如果arraylist的大小小于1,我们就知道该元素不存在。
    • @Neha 你是在跟我说话还是在和 DebanjanB 说话?我知道...这是我的答案。
    • 最后我放弃了,做了这样的事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多