【问题标题】:Selenium webdriver does not quit chrome driverSelenium webdriver 不会退出 chrome 驱动程序
【发布时间】:2015-05-21 07:51:01
【问题描述】:

我正在使用Selenium webdriver,但它没有正确退出chromechrome 驱动程序。一些进程停滞不前。

退出chrome的代码:

 driver.quit();

启动 chrome 的代码:

 System.setProperty("webdriver.chrome.driver","/<path to chrome driver>/chromedriver");
 ChromeOptions options = new ChromeOptions();
 options.setBinary(new File("/<path to chrome >/google-chrome"));
 driver = new ChromeDriver(options);

Chrome 驱动版本:2.9.248304 铬版本:40.0.2214.115 硒版本:2.32 操作系统:Linux java.version: 1.7.0_71

提前致谢, 奈拉

【问题讨论】:

  • 您遇到的错误是什么?
  • 你为什么使用 selenium 2.32? - 非常非常老了,升级到最新的(2.45)。
  • 你是如何保证你的driver.quit()实际上被执行的?
  • 如果它没有退出 chrome,那么它确定它没有遇到 driver.quit 或者你可能丢失了对 chrome 窗口的引用。
  • 只有 chrome 进程保持没有错误。我会尝试更改 selenium 版本。据我了解 driver.quit kill chrome processes ,但它没有正确杀死或者硒版本可能有问题?

标签: java selenium selenium-webdriver selenium-chromedriver


【解决方案1】:

您可以在这种情况下为 Web 驱动程序使用对象池模式,如下所示:
* * 这个类通过最终变量“DRIVER_INSTANCES”创建在 Main.java 类中定义的 WebDriver 实例池,并从该 Main 类中实例化这个池

public class WebDriverPool {
    public static Vector<WebDriver> driverPools = new Vector<WebDriver>();
    
    public static void initializeWebDriverPool() {
        for(int i=0; i<Main.DRIVER_INSTANCES; i++) {
            System.setProperty("webdriver.chrome.driver", "chromedriver.exe");

            // Add options to Google Chrome. The window-size is important for responsive sites
            ChromeOptions options = new ChromeOptions();
            //options.addArguments("headless");
            options.addArguments("window-size=1200x600");
            WebDriver driver = new ChromeDriver(options);
            driverPools.add(driver);
        }
        System.out.println("Driver pool initialized");
    }
    
    public static WebDriver getAndRemove() {
        WebDriver driver = driverPools.get(0);
        driverPools.remove(0);
        return driver;
    }
    
    /*
     * When our all the task are finished then this method is called from the Main.java class to close the running chrome instances
     */
    public static void quitAllDrivers() {
        for(WebDriver driver: driverPools) {
            driver.quit();
        }
        
    }
}

【讨论】:

    【解决方案2】:

    所以,没有什么对我有用。我最终做的是在我的 addArguments 上设置一个唯一 ID 以启动 chromedriver,然后当我想退出时,我会这样做:

    opts.addArguments(...args, 'custom-pid-' + randomId());
    

    然后确保它退出:

    await this.driver.close()
    await this.driver.quit()
    
    spawn(`kill $(ps aux | grep ${RANDOM_PID_HERE} | grep -v "grep" | awk '{print $2}')`)
    

    【讨论】:

      【解决方案3】:

      如果我使用它对我来说很好用

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

      【讨论】:

        【解决方案4】:

        我是这样解决的:

        import os
        
        os.system('killall chrome')
        

        如果您不将 Google Chrome 用于其他用途,它会很有用。

        【讨论】:

          【解决方案5】:

          1) 以单例方式获取驱动程序

          @Singleton
          class BrowserInstance {
          
          ChromeDriver getDriver(){
              ChromeOptions options = new ChromeOptions()
              options.addArguments("--headless --disable-gpu")
              return new ChromeDriver(options)
             }
          }
          

          2) 在 finally 块中使用 Close 并退出

           finally {
                  chromeDriver.close()
                  chromeDriver.quit()
              }
          

          结果:您一次只会使用一个实例,如果您看到任务管理器,您将不会发现 chromedriver 和 chrome 进程挂起。

          【讨论】:

            【解决方案6】:

            问题在于仅适用于 Chrome 的 driver.quit() 方法。驱动程序退出没有正常工作它没有杀死 chrome 的所有进程(包括子进程)。我做了什么。我更改了 Selenium jar 代码来为我的项目解决这个问题,不幸的是我不能共享我的代码,因为项目规则不允许共享任何类型的代码。

            【讨论】:

            • 当然,您受 IP 协议的约束。但是,如果你有逻辑,解释逻辑并没有错。那不是 IP。
            【解决方案7】:

            你是在 finally 块中执行你的 driver.quit() 吗?

            System.setProperty("webdriver.chrome.driver","/<path to chrome driver>/chromedriver");
            ChromeOptions options = new ChromeOptions();
            options.setBinary(new File("/<path to chrome >/google-chrome"));
            driver = new ChromeDriver(options);
            try
            {
                //automated steps
            }
            finally
            {
                driver.quit();
            }
            

            【讨论】:

            • 司机辞职。我通过日志和本地运行时看到它。但进程一次又一次地收集
            • 是的。我现在也使用 selenium 2.45。但是进程仍然收集。我能做什么?
            • 您还应该将 driver.quit() 放入第二个 try {} catch {} 块!它可能会抛出。
            猜你喜欢
            • 2013-10-16
            • 1970-01-01
            • 2016-06-21
            • 1970-01-01
            • 2014-03-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-09
            相关资源
            最近更新 更多