gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:36:08 27 4
gpt4 key购买 nike

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

我有基地:

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

...和钩子(Hook):

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. 它必须在非通用静态类中。所以方法必须是静态的,因为静态类中不能有实例方法。
  2. 它必须有一个参数,第一个参数必须有this关键字。第一个参数不能有 outref
  3. 第一个参数不能是指针类型。

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

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);
}
}
}

上面是一个非泛型静态类。它有一个参数,第一个参数有 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();,但没有满足签名的实例方法,然后它会寻找扩展方法。它搜索所有 namespace 以找到匹配项。由于这个方法在上面的同一个命名空间中,它会找到它。如果它在不同的命名空间中,则需要使用 using A.B 导入该命名空间,其中 A.B 是扩展方法所在的命名空间的名称。否则,编译器会产生一个错误,说它找不到这样的方法。

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

关于c# - 使用扩展方法的 Selenium 并行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40952942/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com