运行 用于 IE、firefox、chrome 使用 @DataProvider 的 Selenium 脚本,但它仅同时调用一个浏览器三次;使用 TestNG

Running Selenium script for IE, firefox, chrome using @DataProvider but it is invoking only one browser thrice parallely; Using TestNG

我正在学习 Selenium Grid 并在我的机器上启动了 HUB 和 Node。

我的机器配置是:
OS: Windows8.1
FF 版本:38.0.5
Chrome版本:43.0
IE 版本:11

集线器:

java -jar selenium-server-standalone-2.45.0.jar -role hub

节点:

java -Dwebdriver.chrome.driver=C:\Third_Party_Browser_Drivers\chromedriver.exe -Dwebdriver.ie.driver=C:\Third_Party_Browser_Drivers\IEDriverServer.exe -jar selenium-server-standalone-2.45.0.jar -role webdriver -hub http://localhost:4444/grid/register -port 5555 -browser browserName=firefox,maxInstances=4 -browser browserName=iexplore,maxInstances=3 -browser browserName=chrome,maxInstances=2 -maxSession 4

我正在尝试借助 TestNG 中的@DataProvider 在所有浏览器中并行执行我的测试。下面是我的代码:

public class TestSample2 {

    public static WebDriver driver;
    public static DesiredCapabilities capabilities = null;


    @Test(dataProvider = "getData")
    public void testLogin(String username, String password, String browser) throws MalformedURLException, InterruptedException{

        System.out.println(browser);

        if (browser.equals("chrome")){
        capabilities = DesiredCapabilities.chrome();
        capabilities.setBrowserName("chrome");
        capabilities.setPlatform(Platform.ANY); 
        //driver = new RemoteWebDriver(new URL("http://10.0.0.11:5566/wd/hub"), capabilities);

        } else if(browser.equals("firefox")){
            capabilities = DesiredCapabilities.firefox();
            capabilities.setBrowserName("firefox");
            capabilities.setPlatform(Platform.ANY); 

        } else if(browser.equals("iexplore")){
            capabilities = DesiredCapabilities.internetExplorer();
            capabilities.setBrowserName("iexplore");
            capabilities.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true);
            capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);

            capabilities.setPlatform(Platform.WINDOWS);


        }

        driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capabilities);
        driver.get("http://facebook.com");
        Thread.sleep(3000);
        driver.findElement(By.xpath("//input[@id='email']")).sendKeys(username);
        driver.findElement(By.xpath("//input[@id='pass']")).sendKeys(password);
        driver.quit();


    }

    @DataProvider(parallel = true)
    public Object[][] getData(){

        Object data[][] = new Object[3][3];

        //first data
        data[0][0] = "meganbody";
        data[0][1] = "meganlht";
        data[0][2] = "firefox";

        //second data
        data[1][0] = "megan";
        data[1][1] = "megaight";
        data[1][2] = "chrome";


        //third data
         data[2][0] = "megdy";
         data[2][1] = "anlight";
         data[2][2] = "iexplore";

         return data;
    }

}

我的 testng.xml 文件是:

  <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
  <suite name="TestNG Learning" parallel="tests" thread-count="3" >

     <test name="test_FF">
        <classes>
              <class name="Grid.TestSample2" ></class>  
        </classes>
      </test>
   </suite>

当我 运行 将 xml 文件作为 TestNG 时,我收到的输出为:

chrome
iexplore
firefox

测试用例成功。但是当我看到 Grid/console 时,它只显示 "one browser" 被调用;无论是 IE、FF 还是 chrome(因为我 运行 它有好几次)有 3 个实例。例如:并行调用IE浏览器三次。

我不明白我哪里错了。任何帮助!!

您有一个静态网络驱动程序对象。如果您 运行 并行,则相同的对象将被覆盖。 Dataprovider 正在正确传递数据,但驱动程序对象在您的所有测试中都被重用。由于对象共享,我希望您的测试随机失败。

要么将驱动程序对象放在@Test 范围内,要么考虑使用 threadlocal 来避免在线程之间共享驱动程序对象。