【问题标题】:org.openqa.selenium.NoSuchSessionException: Session ID is null. Using WebDriver after calling quit()?org.openqa.selenium.NoSuchSessionException:会话 ID 为空。调用 quit() 后使用 WebDriver?
【发布时间】:2017-08-06 23:38:53
【问题描述】:

我已经进行了几次搜索,但仍然遇到同样的问题。我相信这可能是由于我的 webdriver 是静态的?我不太确定...

在我的主要课程中,我包括了@BeforeTest@AfterTest@BeforeTest 包括根据我的 XML 文件启动新浏览器 @AfterTest 包括 driver.quit(),它应该终止会话/驱动程序,以便第二个测试可以从 @BeforeTest 获得一个干净的驱动程序,不是吗?

这是我的浏览器声明:

public class Browser {  
public static WebDriver driver;
//Variable initialization
public static String title;
public static String url;
public static String currentBrowser;
public static boolean jseWorkAround;

public Browser(){
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}

//Browser launch
public static void launch(String browser){
    if(browser.equalsIgnoreCase("firefox")){
        driver = new FirefoxDriver();
        currentBrowser = "Firefox/";
        jseWorkAround = false;
        System.out.println("Firefox Selected");
    } else if (browser.equalsIgnoreCase("chrome")){
        driver = new ChromeDriver();
        currentBrowser = "Chrome/";
        jseWorkAround = false;
        System.out.println("Chrome Selected");
    } else if (browser.equalsIgnoreCase("edge")){
        driver = new EdgeDriver();
        currentBrowser = "Edge/";
        jseWorkAround = true;
        System.out.println("Edge selected");
    } else if (browser.equalsIgnoreCase("ie")){
        driver = new InternetExplorerDriver();
        currentBrowser = "IE/";
        jseWorkAround = true;
        System.out.println("IE Driver Selected");
    } else if (browser.equalsIgnoreCase("background")){
        driver = new PhantomJSDriver();
        currentBrowser = "Background/";
        jseWorkAround = false;
        System.out.println("Background selected");
    } else {
        throw new IllegalArgumentException("Invalid Browser");
    }
}

public static void quit(){
    driver.quit();
}

public static void goToPage(String pageurl){
    driver.get(pageurl);
}

这是一个随机样本测试:

    @Parameters({"browser"})
    @BeforeTest
    public void browserSelection(String browser){
        Browser.launch(browser);
    }

    @AfterTest
    public void cleanupAfterTest(){
        Print.line("Test complete. Cleaning up...");
        Browser.quit();
    }

    @Test
    public void Test1() {
        Browser.goToPage("http://www.google.com");
        Screenshot.page("Goes to google");

    }
    @Test
    public void Test2() {
        Browser.goToPage("http://www.yahoo.com");
        Screenshot.page("Goes to yahoo");

    }

我注意到,当事情开始失败并出现错误“调用退出后调用 webdriver”时,它总是第二次测试的结束。 浏览器之间的测试根据我的testng.xml 文件中提到的顺序依次进行。 如果我先运行 firefox 然后运行 ​​chrome,则最后一个 @Test 上的 chrome 测试将失败。 然而,如果我先运行 chrome 然后运行 ​​firefox,firefox 将在最后一个 @Test 上失败。

以下是错误信息...

org.openqa.selenium.NoSuchSessionException: Session ID is null. Using WebDriver after calling quit()?
Build info: version: 'unknown', revision: '1969d75', time: '2016-10-18 09:43:45 -0700'
System info: host: 'DESKTOP-5ED0H7O', ip: '10.0.9.239', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_121'
Driver info: driver.version: RemoteWebDriver
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:130)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:82)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:601)
    at org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:537)
    at utility.Scroll.toText(Scroll.java:43)
    at tests.TestCases.TCID20(TestCases.java:390)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:108)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:661)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:744)
    at org.testng.TestRunner.run(TestRunner.java:602)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
    at org.testng.SuiteRunner.run(SuiteRunner.java:289)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
    at org.testng.TestNG.runSuites(TestNG.java:1144)
    at org.testng.TestNG.run(TestNG.java:1115)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)

这种随机失败严重损害了我的进步。如果我在我的 XML 文件上一次只启用一个浏览器,而没有其他浏览器在线,则不会失败。

【问题讨论】:

  • "我相信这可能是由于我的 webdriver 是静态的。"您尝试删除静态修饰符了吗?

标签: java google-chrome selenium firefox selenium-webdriver


【解决方案1】:

我也遇到了同样的问题。请在下面找到我为解决此问题而遵循的流程:-

  1. 请确保您的代码中提到的驱动程序的路径是正确的,并且您在代码中引用的所有浏览器的“.exe”文件都可用。

  2. 现在,如果正确,请下载与您的系统兼容的最新驱动程序版本

    -> 从-https://chromedriver.chromium.org/downloads下载chrome驱动

    -> 从-https://github.com/mozilla/geckodriver/releases下载firefox驱动

    -> 从-https://www.seleniumhq.org/download/下载IE驱动

注意 - 如果您是 64 位系统,请下载 32 位版本,否则 IE 上的测试处理会很慢。

此外,请确保所有安全级别设置都正确,如该问题的答案中所述:

Not able to launch IE browser using Selenium2 (Webdriver) with Java

-> MicroSoftWebDriver for Edge 与您的操作系统构建版本兼容。有关更多详细信息,请查看此问题的详细答案(由我):-

Java/Selenium: Simple program to open Edge fails (dependency issue?)

执行上述步骤解决了我的问题

【讨论】:

    【解决方案2】:

    我看到你的问题是在加载浏览器之前运行@test(你必须增加等待时间)。另一件事是您没有添加任何优先级。首先,您获取浏览器的方式。你必须使用 geckodriver、chromedriver 等。

    尝试获取如下浏览器

    if (browser.equalsIgnoreCase("chrome")){
           System.setProperty("webdriver.chrome.driver", "/Path/ToChromeDriver/chromedriver.exe");
            driver = new ChromeDriver();
            System.out.println("Chrome Selected");
    }
    

    添加如下优先级

    Browser browser;
    
    @Parameters({"browser"})
    @BeforeTest
    public void browserSelection(String browser){
        browser.launch(browser);
        thread.sleep(5000);//Not recommended but timeout also may be an issue if so increase implicitly wait time 
    }
    
    @AfterTest
    public void cleanupAfterTest(){
        Print.line("Test complete. Cleaning up...");
        browser.quit();
    }
    
    @Test( priority = 1, description = "Test 1")
    public void setUserName(){
        Browser.goToPage("http://www.google.com");
        Screenshot.page("Goes to google");
    }
    
    @Test(priority = 2,description = "Test 2")
    public void setPassword(){
        Browser.goToPage("http://www.yahoo.com");
        Screenshot.page("Goes to yahoo");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      相关资源
      最近更新 更多