请告诉我使用 Web-driver + TestNG 框架的休闲场景的示例代码。
一类有多项测试。在运行这些测试时,它应该同时在同一浏览器(例如:Firefox)的多个实例中并行运行所有测试。因此,对于每个测试,它都应该打开一个浏览器的新实例。
到目前为止,我的解决方案是这样的:
public MyTestClass {
SupportedBrowser browser;
private static ThreadLocal<WebDriver> threadLocalDriver = new ThreadLocal<WebDriver>();
@DataProvider (name = "getBrowsers")
public Object[][] getBrowsers {
return Object[][] {
{
SupportedBrowser.FIREFOX;
},
{
SupportedBrowser.CHROME;
}
};
}
@Factory (dataProvider = "getBrowsers")
public MyTestClass(SupportedBrowser browser) {
this.browser = browser;
}
@BeforeMethod
public void setup()
{
threadLocalDriver.set(browser.getDriver());
}
@Test
public void test1()
{
WebDriver driver = threadLocalDriver.get();
//do stuff
}
@AfterMethod
public void tearDown()
{
WebDriver driver = threadLocalDriver.get();
driver.quit();
}
}
这是我的枚举:
public enum SupportedBrowser {
FIREFOX, CHROME; //add more as needed
public getDriver() {
if(this == SupportedBrowser.FIREFOX) {
return new RemoteDriver(hubAddress, DesiredCapabilities.firefox()); //alternatively could be new FirefoxDriver()
}
else {
return new RemoteDriver(hubAddress, DesiredCapabilities.chrome());
}
}
}
请原谅糟糕的代码约定,我不是在 IDE 中编写的(尽管我使用过类似的东西并且它可以工作)。该类针对每个不同的浏览器运行一次。每种方法都有自己独立的驱动程序,确保您的测试可以同时运行。它还允许每个方法采用自己的 DataProvider,以防您需要使用不同参数多次运行测试方法。还要确保在 testng.xml 文件中将并行属性设置为“方法”级别。
我的代码的唯一问题是确保在测试失败时驱动程序退出。目前,此方法将关闭失败的测试留给 selenium 网格(使用 -timeout)。请看我的问题:在 TestNG 中 @BeforeMethod 和 @AfterMethod 之间共享驱动程序。
编辑:我现在在整个线程中共享驱动程序的代码中添加了一个 ThreadLocal 变量,因此您可以在 @AfterMethod 中调用 driver.quit()。