Selenium Grid2:并行测试同时在同一个浏览器上运行

时间:2014-04-23 02:07:41

标签: selenium testng selenium-grid

我有两个配置相同的节点(Win7,ie9)。我将testNG设置为同时对每个节点执行两次测试。 Selenium Grid同时打开两个浏览器(每个节点一个),但测试似乎只在一个浏览器中执行 - 用户名在同一个浏览器中输入两次。如果我设置thread-count=1,则两个测试都会成功。

testNG测试套件xml文件:

<suite name="ExampleTest" parallel="tests" thread-count="2"> 
    <test name="ExampleTest1">
        <classes>
            <class name="com.mycompany.testsuites.GridTest">
                <methods>
                    <include name="test1"></include>
                </methods>
            </class>
        </classes>
    </test>
    <test name="ExampleTest2">
        <classes>
            <class name="com.mycompany.testsuites.GridTest">
                <methods>
                    <include name="test2"></include>
                </methods>
            </class>
        </classes>
    </test>

测试类GridTest:

public class GridTest {

    private WebDriver driver;
    String hubUrl = "http://12.11.14.15:4444/wd/hub";

    @BeforeClass
    public void beforeClass() throws MalformedURLException {
        DesiredCapabilities capability = DesiredCapabilities.internetExplorer();
        driver = new RemoteWebDriver(new URL(hubUrl), capability);
        Page.setUp(driver);  //Page is the base class of all page objects.
                             //The static setUp method assign a WebDriver object 
                             //to static Page.driver, which shared by all pages.
    }

    @AfterClass
    public void afterClass() {
        driver.quit();
    }

    @Test
    public void test1() {
        driver.get("http://12.11.15.16");
        LoginPage login = new LoginPage();
        login.setUp();                  // set up the Login Page
        login.txtUsername().clear();    //clear the username input box
        login.txtUsername().sendKeys("username");    // input user name
        // ...
    }

    @Test
    public void test2() {
        driver.get("http://12.11.15.16");
        LoginPage login = new LoginPage();
        login.setUp();
        login.txtUsername().clear();
        login.txtUsername().sendKeys("username");
        // ...
    }
}

我使用selenium-server-standalone-2.41.0.jar作为集线器和节点。

3 个答案:

答案 0 :(得分:7)

您看到的行为是正确的。

驱动程序是在@beforeClass中创建的,只执行一次,因此只创建了一个浏览器,这两个浏览器同时使用。

如果要更改为@beforeMethod,则每次测试都会创建一个浏览器但是这仍然会失败,因为正在使用相同的变量(驱动程序)来存储驱动程序实例。您会看到两个浏览器打开,但两个测试都在第二个中执行。

要在测试级别运行并行,那么您需要确保每个测试都是完全封装的,例如在自己的上下文中创建自己的驱动程序,这不允许您使用设置和拆除。

通常我总是在类级别运行并行,因为这种方法允许您仍然使用设置和拆除来创建驱动程序实例。我建议更改XML以运行parallel = classes。显然你必须拥有多个类,但我认为实际上你有两个以上的测试要运行!

答案 1 :(得分:0)

我会将 test1()放在一个类中,并将 test2()放在一个单独的类中,而不是尝试按方法并行化。然后,TestNG将没有任何问题。只需look at how I did it here

如果您想要按方法分叉,可以完成,但在TestNG中进行配置要困难得多。我个人从来没有工作过。当我通过方法尝试并行时,它似乎对我没有任何作用......它的行为与类并行相同。我知道这只是一个配置问题。

事实上,我最近在这个领域进行了体验in this project,但我对它最终如何运作仍然不满意。

当然,您可能已经知道这一点,您需要确保已将网格节点配置为支持2个或更多线程,否则即使您明确分叉,它也会被限制为默认值(1?)。

答案 2 :(得分:0)

我遇到了同样的问题,因为它是一个静态WebDriver驱动程序。删除静态调用后,并行=&#34;测试&#34;工作得很好;

尝试删除您的私人电话并执行相同的配置。