请告诉我使用 Web-driver + TestNG 框架的以下场景的示例代码。
一个类(class)有多个测试。在运行这些测试时,它应该一次在同一浏览器(例如: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 grid(使用-timeout)。请看我的问题:Sharing driver between @BeforeMethod and @AfterMethod in TestNG .
编辑:我现在已在代码中添加了一个 ThreadLocal 变量,该变量在整个线程中共享驱动程序,因此您可以在 @AfterMethod 中调用 driver.quit()。
关于selenium - 使用 testNG 在浏览器的多个实例中并行运行一个类中的多个测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11520965/