2016-06-21 179 views
0

我通過Java的webdriver-factory編寫了Selenium WebDriver的測試,並且遇到了測試問題。 我有測試此基類:使用webdriver-factory運行Selenium Webdriver TestNG測試

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!"); 
}} 

如果我跑我的TestNG的套房只有LoginTest - 它的工作原理是正確的。但是,如果我嘗試按套件運行所有測試,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> 
+0

哪個元素給了你這個NullPointerException? –

+0

@YuZhang'driver.get(url);' – Giymose

回答

0

我認爲logout();方法在這裏丟失..

+0

你的意思是'@ Test'方法'logout();'? – Giymose

0

對於這個問題需要使用static driver字段。

0

我們在與我們的測試工作類似的情況下掙扎。我們還希望利用TestNG並行化和Selenium Web驅動程序。不幸的是,在啓用任何TestNG並行模式時,管理每個測試類中的Web驅動程序生命週期或試圖使用持有Web驅動程序的靜態類都不奏效。使用主動TestNG線程和實例化的Web驅動程序來匹配正在測試的類和方法在工作時很難應付。我們花費更多的時間來搞清楚網絡驅動程序的生命週期,而不是進行真正的Web應用程序測試。

在你的情況,因爲你已經定義了<suite parallel="methods">當TestNG執行時,類在一個線程上被實例化,所有正確的@註解被處理。但是,使用「方法」並行模式,TestNG在不同的線程上實例化每個測試類方法。這些線程不知道,並且無法使用任何可能已啓動Web驅動程序的已處理註釋(靜態或其他方式)。因此,當你的方法執行時,你會得到NPE。

我們有一個開源項目,爲TestNG/Selenium測試抽象出Web驅動程序生命週期管理。它正確地支持每種TestNG並行模式,爲每個被測試的測試類方法提供正確和有效的Web驅動程序。這對我們的測試工作幫助很大。也許它也可以用於你的情況。或者如果沒有其他的東西給你一個關於你如何解決它的想法。該項目已在GitHub上發佈,名稱爲Concurrent Selenium TestNG (COSENG)。親切的問候。

相關問題