我正在尝试使用可能与元素交互的硒创建测试脚本,但是如果元素不存在,它将不会。我需要补充一点,该元素可能需要一些时间才能显示。问题是,如果我使用FindElement,则会出现异常。如果我使用FindElements,则需要花费太长时间。因此,我尝试使用“ until”功能,该功能可以很好地等待元素出现,但是...如果没有出现,则会抛出异常,我想避免这种情况。
我知道我可以使用try catch。但是,还有什么更好的方法吗? 我现在有这个:
IWebElement button;
try{
string x = "search query";
button = this.WaitDriver.Until(d => d.FindElement(By.XPath(x)));
}catch{
button = null;
}
答案 0 :(得分:-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
}