Java 使用TestNG并行运行Selenium测试会导致错误

Java 使用TestNG并行运行Selenium测试会导致错误,java,selenium,testng,selenium-grid,Java,Selenium,Testng,Selenium Grid,我正在构建一个selenium网格框架,使用两个VM作为节点(一个是chrome,另一个是Firefox)。当我以系列方式运行示例测试时,它们不会出现任何问题。然而,当我并行运行它们时,Chrome中的测试只会启动我正在测试的网站,而其他什么都不做,Firefox浏览器可以完美地运行测试(在测试结束时打印消息,向我显示它通过了,至少它应该通过了。当套件完成运行时,测试告诉我chrome通过了(它没有通过)Firefox抛出一个element not found异常。我知道我的问题与防止线程交叉有

我正在构建一个selenium网格框架,使用两个VM作为节点(一个是chrome,另一个是Firefox)。当我以系列方式运行示例测试时,它们不会出现任何问题。然而,当我并行运行它们时,Chrome中的测试只会启动我正在测试的网站,而其他什么都不做,Firefox浏览器可以完美地运行测试(在测试结束时打印消息,向我显示它通过了,至少它应该通过了。当套件完成运行时,测试告诉我chrome通过了(它没有通过)Firefox抛出一个element not found异常。我知道我的问题与防止线程交叉有关,但这是我第一次设置类似的东西,我不知道如何调试它

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default suite" thread-count="2" parallel="tests">
    <test verbose="2" name="Chrome">
        <parameter name="browserName" value="chrome"/>
        <parameter name="nodeURL" value="http://10.11.25.170:5551/wd/hub"/>
        <packages>
            <package name="com.company.*"></package>
        </packages>
    </test>
    <test verbose="2" name="Firefox">
        <parameter name="browserName" value="firefox"/>
        <parameter name="nodeURL" value="http://10.11.25.170:5552/wd/hub"/>
        <packages>
            <package name="com.company.*"></package>
        </packages>
    </test>
</suite>
TestBase.java

public class TestBase extends Base {


    @BeforeMethod
    @Parameters({"browserName", "nodeURL"})
    public void beforeTest(String browserName, String nodeURL) throws MalformedURLException {
        Base b = new Base();
        driver = b.getDriver(browserName, nodeURL);
        //driver = b.getLocalDriver();      
    }

    @AfterMethod
    public void afterTest() {       
        driver.quit();
    }   
}
LoginTest.java

public class LoginTest extends TestBase {

    @Test
    public void one() throws IOException {
        driver.get("http://company.com");

        EmailModal modal = new EmailModal();
        modal.cancelModal();

        Header header = new Header();
        header.clickSignInLink();

        System.out.println("Page Title is: " + driver.getTitle());
    }

}
EmailModalPage.java

public class EmailModalPage extends Base {
    public WebElement emailModalCancelButton() {
        return driver.findElement(By.cssSelector("a[class='js-closeLayer closeLayer fr'")) ;  
        // ^^^ Line 11, where the error was thrown
    }
}
EmailModal.java

public class EmailModal extends EmailModalPage {
    public void cancelModal() {
        emailModalCancelButton().click();
    }
这是删除静态关键字时引发的错误:

java.lang.NullPointerException
    at com.company.automation.ecom.pages.EmailModalPage.subscribeToEmailModal(EmailModal_.java:11)

尝试删除Base.java中驱动程序声明中的static关键字。这将为每个测试生成一个新的驱动程序,并避免您看到的问题。这是有道理的,但现在它在电子邮件模式后面的对象定义上抛出了一个
NullPointerException
(最初在
LoginTest.java
中调用。我对java相当陌生,你认为这是为什么?它与
driver
上的静态定义一起工作。如果没有看到EmailModal的类,就很难猜到。我想是的……我现在添加了/EmailModal和EmailModalPage类。谢谢你的帮助!请为我分享代码com.company.automation.ecom.pages.EmailModalPage类,方法“subscribeToEmailModal()”,由此产生此异常。
java.lang.NullPointerException
    at com.company.automation.ecom.pages.EmailModalPage.subscribeToEmailModal(EmailModal_.java:11)