Selenium2 / WebDriverを使用してJavaScriptアラートを確実に待つにはどうすればよいですか?
-
25-10-2019 - |
質問
私は現在、InternetExplorerDriverを使用してASP.NET MVCアプリケーションに対してC#を使用してSelenium 2 / WebDriverを使用した概念実証を支援しています。
アプリケーションは、レコードが保存したことをユーザーに通知するために標準パターンを使用します。これは、「Record Saved Successeefuly」を含めるようにTempDataを設定することで機能し、ViewにTempDataが存在する場合、ビューはメッセージに警告します。
この機能のセレンテストに取り組んでいる間、以下のC# / 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"));
約50%の時間、セリニウムは
openqa.selenium.noalertpresentexception:アラートはアクティブではありません
私は問題を再現する正確な方法を見つけるのに苦労し、矛盾の側面について心配しています。一貫して失敗した場合、問題をデバッグして追跡できます。
解決
Selenium 2内でのアラートとプロンプトの取り扱いは非常に新しく、まだアクティブな開発中です。あなたの障害はおそらくタイミングによるものなので、sitchind()。alert()への呼び出しに関するラッパー方法を書くことを提案します。
これがうまくいくはずのものが機能するはずです:
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));
所属していません StackOverflow