这是在TestNG中执行此操作的一些方法。您基本上可以通过
@BeforeMethod和
@AfterMethod配置方法来管理Webdriver实例化和清理。因此,您需要确定如何与您的
@Test方法共享创建的webdriver实例。为此,您有三个选择:
- 您使用了一个
ThreadLocal
变体,因为TestNG向您保证它将执行@BeforeMethod
,@Test
并且@AfterMethod
都在同一线程中。
这是一个示例,向您展示了这一功能
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.remote.RemoteWebDriver; import org.testng.ITestResult; import org.testng.Reporter; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class TestClassSampleUsingThreadLocal { private static final ThreadLocal<RemoteWebDriver> drivers = new ThreadLocal<>(); @BeforeMethod public void instantiateBrowser(ITestResult testResult) { RemoteWebDriver driver = new ChromeDriver(); drivers.set(driver); } @Test(dataProvider = "dp") public void testMethod(String url) { Reporter.log("Launching the URL [" + url + "] on Thread [" + Thread.currentThread().getId() + "]", true); driver().get(url); Reporter.log("Page Title :" + driver().getTitle(), true); } @DataProvider(name = "dp", parallel = true) public Object[][] getData() { return new Object[][]{ {"http://www.google.com"}, {"http://www.stackoverflow.com"}, {"http://facebook.com"} }; } @AfterMethod public void cleanupBrowser() { RemoteWebDriver driver = driver(); driver.quit(); } private RemoteWebDriver driver() { RemoteWebDriver driver = drivers.get(); if (driver == null) { throw new IllegalStateException("Driver should have not been null."); } return driver; } }- 您可以通过
ITestResult
对象共享webdriver实例。这是一个示例,显示了实际效果。
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.remote.RemoteWebDriver; import org.testng.ITestResult; import org.testng.Reporter; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class TestClassSample { private static final String WEBDRIVER = "driver"; @BeforeMethod public void instantiateBrowser(ITestResult testResult) { RemoteWebDriver driver = new ChromeDriver(); testResult.setAttribute(WEBDRIVER, driver); } @Test(dataProvider = "dp") public void testMethod(String url) { Reporter.log("Launching the URL [" + url + "] on Thread [" + Thread.currentThread().getId() + "]", true); driver().get(url); Reporter.log("Page Title :" + driver().getTitle(), true); } @DataProvider(name = "dp", parallel = true) public Object[][] getData() { return new Object[][]{ {"http://www.google.com"}, {"http://www.stackoverflow.com"}, {"http://facebook.com"} }; } @AfterMethod public void cleanupBrowser(ITestResult testResult) { RemoteWebDriver driver = driver(testResult); driver.quit(); } private RemoteWebDriver driver() { return driver(Reporter.getCurrentTestResult()); } private RemoteWebDriver driver(ITestResult testResult) { if (testResult == null) { throw new IllegalStateException("testResult should have not been null."); } Object driverObject = testResult.getAttribute(WEBDRIVER); if (driverObject == null) { throw new IllegalStateException("Driver should have not been null."); } if (!(driverObject instanceof RemoteWebDriver)) { throw new IllegalStateException("Driver is not a valid webdriver object"); } return (RemoteWebDriver) driverObject; } }- 您可以将Webdriver实例化和清理过程提取到TestNG侦听器(该实现实现了一个
org.testng.IInvokedMethodListener
将创建的Webdriver设置为ITestResult
(如选项2所示)或的ThreadLocal
(如选项1所示)的侦听器。您可以找到有关此选项的更多详细信息以及我博客中的代码片段。



