web-dev-qa-db-ja.com

NoSuchSessionExceptionセッションIDがnullです。 quit()を呼び出した後にWebDriverを使用しますか? Javaテストを並行して実行する場合

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)
2
Y_Sh

何が起こっているのかについての説明は次のとおりです。

RegisterNewUserdriver.close()を呼び出しています。これにより、現在のウィンドウが閉じます。開いているウィンドウが残っていない場合、ドライバーは終了します。したがって、tearDowndriver.quit()を呼び出すと、セッションはすでに終了しており、エラーが発生します。

使用できるソリューション:

  • テストでdriver.close()を呼び出さず、ティアダウンで処理させてください

または

  • 分解では、有効なセッションを確認し、セッションが存在する場合にのみdriver.quit()を呼び出します。
5
Corey Goldberg