我有一个带有3种方法的测试套件文件。在套件级别我并行="方法" thread-count =" 3",以便对类中的每种方法并行打开3个线程。
执行套件时,打开了3个线程(浏览器)启动URL,但仅根据方法中的步骤执行第三个线程/浏览器。对于第一个2个线程/浏览器执行的无动作。
尝试了很多东西来找到此问题的答案,但找不到解决方案。以下是我使用的代码,如果我错过了什么,请纠正我。
基础:
public class BaseClass {
public WebDriver driver;
public WebDriverWait wait;
@BeforeMethod()
public void configure() {
System.setProperty("webdriver.chrome.driver","C:\SeleniumDrivers\chromedriver.exe");
driver=new ChromeDriver();
driver.get("https://www.google.com");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@AfterMethod()
public void tearDown() {
driver.quit();
}
}
testMethods
类 public class NewTest extends BaseClass{
@Test()
public void method1() {
driver.findElement(By.name("q")).sendKeys("parallel");
driver.findElement(By.name("q")).sendKeys(Keys.ENTER);
}
@Test()
public void method2() {
driver.findElement(By.name("q")).sendKeys("methods");
driver.findElement(By.name("q")).sendKeys(Keys.ENTER);
}
@Test()
public void method3() {
driver.findElement(By.name("q")).sendKeys("testng");
driver.findElement(By.name("q")).sendKeys(Keys.ENTER);
}
}
套房文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="methods">
<test thread-count="5" name="Test">
<classes>
<class name="website.NewTest"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
预期结果:3个并行打开的浏览器。第一浏览器应搜索"并行"。第二浏览器应搜索"方法"。第三浏览器应搜索"自动化"。
实际结果:3个并行打开的浏览器,但首先打开的2个浏览器确实按照该方法执行操作,最后浏览器打开了" ParalletMethodtestng"一词并关闭的搜索。打开的前2个浏览器并不能按照代码最大化。
===============================================
Suite
Total tests run: 3, Failures: 2, Skips: 0
===============================================
希望这会有所帮助。
这可以发生,因为thread-count
不在正确的位置。根据testng文档, thread-count
应该在 suite 标签中。请如下所述使用它。
<suite name="My suite" parallel="methods" thread-count="5">
在此处检查测试文档:
http://testng.org/doc/documentation-main.html#parallallann-running
WebDriver不是线程安全的。我可能会引用硒常见问题解答
Q:Webdriver线程安全吗?
答:Web驱动器不是线程安全。话虽如此,如果您可以序列化访问基础驱动程序实例,则可以在多个线程中共享参考。这是不建议的。另一方面,您/can/在每个线程中实例化一个WebDriver实例。
如果您的解决方案用于庞大或小型项目,则无关紧要。如果要扩展解决方案,则可以随时使用硒网格进行并行执行。本地WebDriver对象将不是您的问题。分叉记忆进食Chrome实例将是您的问题。
我建议使用QAF TestNG扩展名,该扩展程序负责驱动程序管理,资源管理以及更多用于Web,移动和Web服务功能测试自动化。使用QAF,您的测试类可能看起来如下:
public class NewTest extends WebDriverTestCase{
@Test()
public void method1() {
getDriver().get("https://www.google.com");
getDriver().findElement(By.name("q")).sendKeys("parallel");
getDriver().findElement(By.name("q")).sendKeys(Keys.ENTER);
}
@Test()
public void method2() {
getDriver().get("https://www.google.com");
//another improved way
WebElement ele = getDriver().findElement(By.name("q"));
ele.sendKeys("methods");
ele.sendKeys.submit();
}
@Test()
public void method3() {
getDriver().get("https://www.google.com");
//another way with qaf
WebElement ele = $("name=q");
ele.sendKeys("testng");
ele.sendKeys.submit();
}
}
更多您可以使用内置数据提供商进行测试驱动。
如果您只想使用testng而无需任何扩展名,则需要通过ThreadLocal
处理WebDriverprivate final ThreadLocal<WebDriver> driver = new ThreadLocal<>();
应通过同步方法创建驱动程序。
public synchronized WebDriver createDriver() {
return new ChromeDriver(options.getOptions());
}
@BeforeMethod(alwaysRun = true)
public void setupDriver(String browser) {
driver.set(CcreateDriver());
}
public synchronized WebDriver getDriver() {
return driver.get();
}
您还需要Remeber使用线程安全地图,列表等,例如Conturenthashmap等。它也用于硒网格。因此,也应将ThreadLocal应用于Remotewebdriver,因为它也不安全。