0

I want to realize parallel test run with DataProvider for testing an input field.

Expected Result: Parallel tests for each text in DataProvider

  1. Open page
  2. Write "Text1" (or "Text2" or "Text3")
  3. Press "Search" button

Actual Result: One test with every strings in DataProvider as one

  1. Open page
  2. Write "Text1Text2Text3" (why so?)
  3. Press "Search" button

How I can solve this problem where every string in DataProvider inputing into the field? Here is my code bellow.

TestNG.xml:

<suite name="TestParallel" parallel="tests" thread-count="2" data-provider-thread-count="2" preserve-order="false" >
    <test name="ChromeTest">
        <parameter name="browser" value="Chrome" />
        <classes>
            <class name="com.test.DataProviderTestParallel"/>
        </classes>
    </test>
    <test name="FirefoxTest">
        <parameter name="browser" value="Firefox" />
        <classes>
            <class name="com.test.DataProviderTestParallel"/>
        </classes>
    </test>
    <test name="EdgeTest">
        <parameter name="browser" value="Edge" />
        <classes>
            <class name="com.test.DataProviderTestParallel"/>
            </class>
        </classes>
    </test>
</suite>

Test:

@BeforeTest
@Parameters("browser")
public static void initSelenium(String browser) throws Exception {
    // Check if parameter passed from TestNG is 'firefox'
    if(browser.equalsIgnoreCase("firefox")){
        // Create firefox instance
        FirefoxDriverManager.getInstance().setup();
        driver = new FirefoxDriver();
    }
    // Check if parameter passed as 'chrome'
    else if(browser.equalsIgnoreCase("chrome")){
        ChromeDriverManager.getInstance().setup();
        driver = new ChromeDriver();
    }
    // Check if parameter passed as 'Edge'
    else if(browser.equalsIgnoreCase("Edge")){
        EdgeDriverManager.getInstance().setup();
        driver = new EdgeDriver();
    }
    else{
        // If no browser passed throw exception
        throw new Exception("Browser is not correct");
    }
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}

@DataProvider(name = "forSearch", parallel = true)
    public Object[] forSearch() {
        return new Object[]{
                "Text1",
                "Text2",
                "Text3"
        };
    }

@Test(description = "Search text", dataProvider = "forSearch")
public void searchWithButton(String searchText) {
    SupportPageObject supportPage = new SupportPageObject();
    SearchResultPageObject searchResultPage = new SearchResultPageObject();
    supportPage.open();
    supportPage.isOpen();
    // Input text into field
    supportPage.writeQuestion(searchText);
    // Press "search" button
    supportPage.searchWithButton();
    searchResultPage.isOpen();
}

UPD: I've found that this issue reproducing when i have data-provider-thread-count is bigger than 1. In that case it opens thread-count number of windows and then on the last one input data-provider-thread-count times text from DataProvider. But still has no idea how to fix it and enter the DataProvider text into each opened window separately.

1 Answers1

0

You need to return an Object[][].

@DataProvider(name = "forSearch", parallel = true)
    public Object[][] forSearch() {
        return new Object[][]{
                new Object[] { "Text1"},
                new Object[] { "Text2"},
                new Object[] { "Text3"}
        };
    }
Grasshopper
  • 8,908
  • 2
  • 17
  • 32
  • Thank you for your answer. Please, help me to make it clear: In TestNG.xml my suite has to be parallel="tests" or parallel="instances" ? My webdriver initialization has to be BeforeTest or BeforeMethod ? – Ilya Yefimov Jun 17 '18 at 11:58
  • parallel = "tests" and in BeforeTest – Grasshopper Jun 17 '18 at 12:13
  • Unfortunately this doesn't help. Nevetheless, "instances" and in BeforeMethod don't write all DataProvider objects into one input field, but Edge works only in one instance (i.e. "tests" in BeforeTest) – Ilya Yefimov Jun 17 '18 at 14:39