• Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)


    selenium操作chrome浏览器需要有ChromeDriver驱动来协助。webdriver中关浏览器关闭有两个方法,一个叫quit,一个叫close。

    1   /**
    2    * Close the current window, quitting the browser if it's the last window currently open.
    3    */
    4   void close();
    5  
    6   /**
    7    * Quits this driver, closing every associated window.
    8    */
    9   void quit();

    通过查看以上官方声明文档,可以看出close方法是关闭当前窗口,这个当前如何理解?就是driver实例操作的页面,叫当前。如果当前窗口只有一个tab,那么这个close方法就相当于关闭了浏览器。quit方法就是直接退出并关闭所有关联的tab窗口。所以,close方法一般关闭一个tab,quit方法才是我们认为的完全关闭浏览器方法。为了证明这个,我们用一个例子去演示:

     1 package lessons;
     2  
     3 import org.openqa.selenium.By;
     4 import org.openqa.selenium.WebDriver;
     5 import org.openqa.selenium.chrome.ChromeDriver;
     6  
     7 public class FindElement_LinkText {
     8     
     9     public static void main(String[] args) throws Exception {
    10         
    11         System.setProperty("webdriver.chrome.driver", ".\Tools\chromedriver.exe");
    12         
    13         WebDriver driver = new ChromeDriver();
    14         driver.manage().window().maximize();
    15         
    16         driver.get("https://www.baidu.com");
    17 
    18         driver.close();
    19         //driver.quit();
    20     }
    21  
    22 }

    通过切换注销最后两行代码,分别运行,观察这两种方法的实际效果。当使用close方法的时候,因为只有百度首页这个tab,所以会关闭浏览器,但是通过查看任务管理器发现,ChromeDriver进程仍存在内存中。如果使用quit方法,整个浏览器都直接关闭,ChromeDriver进程也会被结束。

     

    ChromeDriver是轻量级的服务,在单任务或不需要频繁启动浏览器的情况下,使用driver.quit()关闭浏览器,可以正常结束ChromeDriver进程。若在一个比较大的 测试套件中频繁的启动关闭,会增加一个比较明显的延时导致浏览器进程不被关闭的情况发生,为了避免这一状况我们可以通过ChromeDriverService来控制ChromeDriver进程的生死,达到用完就关闭的效果避免进程占用情况出现(Running the  server in a child process)。具体实现如下:

    1 ChromeDriverService service = new ChromeDriverService.Builder() .usingChromeDriverExecutable(new File("E:\Selenium WebDriver\chromedriver_win_23.0.1240.0\chromedriver.exe")).usingAnyFreePort().build();
    2 service.start();
    3 driver = new ChromeDriver();
    4 driver.get("http://www.baidu.com");
    5 driver.quit();
    6 // 关闭 ChromeDriver 接口
    7 service.stop();

     

    以上讨论的均是java版的实现,对于python来说是使用service库来实现控制chromedriver的开启和关闭。

    1 from selenium.webdriver.chrome.service import Service

    创建的时候需要把chromedriver.exe的位置写在Service的XXX部分,需要调用他的命令行方法,不然报错,然后启动就可以了。

    1 c_service = Service('xxx')
    2 c_service.command_line_args()
    3 c_service.start()
    4 driver = webdriver.Chrome()
    5 driver.get("http://www.baidu.com")

    关闭的时候用quit而不是采用close,close只会关闭当前页面,quit会退出驱动并且关闭所关联的所有窗口,最后执行完以后就关闭。

    driver.quit()
    c_service.stop()

     

    嫌麻烦也可以直接使用python的os模块执行下面两句话结束进程

    1 os.system('taskkill /im chromedriver.exe /F')
    2 os.system('taskkill /im chrome.exe /F')

     

  • 相关阅读:
    自食其力!ASP.NET 4打造HTML5视频控件
    delphi 拖放操作http://topic.csdn.net/t/20030306/10/1497344.html?1026446129
    delphi开发的小技巧http://www.cto360.com/a/5000086716.shtml
    TThread 类 详细解析 (原帖 华夏黑客同盟)http://www.cppblog.com/Khan/archive/2006/11/21/15503.html
    delphi 多线程同步 互斥变量,信号量,事件对象。http://www.bianceng.cn/Programming/Delphi/200912/12689.htm
    如何利用socket进行HTTP访问http://blog.csdn.net/sanfengshou/archive/2011/03/07/6228250.aspx
    TCP, Scoket, HTTP
    Delphi开发嵌入式IE浏览器监控程序http://www.pasou.cn/edu/html/List3899_3.html
    Delphi实现网络蚂蚁和FlashGet的悬浮窗口,拖动
    delphi调用C#写的web服务例子(重点 InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocument);)
  • 原文地址:https://www.cnblogs.com/muchengnanfeng/p/9553186.html
Copyright © 2020-2023  润新知