2

Selenium WebDriver と IEDriverServer.exe 2.32.3.0 を使用した Web テストでは、特定の URL に移動した後、現在のページのタイトルを確認する必要があります。コードは次のとおりです。

_webDriver.Navigate().GoToUrl("...");
Assert.That(_webDriver.Title, Is.EqualTo("..."));

これは時々機能しますが、散発的に機能しなくなります - タイトルは期待どおりではありません (ただし、前のページのタイトルのままです)。

私は StackOverflow ( C# Webdriver - Page Title assert fails before page loaded ) を読みましたが、そのIWebDriver.Titleプロパティはナビゲーションが完了するまで自動待機しません (なぜそうしないのですか?) が、代わりにWebDriverWaitAPI を使用して手動で待機する必要があります。

タイトルを待つマニュアルを実装しました:

 var wait = new WebDriverWait(_webDriver, TimeSpan.FromSeconds (3.0));
 wait.Until(d => d.Title == expectedTitle);

ただし、これは 3 秒間待機してからWebDriverTimeoutException. コードを実行するビルド エージェントは非常に高速で、テストしている Web サイトは簡単なもの (開発を開始したばかり) であるため、ナビゲートするのに 3 秒もかからないことは確かです。WebDriverTimeoutException他の StackOverflow の質問で、元のポスターも取得し、それをキャッチして無視したことに気付きました。

その解決策は少し不安定であることがわかったので、別の回避策を試しました。HTML で属性に IDを<title>指定し、IWebDriver.FindElement を使用しました。これは、ページが完了するまで待機することになっています。

Assert.That(_webDriver.FindElement(By.Id(ViewIDs.Shared._Layout.Title)).Text, Is.EqualTo(page.ExpectedTitle));

最初は、それがうまくいくように見えました。しかし、それは確実ではなく、時々スローします:

OpenQA.Selenium.NoSuchElementException : Unable to find element with id == _Layout-title
 at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
 at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
 at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String value)
 at OpenQA.Selenium.By.FindElement(ISearchContext context)
 at ...

(私も WebDriver/IEDriverServer 2.33.0.0 にアップグレードしようとしましたが、そのバージョンでは、<title>タグのテキストは常に空です...)

したがって、私の質問です。Selenium WebDriver でのナビゲーション後に現在のページを確実に確認するにはどうすればよいですか? うまくいくパターンはありますか?

4

2 に答える 2

0

私は非常によく似た問題に遭遇しました。理由はまだわかりませんが、 isElementPresent チェックを行わずに要素を使用しようとすると、失敗することがよくあります。私の解決策はやや「高価」ですが、信頼できる代替手段をまだ見つけていません。

私の例はJavaです。翻訳するのは難しくありませんが、ライブラリがありません。

    waitForElement("_Layout-title", 45);

次に、コードを続行します

    Assert.That(_webDriver.FindElement(By.Id(ViewIDs.Shared._Layout.Title)).Text, Is.EqualTo(page.ExpectedTitle));

これは、設定された回数 (この場合は 45 回) 要素を見つけようとします。id=_Layout-title が存在すると、コードの次の行に進み、アサートを行います。完璧ではありませんが、テストがより安定しました。

于 2013-06-18T12:32:40.987 に答える