当我从www网站上的测试切换到我的localhost版本时,这个问题就开始了。在VS 2012中工作,我将开始调试,以便localhost处于活动状态,分离进程以便我可以对其进行测试,然后运行我喜欢的任何测试。一个非常基本的例子:
[Test]
public void CanGoToHomePage()
{
Pages.HomePage.Goto();
Assert.IsTrue(Pages.HomePage.IsAt());
}
它引用的功能在这里:
public class HomePage
{
const string Url = "http://localhost:3738";
const string HomepageTitle = "FunnelFire - Home Page";
public void Goto()
{
Browser.Goto(Url);
}
public bool IsAt()
{
return Browser.Title == HomepageTitle;
}
}
这里的实际硒代码:
public static class Browser
{
static IWebDriver webDriver = new FirefoxDriver();
public static void Goto(string url)
{
webDriver.Manage().Window.Maximize();
webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
webDriver.Url = url;
}
}
现在问题。我在浏览器中添加的10秒隐式等待在加载页面后成功等待最多10秒,以查看它是否可以找到我想要查找的任何信息,这不是问题。
正如我之前所说,在我切换到localhost上测试之后,我突然遇到一个奇怪的问题,页面开始加载(即屏幕仍然完全白,没有完成),甚至有时候下一页几乎不能完成加载并突然测试只会向上并失败,指向Assert of IsAt返回false,即使它正在加载的页面是正确的。我可以再次立即运行该测试,它会毫无问题地通过。第三次运行它可能会再次随机失败。老实说,我不确定是什么导致了这个问题,任何帮助都会受到赞赏!
答案 0 :(得分:6)
隐式等待仅用于查找元素。要等待页面标题为某个值,您需要使用显式等待。您可以编写自己的此模式版本,但在.NET绑定中,WebDriver.Support.dll
程序集有一个WebDriverWait
类来帮助解决此问题。它的用途看起来像这样:
// WARNING! Untested code written from memory below. It has not
// been tested or even compiled in an IDE, so may be syntactically
// incorrect. The concept, however, should still be valid.
public void WaitForTitle(IWebDriver driver, string title, TimeSpan timeout)
{
WebDriverWait wait = new WebDriverWait(driver, timeout);
wait.Until((d) => { return d.Title == title; });
}
您甚至可以修改IsAt
方法以使用此模式,捕获WebDriverTimeoutException
并在等待函数超时时返回false。