【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

这篇具有很好参考价值的文章主要介绍了【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

有位读者留言,遇到了一件两难全的事儿。在关闭Python使用os模块执行cmd命令调用的chromedriver驱动打开的chrome浏览器时,有以下问题~

  • 使用driver.quit()退出浏览器,chromedriver.exe进程退出,关闭没有窗口
  • 使用driver.close()退出浏览器,chromedriver.exe进程没有退出,窗口关闭

但是咱们这里全都要,下面就来解决它,顺便说一下关于杀死进程的事儿~

文章链接在这:

标题 链接
【Selenium】Selenium绕过检测 & 隐藏特征 【Selenium】Selenium绕过检测 & 隐藏特征

问题在这:
【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

解决方法如下:

  • 先关闭窗口,再杀掉 chromedriver.exe 进程。
driver.close()
driver.quit()

全文完~🎈🎈
下面且再吧啦一下吧🏹🏹


问题复现

这份代码贯穿全文,将用于多次示例。

执行以下代码,详情看动图

  • 执行以下代码,会启动一个名为 chromedriver.exe的进程,通过任务管理器 可看到
# -*- coding: utf-8 -*-
# Name:         hide_features.py
# Author:       小菜
# Date:         2022/8/29 15:43
# Description:

import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

if __name__ == '__main__':
    os.system(r'start chrome --remote-debugging-port=9527 --user-data-dir="F:\selenium"')
    options = Options()
    options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")
    driver = webdriver.Chrome(options=options)
    driver.get('https://bot.sannysoft.com/')
    # driver.quit()
    driver.close()

这个是 drivrt.quit()

  • 可以看到,chromedriver.exe 进程退出了,但窗口没有关闭

【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

这个是 drivrt.close()

  • 可以看到,chromedriver.exe 进程没有退出,但窗口关闭了。

【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

问题成功复现,下面解决它。


解决方法

全程注意打开 任务管理器,实时查看 chromedriver.exe进程的情况~

这里准备两种解决方法,

  1. 通过Python
  2. 通过Windows系统的taskkill(终止进程命令

两种方法

  • 直接杀死chrome进程
  • 杀死置顶端口的进程

Python实现

跟一下 driver.quit(),看到以下源码,不管执行成功与否,最终都是执行了 self.service.stop()

def quit(self) -> None:
    """
    Closes the browser and shuts down the ChromiumDriver executable
    that is started when starting the ChromiumDriver
    """
    try:
        super().quit()
    except Exception:
        # We don't care about the message because something probably has gone wrong
        pass
    finally:
        self.service.stop()

这里我们改一下代码,将 driver.quit() 修改 成以下

  • 先挂关闭浏览器,再停止service,可以达到杀死chromedriver.exe进程和关闭窗口的两全其美。
driver.close()
driver.service.stop()

然后执行代码,看以下动图

【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

完美解决问题~


Windows系统命令

这里会用到两个Windows的命令,分别是 netstattaskkill

可以通过以下链接获得更详细的介绍🎈

命令 链接
netstat https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/netstat
taskkill https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/taskkill

参数:

【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

netstat

命令用于显示活动的TCP链接、正在使用的端口等~

官方介绍截图如下:

【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

执行 driver.close() 的代码之后,chromedriver.exe 进程的状态还是 正在运行的,
现在打开电脑的cmd 窗口,输入以下命令,然后回车

netstat -ano | findstr 9527

代码释义( 查找所有活动的TCP连接中包含9527的连接

  • netstat -ano:显示活动的TCP连接
  • findstr:Windows系统命令,用于查找指定的包含的字符串
  • 9527:因为上面的代码中指定打开的端口是 9527

运行如下图所示:

【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

看到有两个TCP连接,这里后面跟的是它们的PID(Process Identification
干掉任意下面那个状态为CLOSE_WAIT进程 就可以结束 chromedriver.exe 进程啦🐱‍🏍

接下来去干掉它!!!

taskkill

Windows系统自带命令,用于结束一个或多个进程~

官方介绍截图如下:

【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

上面我们知道了 活动的 TCP连接,这里来干了它。

taskkill /f /t /pid 2024

代码释义(强制结束 pid2024 的进程,你需要改为你的进程 pid

  • /f:指定强制结束进程
  • /t:结束指定进程以及由该进程启动的任何子进程
  • /pid <processID>:指定要终止的进程的进程 ID。

运行如下图所示:

  • 成功结束chromederiver.exe进程【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

改写成 Python代码如下:

  • 同样可以达到杀死chromedriver.exe 进程的目的~
import os
result = os.popen('netstat -ano | findstr 9527 | findstr CLOSE_WAIT')
port = result.strip().split('      ')[-1]
os.popen(f'taskkill /f -t /pid {port}')

但是!!!
这个方法不是特别妙,有没有更妙的方法呢?答案是没有!不存在完美的方法🎃🎃


tasklist

显示本地计算机或远程计算机上当前正在运行的进程列表。

官方介绍截图如下:
【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

使用 tasklist 查看包含 chromedriver.exe的进程,然后再干掉它。

  • 会存在误杀,你开启了两个窗口,端口分别是1234 和 9527,但不清楚哪个窗口对应哪个端口,所以可能会误杀~
tasklist | findstr chromedriver.exe

如下图:

  • 可以获取到它的 PID,后面去干掉对应的 PID 就完事了

【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

结合写法

如果进程存在就kill 了它

tasklist | find /i "chromedriver.exe" > nul && taskkill /f /im "chromedriver.exe" > nul

关闭N个程序

思路发散一下,可以关闭多个电脑程序,不局限于Selenium浏览器的使用。

杀死指定进程

  • im: 指定要终止的进程的映像名称
taskkill /f /t /im chromedriver.exe

如下所示:

  • 杀死所有进程名为 chromedriver.exe 的进程
    【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

一行命令杀死多个进程

  • 这里干掉了4个进程树,甚至还关闭 cmd窗口~
  • 思路再发散一下,将平时经常会打开的程序都添加到这行代码里面去,然后编写成.bat批处理文件,一键执行关闭指定N个程序,实在不济,下面也还有个一键关闭所有程序的~
taskkill /f /t /im msedge.exe /im wps.exe /im Typora.exe /im cmd.exe

运行如下所示:
【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

干掉所有程序

taskkill /F /FI "USERNAME eq 【您的用户名】" /FI "IMAGENAME ne explorer.exe" /FI "IMAGENAME ne dwm.exe,

代码释义:

  • 意思是在此用户账户下筛选 explorer.exe(文件资源管理器)和 dwm.exe(桌面窗口管理器),将这两项强制终止进程,即可达到关闭所有程序的目的。

后话

see you.🐱‍🏍🐱‍🏍文章来源地址https://www.toymoban.com/news/detail-446509.html

到了这里,关于【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python运行selenium创建Edge浏览器更改默认下载路径的方法与防止程序结束后浏览器窗口自动关闭的方法

    结合chatgpt与csdn查阅资料后 得到解决方法: 其中 “D:Downloads_test”改为你自己想要默认下载路径, \\\"download.prompt_for_download\\\"为下载文件开始时Edge浏览器是否弹出另存为窗口,True则触发下载时会弹出另存为窗口,False则直接将文件下载到默认下载路径中。 另存为窗口长相如下

    2024年02月11日
    浏览(33)
  • 如何使用 WPF 用户控件关闭父窗口

    How to close parent windows using WPF User Control 如何使用 WPF 用户控件关闭父窗口 【问题描述】 假设有两个WPF窗口:window1和window2。 window1有一个按钮,单击此按钮将打开window2。window2包含一个用户控件。此用户控件有一个用于关闭window2的按钮。 怎样才能实现这个场景呢? 【解决方案

    2024年02月15日
    浏览(35)
  • selenium中出现 Other element would receive the click的解决方式

    用Python利用selenium操作点击复选框的时候,出现 Other element would receive the click错误。 要点击的复选框情况如图:   首次的时候,我用以下代码定位到复选框,并且点击 能定位到这个input,但是在click时报错,信息如下: 经搜索,问题的原因是Actual element is not visible within brow

    2024年02月05日
    浏览(42)
  • 使用JavaScript关闭浏览器窗口的几种方法

    在Web开发中,有时候我们需要通过JavaScript来控制用户的浏览器行为,其中之一就是关闭浏览器窗口。本文将介绍几种使用JavaScript关闭浏览器窗口的方法,并提供相应的源代码示例。 使用window.close方法关闭窗口 要关闭当前窗口,可以使用window.close方法。这个方法会关闭当前浏

    2024年02月04日
    浏览(42)
  • 学习使用php、js脚本关闭当前页面窗口的方法

    在开发web应用程序时,我们通常需要在不同的网页之间进行导航。通常情况下,当我们需要关闭当前网页时,我们会使用浏览器自带的关闭按钮或者使用JavaScript代码来实现。但是,在一些特定的情况下,我们可能需要在服务器端使用php代码来关闭当前窗口。 第一种方法是使

    2024年01月17日
    浏览(36)
  • 解决selenium4在部分电脑上运行时报异常GPU process launch failed: error_code=18无法打开浏览器窗口

    我在台式windows10上运行的一点问题没有的程序拷贝到同样操作系统的笔记本上运行就会报异常 刚开始一直是怀疑是没有添加禁用gpu加速参数导致,后来加上去--disable-gpu后还是报该异常。 最后将所有常用参数一个个尝试,添加--no-sandbox参数后解决。 示例:

    2024年02月11日
    浏览(34)
  • 使用selenium打开浏览器自动关闭及报错问题

    目录 1.问题 2.解决方案 3.安装后可能出现浏览器报错 \\\'msedgedriver\\\' executable needs to be in PATH 4.此时浏览器正常打开并不会出现闪退问题 安装python后,在运行Selenium的时候遇到一个问题,执行完程序,浏览器自动关闭了,我在程序中也没有写driver.quit()方法。代码如下: 当前seleni

    2024年02月17日
    浏览(31)
  • 软件测试|如何使用selenium操作窗口滚动条

    简介 我们在进行自动化测试工作的时候,如果页面内容过多,一次性加载耗时太长的话,会使用分段加载来加载页面内容,比如开始只加载页面顶端的内容,而如果要加载更多的数据,就需要我们向下滑动,让页面加载后续的内容;尤其是网页特别长的时候,我们往往需要滑

    2024年02月03日
    浏览(40)
  • Mac OS下 使用 osascript 指令,执行完可执行程序后,关闭当前已结束的终端(Terminal)窗口)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 最近在工作中需要使用shell 脚本的可执行程序,在shell里调用完成一些其他功能。Mac os下 执行的时候是调用终端(Terminal)。执行完成后会有一个已结束终端进程界面,一直在桌面显示,每次都需要手动

    2024年02月11日
    浏览(36)
  • 【前端】- 在使用Element UI 的el-tree组件时,从底层去研究如何去实现一键展开/关闭【tree节点】的功能

    点击前效果: 点击后效果: 页面部分:这里是简单的数结构渲染,不多讲,$refs.Reftree获取的是el-tree的实例,具体作用请看下面的方法。 方法部分:该方法传入el-tree实例,直接点击按钮即可实现展开或者关闭,这里简单讲解一下 1、ref.store.root.childNodes 通过实例来调用tree组

    2024年04月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包