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

Selenium Grid2:并行测试同时在同一浏览器上运行,selenium,testng,selenium-grid,Selenium,Testng,Selenium Grid,我有两个配置相同的节点(Win7、ie9)。我将testNG设置为同时对每个节点执行两个测试。Selenium Grid确实同时打开两个浏览器(每个节点一个),但测试似乎只在一个浏览器中执行——用户名在同一个浏览器中键入两次。如果我设置线程计数=1,两个测试都会成功 testNG测试套件xml文件: <suite name="ExampleTest" parallel="tests" thread-count="2"> <test name="ExampleTest1

我有两个配置相同的节点(Win7、ie9)。我将testNG设置为同时对每个节点执行两个测试。Selenium Grid确实同时打开两个浏览器(每个节点一个),但测试似乎只在一个浏览器中执行——用户名在同一个浏览器中键入两次。如果我设置
线程计数=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>
我使用selenium-server-standalone-2.41.0.jar作为集线器和节点。

我将test1()放在一个类中,并将test2()放在一个单独的类中,而不是尝试通过方法并行化。然后,TestNG将不会有任何问题。只是

如果您想通过方法进行fork,这是可以做到的,但在TestNG中进行配置要复杂得多。我个人从来没有让它工作过。当我尝试并行方法时,它似乎对我没有任何帮助。。。它的作用与类并行相同。我知道这只是一个配置问题

事实上,我最近在这方面进行了实验,但对于它最终的工作方式,我仍然不满意


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

您看到的行为是正确的

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

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

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


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

我也遇到了同样的问题,因为一个静态WebDriver。删除静态调用后,parallel=“tests”工作正常


尝试删除您的私有调用并执行相同的配置。

我添加了一些语句,如
System.out.println(“方法名:”+driver)“
,输出显示@beforeClass方法执行了两次,每个方法中的webdriver对象也不同。当我将parallel更改为
时,结果证明测试是依次执行的:test2首先执行,test1仅在test2完成时启动。但是你确实给了我解决这个问题的线索,现在我认识到了原因:我的所有pageobjects都共享来自其父类
Page
Page的相同静态WebDriver。每次执行beforeClass方法时,driver
都会被重新分配一个新值。酷,我想错了,我认为在法庭之前,我被执行了两次并为此道歉。我错过了static属性,因为这是a首先查找的内容,但是注意到驱动变量不是静态的,所以停止了。我仍然认为每个类运行会更好,尽管每个类仍然有几个测试,因为这样可以避免将来的问题。此外,将驱动程序作为构造函数传递给页面对象可能也是最好的方法,这与我给出的答案相同。基本上建议使用“班级级别”。是的,我知道你没有投我反对票。别担心。我想是那个人问的问题。这是一个获得帮助的好方法,呃,通过投票否决那些试图帮助的人。
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");
        // ...
    }
}