40

当我在 Visual Studio 中编写测试时,我通过保存、构建然后在 Nunit 中运行测试来检查它是否有效(右键单击测试然后运行)。

测试有效...所以我继续...

现在我已经编写了另一个测试,它可以像上面一样保存和测试它。但是,当它们一起运行时,它们不起作用。

这是我的两个测试,它们在单独运行时有效,但在一起运行时失败:

using System;
using NUnit.Framework;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium;

namespace Fixtures.Users.Page1
{
    [TestFixture]
    public class AdminNavigateToPage1 : SeleniumTestBase
    {
        [Test]
        public void AdminNavigateToPage1()
        {
            NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
            NavigateTo<Page1>();
            var headerelement = Driver.FindElement(By.ClassName("header"));

            Assert.That(headerelement.Text, Is.EqualTo("Page Title"));
            Assert.That(Driver.Url, Is.EqualTo("http://localhost/Page Title"));
        }

        [Test]
        public void AdminNavigateToPage1ViaMenu()
        {
            NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
            Driver.FindElement(By.Id("menuitem1")).Click();
            Driver.FindElement(By.Id("submenuitem4")).Click();
            var headerelement = Driver.FindElement(By.ClassName("header"));

            Assert.That(headerelement.Text, Is.EqualTo("Page Title"));
            Assert.That(Driver.Url, Is.EqualTo("http://localhost/Page Title"));
        }
    }
}

当第二个测试因为它们一起运行而失败时

Nunit 介绍了这一点:

Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesViaMenu:OpenQA.Selenium.NoSuchElementException:找不到元素

此行突出显示:

var headerelement = Driver.FindElement(By.ClassName("header"));

有谁知道为什么我的代码一起运行时失败,但单独运行时通过?

任何答案将不胜感激!

4

7 回答 7

13

当单元测试以某种方式使用共享资源/数据时,通常会发生这种情况。

  1. 如果您的被测系统具有用于计算您断言的输出的静态字段/属性,也会发生这种情况。
  2. 如果被测系统正在共享(静态)依赖项,则可能会发生这种情况。
于 2017-05-26T18:50:52.183 回答
3

你可以尝试两件事

  1. 将断点放在以下两行之间。并在第二行被击中时查看您在哪个页面

  2. 通过 Thread.Sleep 在这两行之间引入一点延迟

    Driver.FindElement(By.Id("submenuitem4")).Click();
    var headerelement = Driver.FindElement(By.ClassName("header"));
    
于 2012-01-24T13:10:22.527 回答
3

如果以上答案都不适合您,我通过Thread.Sleep(1)在失败测试中的断言之前添加来解决此问题...

看起来测试同步在某处丢失了......请注意,我的测试不依赖于顺序,我没有任何静态成员或外部依赖。

于 2014-04-09T13:48:50.173 回答
2

查看TestFixtureSetupSetupTestFixtureTearDownTearDown
这些属性允许您设置一次测试环境,而不是每次测试一次。

于 2012-01-24T13:06:46.973 回答
2

在不知道 Selenium 是如何工作的情况下,我打赌Driver似乎是一个静态类,因此 2 个测试共享状态。共享状态的一个例子是Driver.Url. 因为测试是并行运行的,所以有一个竞争条件来设置这个对象的状态。

也就是说,我没有适合你的解决方案:)

于 2013-06-03T13:32:20.887 回答
0

您确定在运行其中一项测试后该方法

NavigateTo<LogonPage>().LogonAsCustomerAdministrator();

是带你回到你应该去的地方吗?失败似乎是由于导航处理程序不当造成的(假设在两个测试中都存在并找到了 header 元素)。

于 2012-01-24T13:07:18.187 回答
0

我认为您需要确保您可以登录进行第二次测试,这可能会失败,因为您已经登录了?

-> 将登录放在设置方法中,或者(因为看起来你在两个测试中使用相同的用户)甚至到夹具设置 -> 注销(如果需要)可能会放在拆卸方法中

     [SetUp]
     public void LaunchTest()
     {
        NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
     }

     [TearDown]
     public void StopTest()
     {
        // logoff
     }
     [Test]
     public void Test1()
     {...}
     [Test]
     public void Test2()
     {...}

如果 DOM 有延迟而不是 thread.sleep,我建议结合条件使用 webdriver.wait。睡眠可能在 80% 中起作用,而在其他情况下则不起作用。等待轮询直到达到更可靠且可读的超时。这是一个我通常如何处理的示例:

    var webDriverWait = new WebDriverWait(webDriver, ..);
    webDriverWait.Until(d => d.FindElement(By.CssSelector(".."))
        .Displayed))
于 2016-02-03T17:34:24.347 回答