当我在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"));
有人知道为什么我的代码在一起运行时会失败,但在单独运行时会通过吗?
任何答案都将不胜感激!
答案 0 :(得分:3)
当单元测试以某种方式使用共享资源/数据时,通常会发生这种情况。
答案 1 :(得分:2)
查看TestFixtureSetup,Setup,TestFixtureTearDown和TearDown。
这些属性允许您设置一次测试环境,而不是每次测试一次。
答案 2 :(得分:2)
在不知道Selenium是如何工作的情况下,我的赌注是Driver
,这似乎是一个静态类,所以2个测试是共享状态。共享状态的一个示例是Driver.Url
。由于测试是并行运行的,因此存在设置此对象状态的竞争条件。
那就是说,我没有你的解决方案:)
答案 3 :(得分:1)
你可以尝试两件事
通过Thread.Sleep
在这两行之间引入一点延迟 。Driver.FindElement(By.Id( “submenuitem4”))点击(); var headerelement = Driver.FindElement(By.ClassName(“header”));
答案 4 :(得分:1)
如果上述答案都不适合您,我通过在失败测试中断言之前添加Thread.Sleep(1)
来解决此问题...
看起来在某处错过了测试同步...请注意我的测试不依赖于顺序,我没有任何静态成员也没有外部依赖。
答案 5 :(得分:0)
你确定在运行其中一个测试后的方法
NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
带你回到你应该去的地方?似乎失败是由于导航处理程序不正确(假设在两个测试中都存在头元素)。
答案 6 :(得分:0)
我认为您需要确保您可以登录进行第二次测试,这可能会失败,因为您已经登录了吗?
- &GT;将登录设置为设置方法或(因为看起来您在两个测试中使用相同的用户)甚至直到夹具设置 - &GT;注销(如果需要)可能会被放入拆除方法
[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))