2

请告诉我使用 Web-driver + TestNG 框架的休闲场景的示例代码。

一类有多项测试。在运行这些测试时,它应该同时在同一浏览器(例如:Firefox)的多个实例中并行运行所有测试。因此,对于每个测试,它都应该打开一个浏览器的新实例。

4

1 回答 1

2

到目前为止,我的解决方案是这样的:

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()。

于 2012-07-24T17:49:10.843 回答