Идентификатор сеанса равен нулю. Использование веб-драйвера после вызова quit()? код выполняется правильно в браузере Chrome, ie11 и Edge, но не в Firefox 55.0.3

Это мой код для вызова веб-драйвера.

public class WebDriverUtils {

private static final String karyahost = EnvironmentUtils.getProperty("karya.host", "");
private static final String karyaport = EnvironmentUtils.getProperty("karya.port", "");
private static final long timeOut = 15;
public static RemoteWebDriver webDriver = null;
private static WebDriverWait wait = null;

/**
 * Close the browser
 */
public static void closeBrowser() throws Exception{
    if (webDriver == null) {
        return;
    }
    webDriver.close();
    Thread.sleep(4000);
    webDriver.quit();
    webDriver = null;
}

/***
 * Wait for web element
 * @param element - element to be search
 */
public static void waitForElement(By element) {
    wait.until(ExpectedConditions.visibilityOfElementLocated(element));
}


/***
 * Go to the URL
 * @param url - url
 * @throws Exception
 */
public static void gotoUrl(String url) throws Exception {
    openBrowser();

    webDriver.navigate().to(getUrl(url));
}


/**
 * Launch the browser
 * @return
 * @throws Exception
 */
public static RemoteWebDriver openBrowser() throws Exception {
    if (webDriver != null) {
        return webDriver;
    }
    String browserType = EnvironmentUtils.getProperty("suite.browser.type", "FIREFOX");
    if (browserType.equalsIgnoreCase("CHROME")) {
        System.setProperty("webdriver.chrome.driver", FileUtils.getFile("driver/chromeDriver.exe")
                                                               .getAbsolutePath());
        webDriver = new ChromeDriver();
    } else {
        if (browserType.equalsIgnoreCase("FIREFOX")) {
            Runtime.getRuntime().exec("taskkill /F /IM geckodriver.exe");
            System.setProperty("webdriver.gecko.driver", FileUtils.getFile("driver/geckodriver.exe")
                    .getAbsolutePath());
            webDriver = new FirefoxDriver();
            maximizeBrowser();

        } else {
            if (browserType.equalsIgnoreCase("IE")) {
                System.setProperty("webdriver.ie.driver", FileUtils.getFile("driver/IEDriverServer.exe")
                        .getAbsolutePath());
                webDriver = new InternetExplorerDriver();
            } else {
                if (browserType.equalsIgnoreCase("Edge")) {
                    System.setProperty("webdriver.edge.driver", FileUtils.getFile("driver/MicrosoftWebDriver.exe")
                            .getAbsolutePath());
                    webDriver = new EdgeDriver();
                }
            }
        }
    }

    if (webDriver == null) {
        throw new Exception("Invalid browser type: " + browserType);
    }
    setWait(10);
    maximizeBrowser();
    wait = new WebDriverWait(webDriver, timeOut);
    return webDriver;
}

В firefox первый тестовый пример работает нормально, но когда я запускаю второй тестовый пример после того, как я дал webDriver.quit() и webDriver = null, чтобы я мог запускать тестовый пример один за другим, закрывая и открывая браузер, но я получаю следующее сообщение об ошибке.

org.openqa.selenium.NoSuchSessionException: Session ID is null. Using WebDriver after calling quit()?
Build info: version: '3.5.3', revision: 'a88d25fe6b', time: '2017-08-29T12:42:44.417Z'
System info: host: 'KARYA-45154KR', ip: '192.168.159.1', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_91'
Driver info: driver.version: SuiteDriver
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:131)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:82)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:646)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:703)
    at org.openqa.selenium.remote.RemoteWebDriver.close(RemoteWebDriver.java:532)
    at com.karya.utils.WebDriverUtils.closeBrowser(WebDriverUtils.java:40)
    at com.karya.test.suite.SuiteDriver.cleanUp(SuiteDriver.java:37)
    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(MethodInvocationHelper.java:80)
    at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:525)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:202)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:130)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:308)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1158)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1083)
    at org.testng.TestNG.run(TestNG.java:999)
    at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
    at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

Он отлично работает с версией Chrome 61.0.3163.79, IE 11 и браузером Edge.


person Divagar    schedule 12.09.2017    source источник
comment
первый тестовый пример будет работать нормально в firefox, но когда я запускаю второй тестовый пример, он показывает следующее сообщение об ошибке.   -  person Divagar    schedule 12.09.2017


Ответы (3)


Ваша проблема заключается в вашем методе closeBrowser.

webDriver.close();
Thread.sleep(4000);
webDriver.quit();

У каждого драйвера есть тонкие различия в их работе. Когда у вас есть хромированный драйвер. Вы можете вызывать quit для объекта webdriver любое количество раз

webDriver.quit();
webDriver.quit();
webDriver.quit();

Это потому, что chromedriver будет игнорировать их. Когда вы выполняете метод close, он закрывает текущее окно. Если окон больше не осталось, браузер также закрывается. quit в другом случае всегда закроет все окна и закроет драйвер.

В случае Firefox первое закрытие закрывает текущее окно и закрывает драйвер. В следующий раз, когда вы отправите выход, у него не будет идентификатора сеанса для выхода из драйвера. Вот почему вы получаете ошибку Session ID is null. Using WebDriver after calling quit(). Итак, основное правило, close is equivalent to quit if only 1 window is open

Таким образом, вы заменяете свой код как

public static void closeBrowser() throws Exception{
    if (webDriver == null) {
        return;
    }
    webDriver.quit();
    webDriver = null;
}

И все должно работать

person Tarun Lalwani    schedule 12.09.2017
comment
Тем не менее я получаю следующие сообщения об ошибках: 13 сентября 2017 г., 15:25:42 org.openqa.selenium.os.UnixProcess destroy INFO: невозможно слить потоки процессов. Игнорирование, но проглатывание исключения следует. org.apache.commons.exec.ExecuteException: превышено время ожидания остановки в 2000 мс (значение выхода: -559038737) - person Divagar; 13.09.2017
comment
но если я даю функцию webDriver.close, она выполняется только в первый раз для всех тестовых случаев, но не работает со второго раза, и мне нужно открыть диспетчер задач и завершить задачу для геккодрайверов. - person Divagar; 13.09.2017
comment
Сообщение об ошибке указывает на то, что процессы не уничтожаются должным образом. Вы используете Selenium Grid или локальные браузеры? - person Tarun Lalwani; 13.09.2017
comment
локальные браузеры - это то, что я использую. Если в этом случае, как я должен убить процессы - person Divagar; 14.09.2017
comment
Вы можете получить PID от ((UnixProcess) ((DriverCommandExecutor) ((FirefoxDriver) driverF).executor).service.process.process).executeWatchdog.getPID(). Потом спать после отказа. И убейте этот PID - person Tarun Lalwani; 14.09.2017
comment
где я хочу написать код, это немного запутанно - person Divagar; 14.09.2017
comment
В вашем closeBrowser. Получите PID перед вызовом quit. После этого засните несколько секунд и добавьте код для уничтожения процесса на основе его идентификатора. - person Tarun Lalwani; 14.09.2017
comment
@Divagar, если ответ решил вашу проблему, примите его как ответ, нажав кнопку с галочкой рядом с голосами. - person Tarun Lalwani; 01.06.2018

Если вы используете Page Factory, убедитесь, что вы передаете драйвер классу pageObject для его инициализации. Скорее всего, дело в нем.

person Chitrakannan    schedule 17.01.2019

Я столкнулся с той же проблемой.

Установка последнего выпущенного драйвера с https://github.com/mozilla/geckodriver/releases решена. моя проблема.

person Mansi    schedule 05.11.2019