これは、ThreadLocal RemoteWebDriverを初期化する正しい方法ですか?パラレル実行に非静的WebDriverを使用する - Selenium - TestNG - Java
静的なWebDriverを持ってはいけないと言う人がいる記事を見ましたが、静的修飾子を削除するとNULLポインタ例外が発生します。
大部分はすべて正常に動作していますが、あるスレッドが別のスレッドでデータを入力することがあるという問題が発生しています。私はこれにつながる問題を解決しようとしています。
TestSetupクラス:
public class TestSetup {
private static ThreadLocal<RemoteWebDriver> threadDriver;// = new ThreadLocal<RemoteWebDriver>();
@Parameters({"browserParam"})
@BeforeClass(alwaysRun = true)
public void beforeClass(@Optional("") final String browserParam) throws InterruptedException, MalformedURLException {
// Set Driver
threadDriver = new ThreadLocal<RemoteWebDriver>()
{
@Override
protected RemoteWebDriver initialValue()
{
String browser = "Chrome";
DesiredCapabilities dc = new DesiredCapabilities();
if (browser.equals("Chrome"))
{
String chromeDriver = "C:\\workspace\\drivers\\chromedriver.exe";
System.setProperty("webdriver.chrome.driver", chromeDriver);
// Access Grid Hub
dc.setBrowserName(DesiredCapabilities.chrome().getBrowserName());
} // end Chrome
// Set the driver
try {
threadDriver.set(new RemoteWebDriver(new URL(hubURL), dc));
} catch (MalformedURLException e) {
e.printStackTrace();
}
return getDriver();
} // end initialValue
} // end threadDriver
} // end beforeClass
@AfterClass(alwaysRun = true)
public void afterClass() {
// Quit the Webdriver
getDriver().quit();
} // end afterClass
public RemoteWebDriver getDriver() {
return threadDriver.get();
} // end getDriver
} // end TestSetup class
LoginTestクラス:それはTestSetupクラスの静的でない場合
private Function perform = new Function();
@Test (retryAnalyzer = Retry.class, groups={"baseline", "negative"})
public synchronized void loginEmptyUsername() throws InterruptedException {
ExtentTest test = ExtentTestManager.getTest();
// Go to Secure
getDriver().get(StoredVariables.getsecureSite().get());
// Wait for password
perform.waitForElementToBeClickable(SLogin.password_txtbx(), "id");
// Clear email field
SLogin.email_txtbx(getDriver()).clear();
// enter password
SLogin.password_txtbx(getDriver()).clear();
SLogin.password_txtbx(getDriver()).sendKeys(StoredVariables.getpassword().get());
// click Sign In
SLogin.signIn_btn(getDriver()).click();
// Wait for error
perform.waitForElementToBeClickable(SLogin.loginError_txt(), "id");
// Verify error text
Assert.assertTrue(SLogin.loginError_txt(getDriver()).getText().contains("Oops! Your email or password (case sensitive) was incorrect. Please try again."));
// Log test
test.log(LogStatus.INFO, "login", "Tried logging in with an empty email");
} // end loginEmptyUsername
がどのようにテストクラスにwebdriverをを渡すでしょうか?
はUPDATEは:
(少なくとも現時点では)私の問題を解決した私の最初の実装を使用したが、5つのインスタンスの最大を利用とは対照的に、唯一の3つのインスタンスを許可するようにノードを制限することが表示されます。
私はあなたのソリューションを実現します(ただしRemoteWebDriverで)まだ、このため、別のスレッドにデータを入力する一つのスレッドの問題に実行している原因となっていますこれらのスレッドはいずれも期待されるデータを含んでいないために失敗します。 –
また、この設定では、test.xmlファイルに11個のクラスがあり、xmlファイルにはthread-count = "2"と表示され、最初の2つのクラスは正常に実行されますが、残りは実行されませんそれはセッションIDがヌルであると言います –
@ダストインN。本物のソリューションについては、このブログの投稿https://rationaleemotions.wordpress.com/2013/07/31/parallel-webdriver-executions-using-testng/をご覧ください。あなたが何をしているのかを見ずに何が間違っているのかを言う。しかし、私が共有した解決策によって、Webdriverのインスタンスがスレッド間でリークすることはありません。 –