我有一个包含3种方法的类的测试套件文件。在套件级别,我给出了parallel =“ methods” thread-count =“ 3”,以便为类中的每个方法并行打开3个线程。
执行该套件时,将打开3个线程(浏览器)以启动URL,但按照方法中的步骤仅执行第3个线程/浏览器。对于第1个2个线程/浏览器不执行任何操作。
尝试了很多找到该问题的答案,但找不到解决方案。以下是我使用的代码,如果我错过了一些内容,请纠正我。
BaseClass:
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个浏览器并行打开。第一浏览器应搜索“ parallel”。第二个浏览器应搜索“方法”。第三浏览器应搜索“自动化”。
实际结果: 并行打开3个浏览器,但是首先打开的2个浏览器按照该方法执行操作,最后打开的浏览器搜索单词“ parallelmethodtestng”并关闭。根据代码,打开的前2个浏览器不会关闭也不会最大化。
===============================================
Suite
Total tests run: 3, Failures: 2, Skips: 0
===============================================
希望这会有所帮助。
答案 0 :(得分:0)
WebDriver不是线程安全的。我可能会引用Selenium FAQ
问:WebDriver线程安全吗?
答:WebDriver不是线程安全的。话虽如此,如果您可以序列化对底层驱动程序实例的访问,则可以在多个线程中共享一个引用。不建议这样做。另一方面,您可以为每个线程实例化一个WebDriver实例。
您的解决方案用于大型项目还是小型项目都是无关紧要的。如果要扩展解决方案,则可以始终使用Selenium网格进行并行执行。本地WebDriver对象将不是您的问题。吞噬Chrome实例的内存将是您的问题。
答案 1 :(得分:0)
我建议使用qaf TestNG extension,它负责驱动程序管理,资源管理以及更多用于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();
}
}
您还可以make test data-driven使用内置数据提供程序。
答案 2 :(得分:0)
如果您只想使用TestNG而没有任何扩展名,则需要通过ThreadLocal处理webdriver
private 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();
}
您还需要记住使用线程安全映射,列表等,例如concurentHashMap等。 它也适用于Selenium Grid。因此,ThreadLocal也应应用于RemoteWebDriver,因为它也不安全。
答案 3 :(得分:0)
由于thread-count
不在正确的位置,因此可能发生。根据TestNG文档thread-count
应该位于 suite 标签中。请按如下所述使用它。
<suite name="My suite" parallel="methods" thread-count="5">
在此处查看testng文档:
http://testng.org/doc/documentation-main.html#parallel-running