使用扩展方法的 Selenium 并行测试

Selenium Parallel testing with extension methods

我已经在 Selenium 中与 Nunit 并行配置 运行 测试,效果很好,但我不确定如何在不打开浏览器的第二个实例并破坏的情况下将自定义方法添加到组合中测试。

我有基地:

namespace ParallelTests
{
   public class Base
   {
       public IWebDriver Driver { get; set; }
   }
}

...和 ​​Hooks:

public class Hooks : Base
{
   public Hooks()
   {
      Driver = new ChromeDriver(@"D:\Data\user\Documents\Visual Studio 2012\Projects\ParallelTests\ParallelTests\bin");
   }
}

...和一个测试文件:

[TestFixture]
[Parallelizable]
public class ChromeTesting: Hooks
{
    [Test]
    public void ChromegGoogleTest()
    {
        Driver.Navigate().GoToUrl("https://www.google.co.uk");
        Driver.FindElement(By.Id("lst-ib")).SendKeys("Deep Purple");
        Driver.FindElement(By.Id("lst-ib")).SendKeys(Keys.Enter);
    }
}

运行 这工作正常,但如果我添加自定义方法,请说:

public class ExtensionMethods : Hooks
{
    public void assertDisplayed()
    {
        Assert.IsTrue(Driver.FindElement(By.XPath("//*[contains(text(),'Some Text')]")).Displayed);
    }
}

并在测试中调用assertDisplayed()如:

[TestFixture]
[Parallelizable]
public class ChromeTesting: Hooks
{
  [Test]
  public void ChromegGoogleTest()
  {
    Driver.Navigate().GoToUrl("https://www.google.co.uk");
    Driver.FindElement(By.Id("lst-ib")).SendKeys("Deep Purple");
    Driver.FindElement(By.Id("lst-ib")).SendKeys(Keys.Enter);
    ExtensionMethods.assertDisplayed();
  }
}

当我在上面显示的测试中调用 assertDisplayed() 时,它将启动第二个空白浏览器。非常感谢任何帮助。

现在根据建议工作,但下面是一个页面对象模型的示例,它再次启动第二个浏览器 window...

页面文件:

namespace ParallelTests
{
class PageObject_LoggedIn : Hooks
{
  public PageObject_LoggedIn()
  {
      PageFactory.InitElements(Driver, this);
  }

  [FindsBy(How = How.XPath, Using = @"//*[contains(text(),'Deep Purple | Official Site')]")]
  public IWebElement SearchText = null;

    [FindsBy(How = How.Id, Using = "lst-ib")]
    public IWebElement SearchBox = null;

    public void Search()
    {
        SearchBox.SendKeys("Deep Purple");
        SearchBox.SendKeys(Keys.Enter);
        Driver.assertDisplayed2();
    }
}

}

...并调用测试... 测试代码:

[TestFixture]
[Parallelizable]
public class ChromeTesting: Hooks
{
    [Test]
    public void ChromegGoogleTest()
    {
        PageObject_LoggedIn loggedIn = new PageObject_LoggedIn();

        Driver.Navigate().GoToUrl("https://www.google.co.uk");
        loggedIn.Search();
    }
}

好的,您需要更改一些内容。扩展方法有一些我们需要遵循的规则。规则是:

  1. 它必须在非通用静态 class 中。所以方法必须是静态的,因为你不能在静态 class.
  2. 中有实例方法
  3. 必须有一个参数,第一个参数必须有this关键字。第一个参数不能有 outref.
  4. 第一个参数不能是指针类型。

记住这些规则,让我们继续创建您需要的扩展方法。

namespace ParallelTests
{
    public static class ExtensionMethods // I would call it ChromeDriverEntension
    {
        public static void AssertDisplayed(this IWebDriver driver)
        {
            Assert.IsTrue(driver.FindElement(By.XPath("//*[contains(text(),'Some Text')]")).Displayed);
        }
    }
} 

以上是非泛型静态 class。它有一个参数,第一个参数有 this 关键字。第一个参数是 IWebDriver,因为这是我们要扩展的。该方法也是静态的。

好的,让我们继续使用它。

namespace ParallelTests
{
    public class Base
    {
        public IWebDriver Driver { get; set; }
    }

    public class Hooks : Base
    {
        public Hooks()
        {
            Driver = new ChromeDriver();
        }
    }

    [TestFixture]
    [Parallelizable]
    public class ChromeTesting : Hooks
    {
        [Test]
        public void ChromegGoogleTest()
        {
            Driver.Navigate().GoToUrl("https://www.google.co.uk");
            Driver.FindElement(By.Id("lst-ib")).SendKeys("Deep Purple");
            Driver.FindElement(By.Id("lst-ib")).SendKeys(Keys.Enter);
            Driver.AssertDisplayed();
        }
    }
}

编译器是如何找到扩展方法的?

当编译器注意到看起来像实例方法的代码时,Driver.AssertDisplayed();,但没有满足签名的实例方法,然后它会寻找扩展方法。它搜索所有名称空间以找到匹配项。由于这个方法在上面的同一个命名空间中,它会找到它。如果它在不同的命名空间中,则需要使用 using A.B 导入该命名空间,其中 A.B 是扩展方法所在的命名空间的名称。否则,编译器会产生一个错误,说它找不到这样的方法。

如果您想阅读更多内容,Jon Skeet 的 C# 深入介绍扩展方法。