使用webdriver-factory运行Selenium Webdriver TestNG测试

时间:2016-06-21 18:38:18

标签: java selenium selenium-webdriver

我通过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>

3 个答案:

答案 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)结束。亲切的问候。