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 在页面加载之前失败)该IWebDriver.Title属性不会自动等待导航完成(为什么不呢?),但您需要使用WebDriverWaitAPI 手动等待。

我实现了手动等待标题:

 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 中导航后如何可靠地检查当前页面?有没有好的模式有效?

4

2 回答 2

3

我刚刚用我在CodeProject上找到的东西解决了这个问题:

private void WaitUntilLoaded()
{
    var wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(%));
    wait.Until(x =>
    {
        return ((IJavaScriptExecutor)this.driver)
        .ExecuteScript("return document.readyState").Equals("complete");
    });
}

根据w3schools的说法,它适用于大多数流行的浏览器。

当我目前在 Firefox 上进行测试时,我最终在Mozilla 自己的页面上了解如何识别页面已加载。恕我直言,阅读值得避免龙。

那给了我

wait.Until(p => p.FindElement(
    By.Id("somethingThatIsDisplayedWhenMyAsyncronousStuffIsFinished")
    ).Displayed);

这拯救了我的一天。

于 2017-01-20T13:55:21.143 回答
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 回答