5

我正在使用 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?谢谢

4

3 回答 3

9

我想这对你有用。

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;
    }
}
于 2013-10-24T18:43:19.197 回答
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;
}
于 2013-10-24T23:54:01.273 回答
-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(millisecond, Bool value);

我认为这会帮助你

于 2013-10-24T19:28:38.337 回答