簡體   English   中英

使用webdriver-factory運行Selenium Webdriver TestNG測試

[英]Run Selenium Webdriver TestNG tests using webdriver-factory

我通過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並通過navigation()方法具有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>

我認為logout(); 方法在這里不見了..

對於此問題,需要使用static driver字段。

我們在測試工作中遇到了類似情況。 我們還想利用TestNG並行化和Selenium Web驅動程序。 不幸的是,在啟用任何TestNG並行模式時,管理每個測試類中的Web驅動程序生命周期或嘗試使用持有Web驅動程序的靜態類都無效。 與活動的TestNG線程和實例化的Web驅動程序匹配的被測類和方法在工作時根本難以操作。 我們花更多的時間弄清楚Web驅動程序的生命周期,而不是真正的Web應用程序測試。

在您的情況下,因為您已經定義了<suite parallel="methods">當TestNG執行時,這些類將在一個線程上實例化,並處理所有適當的@批注。 但是,在“方法”並行模式下,TestNG在單獨的線程上實例化每個測試類的方法。 這些線程不知道並且無法利用可能已啟動Web驅動程序(靜態或其他方式)的任何已處理注釋。 因此,當您的方法執行時,您將獲得NPE。

我們有一個開源項目,該項目抽象了用於TestNG / Selenium測試的Web驅動程序生命周期管理。 它適當地支持每種TestNG並行模式,從而為每個被測類提供正確且有效的Web驅動程序。 它極大地幫助了我們的測試工作。 也許在您的情況下也可能有用。 或者,如果沒有其他讓您了解如何以不同的方式解決它的想法。 該項目在GitHub上的名稱為Concurrent Selenium TestNG(COSENG) 親切的問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM