【问题标题】:Run Selenium Webdriver TestNG tests using webdriver-factory使用 webdriver-factory 运行 Selenium Webdriver TestNG 测试
【发布时间】:2016-06-21 18:38:18
【问题描述】:

我通过 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 套件 - 它工作正常。但是,如果我尝试按套件运行我的所有测试,LoginPage - 通过并且 LogoutPage 通过 navigate() 方法具有 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>

【问题讨论】:

  • 哪个元素给了你这个 NullPointerException?
  • @YuZhang driver.get(url);

标签: java selenium selenium-webdriver


【解决方案1】:

我认为 logout();这里缺少方法..

【讨论】:

  • 你的意思是@Test方法logout();
【解决方案2】:

对于这个问题需要使用static driver字段。

【讨论】:

    【解决方案3】:

    我们在进行测试时遇到了类似的情况。我们还想利用 TestNG 并行化以及 Selenium Web 驱动程序。不幸的是,在启用任何 TestNG 并行模式时,在每个测试类中管理 Web 驱动程序生命周期或尝试使用包含 Web 驱动程序的静态类都无效。将测试中的类和方法与活动的 TestNG 线程和实例化的 Web 驱动程序相匹配是很笨拙的。我们花更多的时间来确定 Web 驱动程序的生命周期,而不是进行真正的 Web 应用程序测试。

    在您的情况下,由于您在执行 TestNG 时定义了 &lt;suite parallel="methods"&gt;,因此类在一个线程上实例化,并处理所有适当的 @ 注释。但是,在“方法”并行模式下,TestNG 在单独的线程上实例化每个测试类方法。这些线程不知道也无法使用任何可能已启动 Web 驱动程序(静态或其他方式)的已处理注释。因此,当您的方法执行时,您将获得 NPE。

    我们有一个开源项目,用于抽象出用于 TestNG/Selenium 测试的 Web 驱动程序生命周期管理。它正确支持每个 TestNG 并行模式,为每个被测测试类方法提供正确和活动的 Web 驱动程序。它对我们的测试工作有很大帮助。也许它也可能对您有用。或者,如果没有其他东西可以让您了解如何以不同的方式处理它。该项目在 GitHub 上以 Concurrent Selenium TestNG (COSENG) 结束。亲切的问候。

    【讨论】: