如何 运行 使用 selenium 网格在多个浏览器中并行或串行测试套件

How to run test suites parallel or serially in multiple browser using selenium grid

如何使用 selenium 网格 运行 在多个浏览器中并行或串行测试套件。 我有 3 个 xml 文件,一个 chrome.xml(包含我在 chrome 中的所有测试 运行),一个 firefox.xml(包含我所有的测试运行 在 firefox 中)和 testng.xml 包含两者作为套件。

Chrome.xml

 <suite name="Chrome">
<listeners>
    <listener class-name="ww5.listener.Listener" />
</listeners>
<test name="v5">
  <parameter name="browser" value="chrome"/>
  <classes>
        <class name="ww5.testcases.version.version" ></class> 
        <class name="ww5.testcases.loginSuite.LoginTest" ></class> 
        <class name="ww5.testcases.loginSuite.LogoutTest" ></class>
   </classes>
</test>
</suite>

firefox.xml

<suite name="Firefox">
<listeners>
    <listener class-name="ww5.listener.Listener" />
</listeners>
<test name="v5">
  <parameter name="browser" value="firefox"/>
  <classes>
        <class name="ww5.testcases.version.version" ></class> 
        <class name="ww5.testcases.loginSuite.LoginTest" ></class> 
        <class name="ww5.testcases.loginSuite.LogoutTest" ></class>
   </classes>
</test>
</suite>

testng.xml

<suite name="My Project" parallel="tests">   
<listeners>
    <listener class-name="ww5.listener.Listener" />
</listeners>
  <suite-files>
     <suite-file path="./Chrome.xml" />
     <suite-file path="./firefox.xml" />
 </suite-files>
</suite>

提前致谢,我正在使用页面对象模型,因此每个浏览器都有套件文件。

  1. 使您的 WebDriver 线程安全。
  2. @BeforeTest 中初始化您的 WebDriver 并在 @AfterTest 中使用 quit()

你可以在我的一个问题下找到一个例子:Parameterized Selenium Tests in Parallel with TestNG

更新:

如何使您的 WebDriver 线程安全:

  private List<WebDriver> webDriverPool = Collections.synchronizedList(new ArrayList<WebDriver>());
  private ThreadLocal<WebDriver> driverThread;

  @BeforeTest()
  public void beforeTest() {
      //...
      this.driverThread   = new ThreadLocal<WebDriver>() {
        @Override
        protected WebDriver initialValue() {
          WebDriver webDriver = new RemoteWebDriver(...);
          webDriverPool.add(webDriver);
          return webDriver;
        }
      };
  }

  @AfterTest(alwaysRun = true)
  public void afterTest() {
    for (WebDriver driver : this.webDriverPool) {
      driver.quit();
    }
  }

  // Use this method instead of driver.get()
  public WebDriver getDriver() {
    return this.driverThread.get();
  }

}