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

时间:2016-12-03 21:59:24

标签: c# selenium visual-studio-2012 nunit-3.0

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

我有基地:

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

......和钩子:

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()时,它将启动第二个空白浏览器。任何帮助非常感谢。

现在基于建议工作但下面是页面对象模型的示例,它再次启动第二个浏览器窗口...

页面文件:

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 个答案:

答案 0 :(得分:1)

好的,你需要改变一些事情。扩展方法有一些我们需要遵循的规则。规则是:

  1. 它必须位于非泛型静态类中。因此,该方法必须是静态的,因为您不能在静态类中使用实例方法。
  2. 必须有一个参数,第一个参数必须包含this个关键字。第一个参数不能包含outref
  3. 第一个参数不能是指针类型。
  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);
            }
        }
    } 
    

    以上是非泛型静态类。它有一个参数,第一个参数有这个关键字。第一个参数是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#涵盖了深度扩展方法。