Selenium 自动化高级操作与解决疑难杂症,如无法连接、使用代理等

在这里插入图片描述

解决 Selenium 自动化中的常见疑难杂症

这里记录一些关于 Selenium的常用操作和疑难杂症。

有一些细节的知识点就不重复介绍了,因为之前的文章中都有!

如果对本文中的知识点有疑问的,可以先阅读我以前分享的文章!

知识点📖📖

模块链接作用
seleniumhttps://www.selenium.dev/zh-cn/documentation/支持 web 浏览器自动化的一系列工具和库的综合项目

如果有看不懂的地方,可以结合我以前的文章一起看。

  • 【Selenium】控制当前已经打开的 chrome浏览器窗口

  • 【Selenium】控制当前已经打开的 chrome浏览器窗口(高级版)

  • Python模块psutil:系统进程管理与Selenium效率提升的完美结合

  • Selenium性能优化:一文带你快速上手!

TodoList:

  • 使用crx扩展插件进行代理修改(后续更新

初始化webdriver

  • ChromeService 是一个Service类,负责启动和停止 chromedriver。这个进程是运行自动化脚本的基础。

  • webdriver-manager 可以自动下载和管理 WebDriver 二进制文件,用于自动管理 webdriver驱动

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManagerdef init_driver(options=None) -> webdriver.Chrome:"""初始化浏览器驱动.Args:options(Options): chrome配置选项Returns:driver(WebDriver): 浏览器驱动对象"""return webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),options=options)

使用代理

  • 使用crx扩展插件进行代理修改(后续更新
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsif __name__ == '__main__':options = Options()proxy = "http://127.0.0.1:9527"options.add_argument(f'--proxy-server={proxy}')driver = init_driver(options=options)driver.get('https://www.bilibili.com/')

运行结果如下:

  • 可以请下的看到,所有请求的Remote Address 都是 127.0.0.1:7890

在这里插入图片描述

指定 Chrome 浏览器端口

启动浏览器

代码贴心的给出多项selenium 优化选项,根据需要来选择~

import subprocessdef start_chrome(browser_path, commands_list=None) -> None:"""启动浏览器。Args:browser_path(str): 浏览器安装的路径commands_list(List[str]): 启动浏览器的命令行参数,默认为NoneReturns:None"""commands = [browser_path]commands.extend(commands_list)# 启动浏览器subprocess.Popen(commands)if __name__ == '__main__':# 设置浏览器的路径和启动参数path = r"C:\Program Files\Google\Chrome\Application\chrome.exe"port = 9527cmd_map = {'指定浏览器配置': r'--user-data-dir=F:\selenium','指定远程调试端口': '--remote-debugging-port={}'.format(port),# '无头模式': '--headless',# '无沙盒模式': '--no-sandbox',# '指定页面加载策略': '--no-sandbox',# '禁用弹出拦': '--disable-popup-blocking',# '禁用图片加载': '--blink-settings=imagesEnabled=false',# '禁用GPU硬件加速': '--disable-gpu',# '禁用js': True,}start_chrome(path, list(cmd_map.values()))

连接浏览器

注意!这里Selenium WebDriver 将附加到一个已经运行的 Chrome 实例上,而不是启动一个新的浏览器实例。这意味着 WebDriver 将使用现有浏览器实例的设置,包括网络和代理配置。即无法使用上处的方法进行指定代理。

具体步骤如下:

  1. 导入 Selenium 相关模块。
  2. 创建 Chrome 浏览器的选项(Options)对象,并将调试端口设置为 “127.0.0.1:9527”,这意味着浏览器将连接到 Chrome 浏览器的开发者工具(DevTools)端口,以便进行远程调试。
  3. 初始化 Chrome WebDriver,将上述选项传递给 WebDriver。
  4. 打开 Chrome 浏览器,并连接到指定的调试端口。
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsif __name__ == '__main__':options = Options()options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")driver = webdriver.Chrome(options=options)url = 'https://www.bilibili.com'driver.get(url)print(driver.title)	# 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

无法连接指定端口 Chrome浏览器

在命令行中启动 Chrome 浏览器时候,不要使用 --headless !!!会导致Selenium 无法连接。

问题复现

一般的,我们使用以下命令去指定chrome浏览器端口,--headless 可能是有意或无意添加的

["--remote-debugging-port=9527","--headless"
]# 或者 命令行
chrome.exe --remote-debugging-port=9527 --user-data-dir="F:\selenium\AutomationProfile" --headless

这个时候,会发现,没有打开任何窗口。因为是无头模式!!!

在命令行执行 netstat -ano | findstr :9527,如下图所示:
在这里插入图片描述

现在你去访问:http://127.0.0.1:9527/json/version,可以看到下图所示:

  • 这表明远程调试接口是开启的

在这里插入图片描述


但如果我们使用以下代码去连接端口为 9527 的浏览器,则会报错!!!

options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")
driver = webdriver.Chrome(options=options)

如果没有意外!则会抛出以下异常:

selenium.common.exceptions.WebDriverException: Message: unknown error: cannot connect to chrome at 127.0.0.1:9527
from unknown error: unable to discover open pages

这个问题其实是不应该发生的!!!

因为 无头模式 可能改变了与调试接口的交互方式或者其他相关配置,从而影响到了 Selenium 的连接。


如何解决

杀死全部的9527端口的进程,并注意在命令行中启动 Chrome 浏览器时候,不要使用 --headless

这个命令的目的是终止在指定端口上运行的进程,以便释放端口并停止与之相关的应用程序。请注意,使用 taskkill 命令会强制终止进程,因此要小心使用,以免意外终止重要的进程。

这个时候,我们需要在命令行执行以下命令,作用是终止在端口 9527 上运行的进程。(详细解释看下面)

  1. netstat -ano | findstr :9527:这部分命令用于查找在端口 9527 上运行的进程的 PID。netstat 列出了所有网络连接,而 findstr :9527 过滤出包含端口 9527 的行,显示它们的 PID。

  2. for /f "tokens=5" %a in (...) do ...for 命令用于处理上述命令的输出。它将提取 netstat 输出中的 PID,并将其存储在 %a 变量中。

  3. taskkill /F /PID %a:一旦 PID 被提取并存储在 %a 中,taskkill 命令将使用这个 PID 终止相关进程。

for /f "tokens=5" %a in ('netstat -ano ^| findstr :9527') do taskkill /F /PID %a

kill PID

for /f "tokens=5" %a in ('netstat -ano ^| findstr :9527') do taskkill /F /PID %a

这段命令是一个用于在 Windows 命令提示符中终止在特定端口(9527)上运行的进程的复合命令。下面是这个命令的解释:

  1. for /f "tokens=5" %a in ('netstat -ano ^| findstr :9527') do ...:这部分命令使用 for 循环来处理输出结果。它的作用是执行以下操作:

    • for /f:这表示使用 for 命令来进行循环迭代。
    • "tokens=5":这指定了循环要提取的令牌(token),在这里我们提取第五个令牌。在这个上下文中,第五个令牌是 netstat 输出中的进程标识符(PID)。
    • %a:这是一个变量,用于存储从 netstat 命令输出中提取的 PID。
  2. ('netstat -ano ^| findstr :9527'):这部分是在 for 命令内部的命令,它会产生一系列数字,这些数字代表在端口 9527 上运行的进程的 PID。它的工作步骤如下:

    • netstat -ano:这部分执行 netstat 命令,用于列出所有活动网络连接及其相关信息。-ano 标志告诉 netstat 显示所有连接的详细信息,并显示每个连接的 PID。
    • ^|:这是一个管道符号 |,用于将 netstat 的输出传递给下一个命令,即 findstr
    • findstr :9527:这部分命令用于过滤 netstat 输出,只保留包含端口号 9527 的行,这些行包括了我们关心的进程信息。
  3. taskkill /F /PID %a:一旦 for 循环提取了 netstat 输出中的 PID(存储在 %a 中),这部分命令使用 taskkill 命令来终止这些进程。具体地:

    • taskkill:这是用于终止进程的命令。
    • /F:这是 taskkill 的标志,表示要强制终止进程,即无需用户确认。
    • /PID %a:这是指定要终止的进程的 PID,其中 %a 包含了在 for 循环中提取的 PID。

因此,整个命令的作用是找到所有在端口 9527 上运行的进程的 PID,然后使用 taskkill 命令将它们终止掉。这可以帮助我们清除特定端口上的活动进程。需要注意使用此命令,以免终止不必要的进程。

未完待续

将持续更新,常见的Selenium的操作 和 疑难杂症等!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyQt实战 创建一个PyQt5项目

前后端分离 参考链接 PyQt5实战(二):创建一个PyQt5项目_pyqt5实战项目_笨鸟未必先飞的博客-CSDN博客 项目目录 创建一个QT项目 调用pyuic工具将dialog.ui文件编译为Python程序文件ui_dialog.py。 # -*- coding: utf-8 -*-# Form implemen…

【离散差分】LeetCode2953:统计完全子字符串

作者推荐 [二分查找]LeetCode2040:两个有序数组的第 K 小乘积 本题其它解法 【滑动窗口】LeetCode2953:统计完全子字符串 涉及知识点 分块循环 离散差分 题目 给你一个字符串 word 和一个整数 k 。 如果 word 的一个子字符串 s 满足以下条件,我们称它是 完全…

云原生之深入解析如何限制Kubernetes集群中文件描述符与线程数量

一、背景 linux 中为了防止进程恶意使用资源,系统使用 ulimit 来限制进程的资源使用情况(包括文件描述符,线程数,内存大小等)。同样地在容器化场景中,需要限制其系统资源的使用量。ulimit: docker 默认支持…

08、分析测试执行时间及获取pytest帮助

官方用例 # content of test_slow_func.py import pytest from time import sleeppytest.mark.parametrize(delay,(1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,1.0,0.1,0.2,0,3)) def test_slow_func(delay):print("test_slow_func {}".format(delay))sleep(delay)assert…

同旺科技 USB TO SPI / I2C --- 调试W5500_TCP Client测试

所需设备: 内附链接 1、USB转SPI_I2C适配器(专业版); 首先,连接W5500模块与同旺科技USB TO SPI / I2C适配器,如下图: 网关IP地址寄存器(192.168.1.1)子网掩码寄存器(255.255.255.0)源MAC地址寄存器源IP地址寄存器(192.168.1.8)…

QT4和 QT5 槽函数连接的区别

正常连接方式 //QT4官方用列QLabel *label new QLabel;QScrollBar *scrollBar new QScrollBar;QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label, SLOT(setNum(int)));//QT5官方用列QLabel *label new QLabel;QLineEdit *lineEdit new QLineEdit;QObject::c…

STK Components 二次开发-飞行器

1.创建飞机 参数帮助文档 var poitList GetTracksData(); var waypointPropagator new WaypointPropagator(m_earth, poitList); var locationPoint waypointPropagator.CreatePoint();m_aircraft new Platform {Name "MH730",LocationPoint locationPoint,Or…

vue3 中使用 sse 最佳实践,封装工具

工具 // 接受参数 export interface SSEChatParams {url: string,// sse 连接onmessage: (event: MessageEvent) > void,// 处理消息的函数onopen: () > void,// 建立连接触发的事件finallyHandler: () > void,// 相当于 try_finally 中的 finally 部分,不…

机器学习(2)回归

0.前提 上一期,我们简单的介绍了一些有关机器学习的内容。学习机器学习的最终目的是为了服务我未来的毕设选择之一——智能小车,所以其实大家完全可以根据自己的需求来学习这门课,我做完另一辆小车后打算花点时间去进行一次徒步行&#xff0…

20:kotlin 类和对象 --泛型(Generics)

类可以有类型参数 class Box<T>(t: T) {var value t }要创建类实例&#xff0c;需提供类型参数 val box: Box<Int> Box<Int>(1)如果类型可以被推断出来&#xff0c;可以省略 val box Box(1)通配符 在JAVA泛型中有通配符?、? extends E、? super E&…

25. K 个一组翻转链表

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值…

自媒体原创改写工具,自媒体首发改写软件

自媒体平台已成为许多创作者表达观点、分享知识和积累影响力的关键渠道。创作是需要技巧和经验的。本文将分享一些自媒体文章改写技巧&#xff0c;并推荐一系列优秀的自媒体文章改写工具&#xff0c;帮助您提升创作效率&#xff0c;创作出更优秀的文章。 自媒体文章改写技巧 …

Backend - Django makemigrations

目录 一、迁移命令 &#xff08;一&#xff09;前提 &#xff08;二&#xff09;生成迁移文件 &#xff08;三&#xff09;执行迁移 二、迁移问题 1. Error&#xff1a;No changes detected 2. Error&#xff1a;You are trying to add a non-nullable field XXX to XXX…

[读论文]BK-SDM: A Lightweight, Fast, and Cheap Version of Stable Diffusion

github: GitHub - Nota-NetsPresso/BK-SDM: A Compressed Stable Diffusion for Efficient Text-to-Image Generation [ICCV23 Demo] [ICML23 Workshop] ICML 2023 Workshop on ES-FoMo 简化方式 蒸馏方式&#xff08;训练Task蒸馏outKD-FeatKD&#xff09; 训练数据集 评测指标…

在intelliJ spring boot gradle插件3.2.0中未找到匹配的变量

我正在尝试使用spring启动Gradle插件的版本3.2.0。这是我的build.gradle文件&#xff1a; plugins {id javaid org.springframework.boot version 3.2.0id io.spring.dependency-management version 1.1.4 }group com.yaxin version 0.0.1-SNAPSHOTjava {sourceCompatibilit…

GPIO的使用--时钟使能含义--代码封装

目录 一、时钟使能的含义 1.为什么要时钟使能&#xff1f; 2.什么是时钟使能&#xff1f; 3.GPIO的使能信号&#xff1f; 二、代码封装 1.封装前完整代码 2.封装结构 封装后代码 led.c led.h key.c key.h main.c 一、时钟使能的含义 1.为什么要时钟使能&#xff1f…

Python开发运维:Python 3.8 常用标准库

目录 一、理论 1.Python3.8 标准库 2.常用标准库 二、问题 1.Python 正则表达式如何实现 一、理论 1.Python3.8 标准库 &#xff08;1&#xff09;官网 Python 标准库 — Python 3.8.17 文档 &#xff08;2&#xff09;其他版本下拉列表查询 2.常用标准库 &#xff0…

MySQL笔记-第01章_数据库概述

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第01章_数据库概述1. 为什么要使用数据库2. 数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库…

Linux--网络编程-ftp(TCP)网络通信-文件交互

项目要求&#xff1a;实现以下内容 远程控制&#xff1a; 1、查看服务器当前路径文件 ls 3、进入、退出服务器文件夹 cd 4、上传文件到服务器 put xxx 本地控制&#xff1a; 1、查看本地&#xff08;客户端&#xff09;文件 lls 2、进入客户端文件夹 lcd 3、获取服务器的文件…

音频录制软件哪个好?帮助你找到最合适的一款

音频录制软件是日常工作、学习和创作中不可或缺的一部分。选择一个适合自己需求的录音软件对于确保音频质量和提高工作效率至关重要。可是您知道音频录制软件哪个好吗&#xff1f;本文将深入探讨两种常见的音频录制软件&#xff0c;通过详细的步骤指南&#xff0c;帮助您了解它…