在我使用 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 在页面加载之前失败)该IWebDriver.Title
属性不会自动等待导航完成(为什么不呢?),但您需要使用WebDriverWait
API 手动等待。
我实现了手动等待标题:
var wait = new WebDriverWait(_webDriver, TimeSpan.FromSeconds (3.0));
wait.Until(d => d.Title == expectedTitle);
但是,这有时会等待 3 秒,然后抛出WebDriverTimeoutException
. 运行代码的构建代理非常快,而且我正在测试的网站很简单(刚刚开始开发),所以我很确定它真的不需要 3 秒来导航。我注意到在另一个 StackOverflow 问题上,原始发帖人也得到了WebDriverTimeoutException
并且只是抓住并忽略了它。
我发现该解决方案有点不稳定,所以我尝试了不同的解决方法。我在我的 HTML 中给了<title>
属性一个 ID 并使用了 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 中导航后如何可靠地检查当前页面?有没有好的模式有效?