我通过Java的webdriver-factory为Selenium WebDriver编写测试,并且测试有问题。 我有这个测试的基类:
public class BaseTest {
private WebDriver driver;
@BeforeSuite
public void setUp() {
WebDriverFactory.setMode(WebDriverFactoryMode.SINGLETON);
this.driver = WebDriverFactory.getDriver(DesiredCapabilities.firefox());
driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(40, TimeUnit.SECONDS);
driver.manage().window().maximize();
}
protected LoginPage navigate(String url) {
driver.get(url);
return new LoginPage(driver);
}
@AfterSuite(alwaysRun = true)
public void tearDown() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (driver != null) {
WebDriverFactory.dismissAll();
}
}}
这两个类扩展了这个类:LoginTest和LogoutTest:
public class LoginTest extends BaseTest {
@Test
public void testLoginPage() {
LoggedPage lp = navigate(Constants.URL).
inputLogin(Constants.LOGIN).
selectDomain(Constants.DOMAIN).
inputPassword(Constants.PASSWORD).
login();
Assert.assertTrue(lp.
isUserEmailPresented(),
"User e-mail does not presented!");
lp.logout();
}}
public class LogoutTest extends BaseTest {
private LoggedPage logP;
@BeforeMethod()
public void login() {
logP = navigate(Constants.URL).
inputLogin(Constants.LOGIN).
selectDomain(Constants.DOMAIN).
inputPassword(Constants.PASSWORD).
login();
}
@Test
public void testLogout() {
LoginPage lp = logP.logout();
Assert.assertTrue(lp.
isLoginFieldPresented(),
"Login field does not presented!");
Assert.assertTrue(lp.
isPasswordFieldPresented(),
"Password field does not presented!");
Assert.assertTrue(lp.
isLoginButtonPresented(),
"Login button does not presented!");
}}
如果我只使用LoginTest运行我的testng套件 - 它的工作正确。但是,如果我尝试按套件运行我的所有测试,则通过navigate()方法传递LoginPage - 并且LogoutPage具有NullPointerException。我该如何解决? 我的套房:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Selenium Web Driver" parallel="methods" thread-count="3">
<test name="Selenium">
<classes>
<class name="functional.LoginTest"/>
<class name="functional.LogoutTest"/>
</classes>
</test>
</suite>
答案 0 :(得分:0)
我认为logout();方法在这里丢失..
答案 1 :(得分:0)
对于此问题,需要使用static driver
字段。
答案 2 :(得分:0)
我们在测试工作中遇到了类似情况。我们还希望利用TestNG并行化和Selenium Web驱动程序。不幸的是,在启用任何TestNG并行模式时,管理每个测试类中的Web驱动程序生命周期或尝试使用保存Web驱动程序的静态类都不是有效的。使用活动的TestNG线程和实例化的Web驱动程序匹配测试的类和方法在它工作时很难实现。我们花了更多时间来计算网络驱动程序生命周期,而不是参加真正的Web应用程序测试。
在您的情况下,因为您在TestNG执行时定义了<suite parallel="methods">
,所以在一个线程上实例化类,并且正在处理所有相应的@注释。但是,使用&#39;方法&#39;在并行模式下,TestNG在不同的线程上实例化每个测试类方法。这些线程不知道并且无法使用任何可能已启动Web驱动程序的静态或其他方式的已处理注释。因此,当您的方法执行时,您将获得NPE。
我们有一个开源项目,它抽象了TestNG / Selenium测试的Web驱动程序生命周期管理。它适当地支持每个TestNG并行模式,为每个测试的测试类方法提供正确和活动的Web驱动程序。它在我们的测试工作中给了我们很大的帮助。也许它也适用于您的情况。或者,如果没有别的东西让你知道如何以不同的方式解决它。该项目在GitHub上以Concurrent Selenium TestNG (COSENG)结束。亲切的问候。