在尝试检查是否存在提醒时,我会在名为IWebDriver
的{{1}}上调用扩展方法,即:
AlertIsDisplayed
但是,由于我捕获异常的事实,这需要2-3秒才能返回结果。在数百次测试中使用它会增加几分钟的额外执行时间。
所以为了加快速度,我尝试将相同的方法更改为:
try
{
Driver.Instance.SwitchTo().Alert();
return true;
}
catch (NoAlertPresentException)
{
return false;
}
finally
{
Driver.Instance.SwitchTo().DefaultContent();
}
return ExpectedConditions.AlertIsPresent()(driver) != null;
是driver
,其中调用了扩展方法。
但是,这需要相同的时间。看source code of ExpectedConditions.AlertIsPresent
揭示了原因 - 这正是我以前做过的事情,但仅仅是在包装中......
我已将IWebDriver
设为0。
这是在Selenium版本2.53.1上运行的。我的驱动程序是ImplicitWait
,EventFiringWebDriver
为WrappedDriver
。运行的Firefox版本是47.0.1。
是否有其他方法可以检查是否存在花费较少时间的警报?
答案 0 :(得分:1)
简短的回答是,"不,在使用旧版Firefox驱动程序时,无法避免在确定不存在警报时延迟2秒。"
更长的答案是,WebDriver API的理念是您应该始终了解自动化页面的状态。一旦您要求API以某种方式与浏览器交互,您应该知道在该交互之后页面的预期状态是什么。因此,只有在您希望存在警报的情况下,才会切换到警报。尝试切换到没有警报的警报是一种特殊情况,因此异常是正确的(根据API的原理)抛出。
在旧版Firefox驱动程序的特定情况下,无法判断窗口管理器是否已完全绘制警报,因此it hard-codes a two-second sleep用于查找警报存在。请注意,旧版Firefox驱动程序要求它可以跨平台工作,因此Windows可能不需要此延迟这一事实并不是删除它的理由。此外,此旧版驱动程序已弃用,will not work with any version of Firefox 48 and higher。
好消息是其他浏览器驱动程序不应该有此限制,因此它们不应受此类延迟的影响。还应该指出,Firefox驱动程序的下一次迭代(代号为Marionette,由Mozilla创建和维护,以及为版本48及更高版本自动化Firefox所需的机制)也可能不会遭受此类延迟
答案 1 :(得分:0)
预期条件(明确等待):写下您自己的预期条件。
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(1));
IWebElement myDynamicElement = wait.Until(ExpectedConditions.AlertIsPresent());
此处,请保持TimeSpan.FromSeconds(1
)仅等待one second
(或根据您的要求0.5秒)。请根据您的要求更改代码(我不了解C#)。关键点是webdriver等待检查预期条件为真的时间。
参考文献: