2011-11-29 8 views
11

私は現在、InternetExplorerDriverを使用してASP.NET MVCアプリケーションに対してC#でSelenium 2/WebDriverを使用して概念実証を支援しています。Selenium2/WebDriverを使用してJavaScriptアラートを確実に待つことはできますか?

アプリケーションでは、レコードが保存されたことをユーザーに通知するための標準パターンが使用されます。これは、TempDataが "Record saved successfullyefully"を含むように設定し、TempDataがビューに存在する場合、ビューはメッセージを警告します。

この機能のSeleniumテストに取り組む一方で、我々は、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内のアラートとプロンプトの処理はかなり新しく、まだ活発に開発中です。 あなたの失敗はたぶんタイミングに起因するので、私は、OpenQA.Selenium.NoAlertPresentExceptionをキャッチし、タイムアウトが無期限になるまで無視するように、Alert()を呼び出すためにSwitchTo()の呼び出しの周りにラッパーメソッドを書くことをお勧めします。

これは動作するはずのような単純なもの:

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 –

関連する問題