i通过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运行测试套件 - 它的工作正常。但是,如果我尝试按套件运行所有测试,则通过naullpointerexception(通过navigate()方法,登录页 - 通过logoutpage。我该如何修复?我的套房:
<?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>
我认为logout();方法在这里缺少..
对于此问题,需要使用static driver
字段。
我们在测试工作中遇到了类似情况。我们还想与Selenium Web驱动程序一起利用测试并并行。不幸的是,在启用任何testng并行模式时,在每个测试类中管理Web驱动程序生命周期或尝试使用静态类持有静态类。与Active TestNG线程和实例化Web驱动程序一起测试的类和方法的匹配类别和实例化的匹配类别是笨拙的。我们花更多的时间来弄清Web驱动程序生命周期比参加真实的Web应用程序测试。
在您的情况下,由于您已定义了<suite parallel="methods">
,因此在测试中执行类时,将在一个线程上实例化,并处理所有适当的 @ andotations。但是,使用"方法"并行模式,TestNG在单独的线程上实例化了每个测试类方法。这些线程没有意识到,无法利用可能启动Web驱动程序的任何处理的注释,即静态或其他方式。因此,当您的方法执行时,您将获得NPE。
我们有一个开源项目,该项目将Web驱动程序生命周期管理抽象进行测试/硒测试。它适当地支持每个测试平行模式,为正在测试的每个测试类方法提供正确且有效的Web驱动程序。这在我们的测试工作中极大地帮助了我们。也许在您的情况下也可以使用。或者,如果没有别的,您可以了解如何以不同的方式解决它。该项目已在GitHub上作为并发硒测试(COSENG)结束。善意。