2011-11-29 20 views
11

Tôi hiện đang hỗ trợ bằng chứng về khái niệm bằng cách sử dụng Selenium 2/WebDriver với C# đối với ứng dụng ASP.NET MVC bằng cách sử dụng InternetExplorerDriver.Làm thế nào tôi có thể tin tưởng một cách đáng tin cậy cho các cảnh báo JavaScript bằng Selenium2/WebDriver?

Ứng dụng sử dụng mẫu chuẩn để thông báo cho người dùng rằng bản ghi đã được lưu. Điều này hoạt động bằng cách thiết lập TempData để bao gồm "Record saved succeedsefully", và nếu TempData có mặt trong View, khung nhìn sẽ cảnh báo tin nhắn.

Trong khi làm việc trên các xét nghiệm Selenium cho chức năng này, chúng tôi đang nhận hành vi inconstitant từ bên dưới C mã kiểm tra #/Selenium:

 _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")); 

Khoảng 50% thời gian, Selinium sẽ thất bại với một

OpenQA.Selenium.NoAlertPresentException: Không có cảnh báo nào đang hoạt động

Tôi cố gắng tìm một cách chính xác để tái tạo sự cố và lo lắng về khía cạnh không thống nhất. Nếu không thành công, chúng tôi có thể gỡ lỗi và theo dõi sự cố.

Trả lời

15

Việc xử lý cảnh báo và lời nhắc trong Selenium 2 là khá mới và vẫn đang được phát triển tích cực. Lỗi của bạn có thể do thời gian, vì vậy tôi sẽ đề nghị viết một phương thức bao bọc xung quanh lời gọi đến SwitchTo(). Alert() để bạn nắm bắt OpenQA.Selenium.NoAlertPresentException và bỏ qua nó cho đến khi hết thời gian chờ.

Something đơn giản như này nên làm việc:

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 
} 

Dòng này

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

sau đó sẽ trở thành

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

Chúc mừng cho điều đó. Trên thực tế, làm việc xa hơn, chúng tôi thấy rằng đây không thực sự là vấn đề với selen, nhưng thực sự với ứng dụng Thử nghiệm của chúng tôi và sắp xếp các sự kiện javascript trên một lần nhấp nút (không hỏi ...) Dù sao thì, selenium đang hành xử . @Naishy, ​​phản ứng của bạn trông rất tuyệt vời, và chúng tôi đã thử nó nếu không - cổ vũ. –

+0

Bạn có thể sử dụng cú pháp nhóm phương pháp để làm cho dòng cuối cùng đó ngắn gọn hơn một chút; 'IAlert alert = wait.Until (AlertIsPresent);'. –

+1

Bây giờ bạn có thể sử dụng ExpectedCondition.AlertIsPresent Xem: http://stackoverflow.com/a/24550934/200824 –

Các vấn đề liên quan