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