会话ID为空。调用quit()后使用Web驱动程序?代码在chrome,ie11和edge浏览器中正确执行,但在firefox 55.0.3中没有

时间:2017-09-12 07:19:33

标签: google-chrome selenium firefox geckodriver

这是我调用webdriver的代码。

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浏览器。

3 个答案:

答案 0 :(得分:2)

你的问题是你的closeBrowser方法。

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

每个司机在工作上都有细微差别。当你有一个铬驱动程序。您可以在任何时间调用webdriver对象上的退出

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

这是因为chromedriver会忽略这些。执行close方法时,它会关闭当前窗口。如果没有剩下的窗口,浏览器也会退出。退出其他案例将始终关闭所有窗口并退出驱动程序。

对于firefox,第一次关闭,关闭当前窗口并退出驱动程序。下次发送退出时,它没有会话ID来退出驱动程序。这就是为什么你得到错误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;
}

所有人都应该工作

答案 1 :(得分:0)

如果使用的是Page Factory,请确保将驱动程序传递给pageObject类以对其进行初始化。这更可能是问题所在。

答案 2 :(得分:0)

我面临着同样的问题。

https://github.com/mozilla/geckodriver/releases安装最新发布的驱动程序解决了我的问题。