1

我使用 Selenium 和 webdriver 为 MVC 应用程序编写了许多测试。这些在我的开发机器上工作没有问题。我们正在使用 PageFactory 设计。目前,我在页面加载时有 3 秒的显式等待(尽管我已经测试了长达 10 秒没有变化)。

下面是一个比较简单的测试:

考试

    [TestMethod]
    public void Can_Log_In_With_Valid_Credential()
    {
        Pages.LoginPage.Goto();
        var success = Pages.LoginPage.Login(Properties.Settings.Default.UserName,
                                            Properties.Settings.Default.Password);
        Assert.IsTrue(success);
        Pages.HeaderPage.LogOut();
    }

页面及相关逻辑

public static class Pages
{
    public static LoginPage LoginPage
    {
        get
        {
            var loginPage = new LoginPage();
            PageFactory.InitElements(Browser.Driver, loginPage);
            return loginPage;
        }
    }
}

public class LoginPage : Page
{
    public static string Url = Properties.Settings.Default.DomainAddress + "/Account/Logon";
    public static string PageTitle = "Log On";

    [FindsBy(How = How.Id, Using = "UserName")]
    private IWebElement _userNameBox;

    [FindsBy(How = How.Id, Using = "Password")]
    private IWebElement _passwordBox;

    [FindsBy(How = How.ClassName, Using = "validation-summary-errors")] 
    private IWebElement _validationErrors;

    [FindsBy(How = How.CssSelector, Using = "div#LoginSubmit.signin input")]
    private IWebElement _submitButton;


    public void Goto()
    {
        Browser.Goto(Url);

    }

    public bool IsAt()
    {
        return Browser.Title == PageTitle;
    }

    public bool Login(string username, string password)
    {
        try
        {
            _userNameBox.SendKeys(username);
        }
        catch (Exception)
        {
            _userNameBox = ((IWebDriver) Browser.Driver).FindElement(By.Id("UserName"), 10);
            _userNameBox.SendKeys(username);
        }
        _passwordBox.SendKeys(password);
        _submitButton.Click();

        return Browser.CurrentUrl != Properties.Settings.Default.DomainAddress + "/Account/Logon";
    }
}

问题出现在构建服务器上。所有测试均失败,原因如下:

类初始化方法 KepsPortalMvc.UserAccountManagementTests.Initialize 抛出异常。OpenQA.Selenium.WebDriverTimeoutException: OpenQA.Selenium.WebDriverTimeoutException: 10 秒后超时---> OpenQA.Selenium.NoSuchElementException: 无法定位元素:{"method":"id","selector":"UserName"}。

似乎 Firefox 甚至没有加载该页面。我已经(通过任务管理器)验证了 Webdriver 和 Firefox 都由 BuildServiceAccount 启动,但是我还没有找到监视网络活动的方法(Fiddler 没有向我显示与该 Firefox 实例相关的任何 HTTP 流量)非常少)。

有没有办法让我监控 WebDriver-Firefox?它不会弹出,因为它作为不同的帐户运行(我假设这就是原因)。

任何帮助将不胜感激。

澄清

这适用于我的开发机器,但不适用于 Team Foundation Build 服务器。我们在单个服务器上运行 Team Foundation。TFBuild 服务帐户是当前运行 Webdriver 和 Firefox 的帐户。Firefox 的进程条目在运行时会出现在任务管理器中,就像 WebDriver 的条目一样。Firefox 的窗口没有。Fiddler 没有向我显示该 Firefox 实例的任何流量(但我不确定这是否是因为根本没有加载任何内容,或者它只是没有显示在另一个用户会话中加载的流量)。

4

3 回答 3

2

这里有一个有根据的猜测,但可能是您的测试环境没有为 UI 测试设置。看看MSDN 上的这篇文章,看看应该怎么做。

其次,根据我的经验,如果构建代理运行不同版本的 msbuild,则可能会发生这种行为。确保它们相同。例如,使用 VS 2010 和 VS 2012 构建将使用不同的程序集,从而在运行时引发不同的结果。

于 2013-04-11T20:10:58.197 回答
0
OpenQA.Selenium.NoSuchElementException

我认为这个错误表明没有元素是 fpund。可能是因为FF在当前窗口失去焦点?你开了几扇窗?或者可能在打开 URL 后添加睡眠或隐式等待直到元素 isVisible ?

于 2013-04-11T14:41:49.513 回答
0

如果我理解正确,您可以使用 Selenium 在本地开发机器上运行 UI 测试,并希望它们在没有 TFS 构建机器的情况下运行。

这在默认情况下不起作用,因为构建过程是一个没有 UI 的服务,并且当它在 TFS 构建服务“会话”中运行时,您将无法看到它。因此,您需要设置 TFS 构建以作为交互式进程运行 ( http://msdn.microsoft.com/en-us/library/hh691189.aspx#agent_test ),但这意味着服务器始终被阻止。如果它是某处的硬件机器,则可以打开监视器并将其与构建凭据一起使用,因为它没有被锁定。

我做了一些与 MS Coded UI Tests 类似的事情,并查看它是否正常工作,我使用我的帐户作为构建帐户,因此我可以打开到服务器的 RDP 会话,这与构建相同。所以我可以看到测试期间发生了什么,但关闭 RDP 最终导致测试失败。这就是为什么我总是等待测试完成然后重新启动机器。

于 2013-04-12T06:13:15.737 回答