2011-11-29 38 views
11

我目前正在使用Selenium 2/WebDriver与C#针对使用InternetExplorerDriver的ASP.NET MVC应用程序进行概念验证。如何可靠地等待使用Selenium2/WebDriver的JavaScript警报?

该应用程序使用标准模式通知用户记录已保存。这可以通过设置TempData来运行以包含“成功保存记录”,并且如果TempData存在于视图中,视图将提醒该消息。

虽然硒测试工作此功能,我们从下面C#/硒测试码接收inconstitant行为:

 _driver.Navigate().GoToUrl(_baseUrl + "/Amraam/List"); 
     _driver.FindElement(By.LinkText("Create New")).Click(); 

     _driver.FindElement(By.Id("txtAmraamSerialNumber")).SendKeys("CC12345"); 

     var selectElement = new SelectElement(_driver.FindElement(By.Id("LocationId"))); 
     selectElement.SelectByText("Tamworth"); 
     _driver.FindElement(By.Id("btnSave")).Click(); 
     var wait = new WebDriverWait(_driver, defaultTimeout); 
     IAlert alert = wait.Until(drv => drv.SwitchTo().Alert()); 
     _alertText = alert.Text; 

     alert.Accept(); 
     Assert.That(_alertText, Is.EqualTo("Record successfully saved")); 

将约50%的时间,Selinium将失败,

OpenQA.Selenium.NoAlertPresentException:没有警报处于活动状态

我很难找到复制问题的确切方法,并担心不一致方面。如果它一直失败,那么我们可以调试并跟踪问题。

回答

15

在Selenium 2中对警报和提示的处理非常新颖,目前仍在积极开发中。 您的失败可能是由于计时造成的,所以我会建议围绕对SwitchTo()。Alert()的调用编写一个包装方法,以便捕获OpenQA.Selenium.NoAlertPresentException并在超时过期前忽略它。

事情如此简单应该工作:

private IAlert AlertIsPresent(IWebDriver drv) 
{ 
    try 
    { 
     // Attempt to switch to an alert 
     return drv.SwitchTo().Alert(); 
    } 
    catch (OpenQA.Selenium.NoAlertPresentException) 
    { 
     // We ignore this execption, as it means there is no alert present...yet. 
     return null; 
    } 

    // Other exceptions will be ignored and up the stack 
} 

此行

IAlert alert = wait.Until(drv => drv.SwitchTo().Alert()); 

将随即成为

IAlert alert = wait.Until(drv => AlertIsPresent(drv)); 
+0

干杯这一点。实际上,进一步工作,我们发现这实际上并不是硒的问题,但实际上与我们的应用程序测试,以及点击按钮上的JavaScript事件的顺序(不要问...)无论如何,硒本身的行为。 @Naishy,你的回应看起来不错,但我们会尝试,否则 - 欢呼。 –

+0

您可以使用方法组语法使最后一行更简洁一点; 'IAlert alert = wait.Until(AlertIsPresent);'。 –

+1

现在您可以使用 ExpectedCondition.AlertIsPresent 请参阅:http://stackoverflow.com/a/24550934/200824 –