C# 如何检查警报是否快速出现?

C# 如何检查警报是否快速出现?,c#,.net,selenium,selenium-webdriver,C#,.net,Selenium,Selenium Webdriver,当尝试检查是否存在警报时,我调用IWebDriver上的扩展方法,称为AlertIsDisplayed,即: try { Driver.Instance.SwitchTo().Alert(); return true; } catch (NoAlertPresentException) { return false; } finally { Driver.Instance.SwitchTo().DefaultContent(); } 但是,由于我正在捕获一个异

当尝试检查是否存在警报时,我调用
IWebDriver
上的扩展方法,称为
AlertIsDisplayed
,即:

try
{
    Driver.Instance.SwitchTo().Alert();

    return true;
}
catch (NoAlertPresentException)
{
    return false;
}
finally
{
    Driver.Instance.SwitchTo().DefaultContent();
}
但是,由于我正在捕获一个异常,因此花费2-3秒的时间返回结果是非常昂贵的。在数百个测试中使用这种方法,会增加几分钟的额外执行时间

因此,为了加快速度,我尝试将相同的方法更改为:

return ExpectedConditions.AlertIsPresent()(driver) != null;
其中
driver
是调用扩展方法的
IWebDriver

然而,这需要相同的时间。看看这些说明了原因——这正是我以前所做的,但只是包装而已

我已将我的
隐式等待设置为0

这在Selenium 2.53.1版上运行。我的驱动程序是一个
EventFiringWebDriver
,带有
FirefoxDriver
WrappedDriver
。它运行的Firefox版本是47.0.1


除了检查是否存在需要较少时间的警报之外,还有其他方法吗?

预期条件(显式等待)):编写您自己的预期条件

    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(1));
    IWebElement myDynamicElement = wait.Until(ExpectedConditions.AlertIsPresent());
在这里,将TimeSpan.FromSeconds(
1
)设置为仅等待
1秒(或根据您的要求0.5秒)。请根据您的要求更改代码(我不懂C#)。关键点是webdriver等待多长时间来检查预期条件是否为真

参考资料:

  • 简短的回答是:“不,在使用旧版Firefox驱动程序时,无法避免在确定警报不存在时出现2秒钟的延迟。”

    较长的答案是WebDriverAPI的理念是,您应该始终知道正在自动化的页面的状态。一旦您要求API以某种方式与浏览器交互,您应该知道交互后页面的预期状态。因此,只有在您希望出现警报的情况下,才会切换到警报。尝试切换到不存在警报的警报是一种异常情况,因此会正确地(根据API的原理)引发异常

    在传统Firefox驱动程序的特定情况下,无法判断窗口管理器是否已完全绘制警报,因此无法确定是否存在警报。请注意,旧版Firefox驱动程序需要跨平台工作,因此Windows可能不需要此延迟并不是删除它的理由。此外,此旧版驱动程序已弃用,并且


    好消息是其他浏览器驱动程序不应该有这种限制,因此它们不应该遭受这种延迟。还应该指出的是,Firefox驱动程序的下一次迭代(代码为Marionette,由Mozilla创建和维护,以及为版本48和更高版本自动运行Firefox所需的机制)也可能不会遇到这种延迟。

    您使用的是哪种驱动程序和版本?一些驱动程序有一个隐式的等待时间来切换到警报。将此行为仅仅归因于异常处理是错误的。延迟可能是由于您正在使用的浏览器的驱动程序造成的。例如,在开源Firefox驱动程序(驱动程序本身,而不是语言绑定)中,有一个硬编码的睡眠切换到警报,因为无法保证警报将完全由窗口管理器绘制。是的,2-3秒的延迟是不好的,但我们不要马上就其原因下结论,错误地将其归咎于异常处理。如果有帮助,您可以这样引用:@JimEvans我已经用版本信息更新了原始问题,谢谢。您能试着使用javascript检测javascript executor是否存在警报吗?--你从哪里得到的
    driver.Manage().Timeouts().ImplicitlyWait
    对切换到警报有影响?虽然我没有实际尝试,但我在某个地方读到的警报是DOM级别0的一部分。因此,认为隐式等待可能会对警报产生影响。如果我错了,请纠正我。@FLSH,请尝试一下,让我们知道隐式等待是否对您有效(以防出现警报)。@FlorentB。我可以确认隐式等待对切换到警报所需的时间没有影响。@Naveen恐怕不会-我已将
    PollingInterval
    设置为50ms,但在调试时,我可以看到它将轮询一次,然后由于超时参数,在1秒后超时(并引发异常)。嗨,Jim,非常感谢你的回答。据我所知,在使用Firefox时,目前没有办法避免延迟,我应该等待木偶驱动程序。是这样吗?要么这样,要么重新构造代码,这样就不会不必要地寻找不存在的警报。很抱歉,我的回答在这一点上不清楚。顺便说一句,尽管Mozilla还有一些功能尚未实现,但今天您可以使用木偶。