我正在使用Selenium WebDriver运行测试,如果用户没有访问权限,则页面上不存在div。我正在尝试等待,以便如果显示该项目,则返回true,但如果它达到超时,则返回false。
public bool SummaryDisplayed()
{
var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(5));
var myElement = wait.Until(x => x.FindElement(By.Id("summaryPage")));
return myElement.Displayed;
}
我不想使用Thread.Sleep,因为如果2秒后元素存在,我希望它继续。但是如果5秒后元素不存在则返回false。我不希望它抛出异常,在某些测试用例中我预计它不存在。有没有办法可以抑制异常并在超时后返回false? 感谢
答案 0 :(得分:8)
我认为这对你有用。
public bool SummaryDisplayed()
{
try
{
var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(5));
var myElement = wait.Until(x => x.FindElement(By.Id("summaryPage")));
return myElement.Displayed;
}
catch
{
return false;
}
}
答案 1 :(得分:5)
您可以使用通用扩展方法等待元素在指定的等待中可见;然后从你的方法中调用它,如下所示:
public bool SummaryDisplayed()
{
var summaryElement = driver.WaitGetElement(By.Id("summaryPage"), 5, true);
return (summaryElement !=null);
}
扩展方法只是包装WebDriverWait
并等待元素存在/显示,具体取决于您的要求。如果在指定的等待中找不到元素,则返回null
。我在我的框架中使用此扩展名而不是FindElement()
。
public static IWebElement WaitGetElement(this IWebDriver driver, By by, int timeoutInSeconds, bool checkIsVisible=false)
{
IWebElement element;
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
try
{
if (checkIsVisible)
{
element = wait.Until(ExpectedConditions.ElementIsVisible(by));
}
else
{
element = wait.Until(ExpectedConditions.ElementExists(by));
}
}
catch (NoSuchElementException) { element = null; }
catch (WebDriverTimeoutException) { element = null; }
catch (TimeoutException) { element = null; }
return element;
}
答案 2 :(得分:-1)
尝试在system.Threading中使用Autoreset事件。
public static AutoResetEvent messsageEvent= new AutoResetEvent(false);
Public bool summaryDisplay()
{
var value=SomemethodCall()
messsageEvent.Reset()//This blocks the Thread
if(value.Exists)
{
messageEvent.Set();//This releases the Thread
}
}
这是另一个方法messageEvent.WaitOne(毫秒,Bool值);
我想这会帮助你