在DataProvider上将parallel设置为true时,测试的并行执行会引发异常。

问题描述 投票:0回答:1
在DataProvider上,当parallel = true时,测试的并行执行将引发以下异常。两个浏览器实例将打开并在单独的线程上运行,但是只有一个浏览器实例将成功执行,而另一个浏览器实例则被困在试图查找元素并引发异常的过程中。请,当dataprovider中的parallel = true时,如何使测试成功执行。我想念BasePage中的WebDriver实例。请帮忙。谢谢。

[PoolService-1] 15:44:06,447 INFO [Default test] Close driver PASSED: loginTest("[email protected]", "123456") FAILED: loginTest("[email protected]", "123456") WARNING: WebDriverException thrown by findElement(By.xpath: //button[contains(text(), 'NO THANKS')]) org.openqa.selenium.WebDriverException: org.apache.http.conn.HttpHostConnectException: Connect to localhost:8478 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect

当dataprovider上的parallel = false时,当数据被馈送到测试并成功执行时,测试将一次打开一个浏览器实例。 

PASSED: loginTest("[email protected]", "123456") PASSED: loginTest("[email protected]", "123456")

这是我编写的代码:

1)BrowserFactory

public class BrowserDriverFactory { private ThreadLocal<WebDriver> driver = new ThreadLocal<WebDriver>(); private String browser; private Logger log; public BrowserDriverFactory(String browser, Logger log) { this.browser = browser.toLowerCase(); this.log = log; } public WebDriver createDriver() { // Create driver log.info("Create driver: " + browser); if(browser.equals("chrome")) { System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver.exe"); driver.set(new ChromeDriver()); } else if(browser.equals("firefox")) { System.setProperty("webdriver.gecko.driver", "src/main/resources/geckodriver.exe"); driver.set(new FirefoxDriver()); } else { System.out.println("Do not know how to start: " + browser + ", starting chrome."); System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver.exe"); driver.set(new ChromeDriver()); } return driver.get(); } }

2)BaseTest

public class BaseTest { protected WebDriver driver; public WebDriverWait wait; protected Logger log; protected FirefoxProfile profile; protected String url = "http://www.qaclickacademy.com/"; protected String testSuiteName; protected String testName; protected String testMethodName; @BeforeMethod(alwaysRun = false) public void setUp(Method method, ITestContext ctx) { String testName = ctx.getCurrentXmlTest().getName(); log = LogManager.getLogger(testName); BrowserDriverFactory factory = new BrowserDriverFactory(config.getBrowser(), log); driver = factory.createDriver(); driver.get(url); profile=new FirefoxProfile(); // Set preferences for file type profile.setPreference("browser.helperApps.neverAsk.openFile", "application/octet-stream"); driver.manage().window().maximize(); wait = new WebDriverWait(driver, 5); this.testSuiteName = ctx.getSuite().getName(); this.testName = testName; this.testMethodName = method.getName(); } @AfterMethod(alwaysRun = true) public void tearDown(ITestResult result) { if(result.getStatus()==ITestResult.FAILURE) { //capture screenshot } log.info("Close driver"); // Close browser driver.quit(); } }

3)DataProvider

@DataProvider(name="SearchProvider", parallel=true) public Object[][] getDataFromDataprovider(){ return new Object[][] { { "[email protected]", "123456" }, { "[email protected]", "123456" } }; }

4)BasePage

public class BasePage { protected WebDriver driver; public WebDriverWait wait; protected Logger log; public BasePage(WebDriver driver, Logger log) { this.driver = driver; this.log = log; wait = new WebDriverWait(driver, 5); } protected void sleep(long millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } } protected void clickStallElement(By locator) { try { waitForVisibilityOf(locator, 30); findElement(locator).click(); } catch(org.openqa.selenium.StaleElementReferenceException ex) { waitForVisibilityOf(locator, 30); findElement(locator).click(); } } /** Open page with given URL */ protected void openUrl(String url) { driver.get(url); } /** Find element using given locator */ protected WebElement findElement(By locator) { return driver.findElement(locator); } /** Find all elements using given locator */ protected List<WebElement> findAllElements(By locator) { return driver.findElements(locator); } /** Click on element with given locator when its visible */ protected void click(By locator) { waitForVisibilityOf(locator, 30); findElement(locator).click(); log.info("Clicked WebElement"); } ... }

5)BaseTest

public class SignInPageTest extends BaseTest { @Test(dataProvider = "SearchProvider", dataProviderClass = DBDataProvider.class) public void loginTest(String username, String password) { System.err.println("Running Test=> " + this + " -> on thread [" + Thread.currentThread().getId() + "]"); log.info("Starting LogInTest # for " + username); ClickAcadamyLandingPage home = new ClickAcadamyLandingPage(driver, log); home.openPage(); home.closeNewsLetterPopup(); // click login ClickAcadamyLoginPage loginPage = new ClickAcadamyLoginPage(driver, log); loginPage = home.clickLoginBtn(); loginPage.enterEmailAddress(username); loginPage.enterPassword(password); ClickAcadamyDashboard dashboard = loginPage.clickLogin(); dashboard.clickLogout(); } }

6)testng.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite" data-provider-thread-count = "2" thread-count="2" verbose="1" parallel="tests"> <listeners> <listener class-name="com.paralleltest.basetest.TestListener"/> </listeners> <test name="loginTest"> <classes> <class name="com.paralleltest.SignInPageTest"/> </classes> </test> </suite>

在DataProvider上,当parallel = true时,测试的并行执行将引发以下异常。两个浏览器实例将在单独的线程上运行,但是只有一个浏览器实例将执行...
java selenium-webdriver automated-tests testng testng-dataprovider
1个回答
0
投票
问题出在您的测试代码中。当您并行运行测试并由数据提供者提供支持时,您的webdriver实例将在测试方法之间共享。
© www.soinside.com 2019 - 2024. All rights reserved.