![](/img/trans.png)
[英]Running Parallel Tests using Selenium WebDriver, Selenium Grid and 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.