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
プロパティはナビゲーションが完了するまで自動待機しません (なぜそうしないのですか?) が、代わりにWebDriverWait
API を使用して手動で待機する必要があります。
タイトルを待つマニュアルを実装しました:
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 でのナビゲーション後に現在のページを確実に確認するにはどうすればよいですか? うまくいくパターンはありますか?