Selenium2 / WebDriverを使用してJavaScriptアラートを確実に待つにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/8310548

質問

私は現在、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));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top