C#Webdriver-页面加载前页面标题断言失败

C#Webdriver-页面加载前页面标题断言失败,c#,selenium,visual-studio-2012,webdriver,C#,Selenium,Visual Studio 2012,Webdriver,当我从www网站上的测试切换到我的本地主机版本时,这个问题就开始了。在VS2012中工作,我将开始调试,以便本地主机处于活动状态,分离进程,以便对其进行测试,然后运行我喜欢的任何测试。举一个非常基本的例子: [Test] public void CanGoToHomePage() { Pages.HomePage.Goto(); Assert.IsTrue(Pages.HomePage.IsAt()); } 它引用的功能如下:

当我从www网站上的测试切换到我的本地主机版本时,这个问题就开始了。在VS2012中工作,我将开始调试,以便本地主机处于活动状态,分离进程,以便对其进行测试,然后运行我喜欢的任何测试。举一个非常基本的例子:

    [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;
        }
    }
这里是实际的selenium代码:

    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上进行测试之后,突然我遇到了一个奇怪的问题,一个页面将开始加载(即,屏幕仍然是白色的,没有完成任何操作),甚至有时下一个页面刚刚完成加载,突然测试将启动并失败,指向IsAt的断言返回false,即使它加载的页面是正确的。我可以立即再次运行该测试,它将毫无问题地通过。第三次运行它,它可能会再次随机失败。老实说,我不确定是什么导致了这个问题,任何帮助都将不胜感激

隐式等待仅用于查找元素的工作。要将页面标题上的等待设置为某个值,您需要使用显式等待。您可以编写此模式的自己版本,但是在.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。

是否可以尝试在非调试模式下运行项目?在这种情况下,您仍然得到相同的结果吗?首先,删除隐式等待。不要经常呼叫,只需呼叫一次,就可以为驾驶员的生命周期设置。这是什么版本的Firefox和Selenium?我建议,当Selenium尝试访问该页面时,您可以自己在单独的浏览器实例中手动访问该页面。这将有助于说明Selenium是否真的是问题所在。@Pat:我确实尝试过“启动而不调试”,这似乎使问题变得不那么频繁,但它仍然存在。@Arran这段代码可能误导了您,但“Goto”只被调用一次,其他所有东西都从它分支出来,因此它只被调用一次,并在驱动程序的生命周期内被设置。我还可以向您保证,页面本身没有问题,但是selenium或者我试图在localhost中对页面进行测试的事实。另外,似乎有人给了我一些关于显式等待的建议,下面我将在一分钟内尝试。嗨,Jim,我似乎无法像你一样在这里的注释中正确地将我的代码放入块中,但我使用了你在那里编写的内容,并对我的IsAt()进行了一些小的调整,修改为使用WebDriverTimeoutException的try/catch。它编译并成功地进入了主页,到目前为止返回了true,所以希望这能解决这个问题(尽管我永远也不知道,除非我最终失败了,哈哈)。非常感谢你的帮助!那么,请随意接受正确的答案。通过单击评论编辑字段旁边的“帮助”链接,可以显示小标记。将注释块标记为块的方法与主要问题和答案中的方法相同,即在术语周围加上反引号(`)。