NoSuchSessionExceptionの取得セッションIDがnullです。 quit()を呼び出した後にWebDriverを使用しますか?クロスブラウザを介してJavaテストを並行して実行するとエラーが発生します。
テストの実行は問題ないように見えますが、最終的にNoSuchSessionExceptionエラーが発生しました。ドライバはどこかで初期化する必要があることは理解していますが、その方法は明確ではありません。
プロジェクト情報:Selenium WD、Java、testng、maven。テストはジェンキンスで構築されており、ソースラボで実行されています。
メインクラスは次のようになります。
public class NewCustomerReg extends RemoteTestBase {
@Test (dataProvider = "browsers")
public void RegisterNewUser (String browser, String version, String os,
Method method) throws Exception {
this.createRemoteDriver(browser, version, os, method.getName());
Application app = new Application(driver);
app.homePage().homePageDisplayed();
Log.info("Validate Home Page");
app.homePage().registerToOrder.click();
Log.info("Click Register To Order link on the home page");
app.registerToOrderPage().registerAsNewCustomer.click();
Log.info("Click on Register As New Customer button");
driver.close();
}
メインクラスによって拡張されるRemoteTestBase:
public class RemoteTestBase {
public WebDriver driver;
private static String baseUrl;
ConfigFileReader configRead;
protected PropertyLoader propertyRead;
public Logger Log = Logger.getLogger(BasicTest_Local.class.getName());
private static final String SAUCE_ACCESS_KEY =
System.getenv("SAUCE_ACCESS_KEY");
private static final String SAUCE_USERNAME = System.getenv("SAUCE_USERNAME");
@BeforeMethod
@DataProvider(name = "browsers", parallel = true)
public static Object[][] sauceBrowserDataProvider(Method testMethod) throws
JSONException {
String browsersJSONArrayString =
System.getenv("SAUCE_ONDEMAND_BROWSERS");
System.out.println(browsersJSONArrayString);
JSONArray browsersJSONArrayObj = new JSONArray(browsersJSONArrayString);
Object[][] browserObjArray = new Object[browsersJSONArrayObj.length()]
[3];
for (int i=0; i < browsersJSONArrayObj.length(); i++) {
JSONObject browserObj =
(JSONObject)browsersJSONArrayObj.getJSONObject(i);
browserObjArray[i] = new Object[]{browserObj.getString("browser"),
browserObj.getString("browser-version"), browserObj.getString("os")};
}
return browserObjArray;
}
void createRemoteDriver(String browser, String version, String os, String
methodName) throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
Class<? extends RemoteTestBase> SLclass = this.getClass();
capabilities.setCapability("browserName", browser);
if (version != null) {
capabilities.setCapability("browser-version", version);
}
capabilities.setCapability("platform", os);
capabilities.setCapability("name", SLclass.getSimpleName());
capabilities.setCapability("tunnelIdentifier", "hdsupply");
driver = (new RemoteWebDriver(new URL("http://" + SAUCE_USERNAME + ":" +
SAUCE_ACCESS_KEY + "@ondemand.saucelabs.com:80/wd/hub"), capabilities));
randomuser = new RandomDataSelect();
configRead = new ConfigFileReader();
propertyRead = new PropertyLoader();
baseUrl = propertyRead.getProperty("site.url");
getURL();
}
private void getURL () {
driver.get(baseUrl);
driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);
this.annotate("Visiting page..." + driver.toString());
}
private void printSessionId() {
String message = String.format("SauceOnDemandSessionID=%1$s job-
name=%2$s",
(((RemoteWebDriver) driver).getSessionId()).toString(), "some job
name");
System.out.println(message);
}
@AfterMethod(description = "Throw the test execution results into saucelabs")
public void tearDown(ITestResult result) throws Exception {
((JavascriptExecutor) driver).executeScript("sauce:job-result=" +
(result.isSuccess() ? "passed" : "failed"));
printSessionId();
driver.quit();
}
void annotate(String text)
{
((JavascriptExecutor) driver).executeScript("sauce:context=" + text);
}
}
エラーログ:
Session ID is null. Using WebDriver after calling quit()?
Build info: version: '3.11.0', revision: 'e59cfb3', time: '2018-03-
11T20:26:55.152Z'
System info: Host: 'gfmwsb01lds.hsi.hughessupply.com', ip: '10.224.196.74',
os.name: 'Linux', os.Arch: 'AMD64', os.version: '2.6.32-504.8.1.el6.x86_64',
Java.version: '1.8.0_161'
Driver info: driver.version: RemoteWebDriver
org.openqa.Selenium.NoSuchSessionException: Session ID is null. Using
WebDriver after calling quit()?
Build info: version: '3.11.0', revision: 'e59cfb3', time: '2018-03-
11T20:26:55.152Z'
System info: Host: 'gfmwsb01lds.hsi.hughessupply.com', ip: '10.224.196.74',
os.name: 'Linux', os.Arch: 'AMD64', os.version: '2.6.32-504.8.1.el6.x86_64',
Java.version: '1.8.0_161'
Driver info: driver.version: RemoteWebDriver
at
org.openqa.Selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.
Java:125)
at org.openqa.Selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.
Java:545)
at org.openqa.Selenium.remote.RemoteWebDriver$RemoteWebDriverOptions
$RemoteTimeouts.implicitlyWait(RemoteWebDriver.Java:779)
at com.hdsupplysolutions.tests.RemoteTestBase.getURL(RemoteTestBase.Java:83)
at
com.hdsupplysolutions.tests.RemoteTestBase.createRemoteDriver(RemoteTestBase.
Java:75)
at
com.hdsupplysolutions.tests.***.RegisterNewUser(NewCustomerRegi.Java:23)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
Java:62)
at
Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.
Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:498)
at
org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocation
Helper.Java:124)
at org.testng.internal.Invoker.invokeMethod(Invoker.Java:580)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.Java:716)
at org.testng.internal.TestMethodWithDataProviderMethodWorker.call(
TestMethodWithDataProviderMethodWorker.Java:71)
at org.testng.internal.TestMethodWithDataProviderMethodWorker.call(
TestMethodWithDataProviderMethodWorker.Java:14)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:511)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.
Java:1149)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.
Java:624)
at Java.lang.Thread.run(Thread.Java:748)
何が起こっているのかについての説明は次のとおりです。
RegisterNewUser
でdriver.close()
を呼び出しています。これにより、現在のウィンドウが閉じます。開いているウィンドウが残っていない場合、ドライバーは終了します。したがって、tearDown
がdriver.quit()
を呼び出すと、セッションはすでに終了しており、エラーが発生します。
使用できるソリューション:
driver.close()
を呼び出さず、ティアダウンで処理させてくださいまたは
driver.quit()
を呼び出します。