Wie kann ich mit Selenium2 / Webdriver zuverlässig auf JavaScript -Warnungen warten?
-
25-10-2019 - |
Frage
Ich unterstütze derzeit einen Proof of Concept unter Verwendung von Selenium 2 / Webdriver mit C# gegen eine ASP.NET -MVC -Anwendung mit dem InternetExplorerDriver.
Die Anwendung verwendet ein Standardmuster, um Benutzer zu benachrichtigen, die ein Datensatz gespeichert hat. Dies erfolgt nach Einstellungen tempdata, um "Aufzeichnungsaufnahme erfolgreich" enthalten. Wenn Tempdata in der Ansicht vorhanden ist, alarmiert die Ansicht die Nachricht.
Während wir an Selenium -Tests für diese Funktionalität arbeiten, erhalten wir unbeständiges Verhalten aus dem folgenden C# / Selenium -Testcode:
_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"));
Ungefähr 50% der Fälle wird Selinium mit a scheitern
Openqa.selenium.noalertPresentException: Keine Warnung ist aktiv
Ich kämpfe darum, einen genauen Weg zu finden, um das Problem zu replizieren und mir Sorgen um den Inkonsistenzaspekt zu machen. Wenn es konsequent fehlschlägt, könnten wir das Problem debuggen und verfolgen.
Lösung
Der Umgang mit Warnungen und Aufforderungen in Selenium 2 ist ziemlich neu und steht noch in aktiver Entwicklung. Ihre Fehler sind wahrscheinlich auf das Timing zurückzuführen, daher würde ich empfehlen, eine Wrapper -Methode um den Anruf zum Switchto () zu schreiben. Alert (), damit Sie die OpenQA.Selenium.noalertPresentException fangen und ignorieren, bis die Zeitüberschreitung abgelaufen ist.
Etwas so Einfaches sollte funktionieren:
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
}
Diese Linie
IAlert alert = wait.Until(drv => drv.SwitchTo().Alert());
würde dann werden
IAlert alert = wait.Until(drv => AlertIsPresent(drv));