Selenium:获取chrome没有正确关闭

时间:2018-03-28 17:48:20

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

当我在我的selenium框架中重新打开Chrome浏览器时,我得到的chrome没有正确关闭错误消息。

在框架中我使用以下代码在每个测试用例的开头打开浏览器实例

if (browserType.equalsIgnoreCase("Chrome")) {
            try {                               
                System.setProperty("webdriver.chrome.driver", curProj+"\\drivers\\chromedriver.exe");
                ChromeOptions options = new ChromeOptions();
                options.setExperimentalOption("useAutomationExtension", false);
                options.addArguments("disable-infobars");
                //options.addArguments("user-data-dir=C:/Users/xw20/AppData/Local/Google/Chrome/User Data");
                options.addArguments(chromeProfile);
                webdriver = new ChromeDriver(options);
                logger.info("getWebDriver - Setting webdriver.chrome.driver system property as: " + System.getProperty("webdriver.chrome.driver"));
            }
            catch(IllegalStateException e) {
                logger.error("The path to the driver executable must be set by the webdriver.chrome.driver system property. ",e.fillInStackTrace());
                throw new IllegalStateException("The path to the driver executable must be set by the webdriver.chrome.driver system property.");
            }

并使用以下代码在最后结束

driver.close();
driver.quit();

但是当我为第二个测试用例打开浏览器时,我得到“chrome没有正确关闭”弹出消息。

我尝试在chrome配置文件的首选项文件中更新以下但没有运气

exit_type:Crashed
exited_cleanly:true

配置:

Chrome版本:版本64.0.3282.186(官方版本)(32位)

Selenium版本: 3.11.0

3 个答案:

答案 0 :(得分:2)

根据您的代码,在不知道您的框架结构的情况下分析错误 chrome没有正确关闭背后的原因是很困难的。也许有关如何调用代码块的更多细节(即 main() TestNG )可能对我们有所帮助。

话虽如此,仍有一些因素需要考虑如下:

  • 如果您通过 user-data-dir 使用现有的 Chrome配置文件,理想情况下应避免使用 setExperimentalOption addArguments 用于自定义,因为这些应在相应的 Chrome配置文件中设置。
  • 当您使用现有的 Chrome个人资料通过 user-data-dir 按照文档ChromeDriver - WebDriver for Chrome 路径应该指向配置文件目录,如下所示:

    options.add_argument("user-data-dir=C:/Users/xw20/AppData/Local/Google/Chrome/User Data/Profile 2")
    
  • 您可以在How to open a Chrome Profile through Python

  • 找到详细讨论
  • 避免使用driver.close();并始终在driver.quit()方法中调用tearDown(){}来关闭&正常销毁 WebDriver Web客户端实例。
  • 您可以在PhantomJS web driver stays in memory
  • 找到详细讨论
  • JDK 升级到最近的级别JDK 8u162
  • Selenium 升级到当前级别Version 3.11.0
  • ChromeDriver 升级到当前ChromeDriver v2.37级别。
  • Chrome 版本升级到当前 Chrome v65.x 级别。
  • 通过 IDE 清理您的项目工作区仅使用所需的依赖项重建项目
  • 使用CCleaner工具清除执行测试套件之前和之后的所有操作系统杂务。
  • 如果您的基本 Web客户端版本太旧,请通过Revo Uninstaller将其卸载并安装最新的GA和已发布的 Web客户端版本。
  • 执行@Test

答案 1 :(得分:1)

您是否设置了exit_type:Normal,我目前正在测试开始之前,测试结束之后或可以正常工作。 在C#

 public static void FixChromeSingleProfile(string dataDir)
    {
        FileStream fs = new FileStream(dataDir, FileMode.OpenOrCreate);
        StreamReader sr = new StreamReader(fs);
        string json = sr.ReadToEnd();
        sr.Close();
        fs.Close();
        dynamic jsonDe = JsonConvert.DeserializeObject(json);
        if (jsonDe.profile.exit_type != "Normal")
        {
            jsonDe.profile.exit_type = "Normal";
            string r = JsonConvert.SerializeObject(jsonDe);

            StreamWriter sw = new StreamWriter(dataDir, false);
            sw.Write(r);
            sw.Close();
        }
    }

答案 2 :(得分:0)

此解决方案在Python中运行,并且100%有效,但是您也应该能够在Java中实现此解决方案。每当我使用完Selenium时,我就只调用close_windows函数。

def close_windows():

    windows = driver.window_handles

    for w in windows:
        driver.switch_to.window(w)
        driver.close()

    driver.quit()

close_windows()