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

news2024/11/15 12:59:52

在这里插入图片描述

解决 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 ChromeDriverManager


def 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 Options


if __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 subprocess


def start_chrome(browser_path, commands_list=None) -> None:
    """
    启动浏览器。

    Args:
        browser_path(str): 浏览器安装的路径
        commands_list(List[str]): 启动浏览器的命令行参数,默认为None

    Returns:
        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 = 9527
    cmd_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 Options


if __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.coloradmin.cn/o/1284950.html

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

相关文章

1-4、调试汇编程序

语雀原文链接 文章目录 1、执行过程第一步:源程序第二步:编译连接第三步:执行 2、DOSBox运行程序第1步 进入EDIT.EXE第2步 编写源程序第3步 编译第4步 连接第5步 执行完整过程 3、DEBUG跟踪执行过程加载程序到内存执行程序debug和源程序数字…

【导航控制器总结-导航控制器栈 Objective-C语言】

一、导航控制器总结 1.我们接着上一堂课的内容继续 我们上节课说到哪里了,是不是就是对这个导航控制器的一个总结啊 然后,使用的注意事项 2.导航控制器使用注意事项: 1)第一点,使用导航控制器,你在创建的时候,需要给它指定一个根控制器 创建导航控制器的同时,指定…

【译】如何在调试时分析CPU和内存(Analyze CPU and Memory while Debugging)

您想了解如何使您的代码运行得更快,使用更少的内存,或者只是找出您的代码是否有CPU或内存问题?你当然会——你是一名开发人员!但是,内存和性能调优经常会遇到“重要但不紧急”的任务,因为真正紧急的事情,您似乎根本无…

优化 SQL 日志记录的方法

为什么 SQL 日志记录是必不可少的 SQL 日志记录在数据库安全和审计中起着至关重要的作用,它涉及跟踪在数据库上执行的所有 SQL 语句,从而实现审计、故障排除和取证分析。SQL 日志记录可以提供有关数据库如何访问和使用的宝贵见解,使其成为确…

Dockerfile脚本编写流程及示例

学习dockerfile指令 Dockerfile 指令 说明 FROM 指定基础镜像 MAINTAINER 声明镜像的维护者 LABEL 添加元数据标签 RUN 在容器中执行命令 CMD 容器启动后默认执行的命令 EXPOSE 暴露容器的端口 ENV 设置环境变量 ADD 将文件、目录或远程文件添加到容器中 COP…

[ 蓝桥杯Web真题 ]-外卖给好评

目录 介绍 准备 目标 效果 规定 思路 解答参考 介绍 外卖是现代生活中必备的一环。收到外卖后,各大平台软件常常会邀请用户在口味,配送速度等多个方面给与评分。在 element-ui 组件中,已经有相应的 Rate 组件,但是已有组件…

论文解读--PointPillars- Fast Encoders for Object Detection from Point Clouds

PointPillars--点云目标检测的快速编码器 摘要 点云中的物体检测是许多机器人应用(如自动驾驶)的重要方面。在本文中,我们考虑将点云编码为适合下游检测流程的格式的问题。最近的文献提出了两种编码器;固定编码器往往很快,但牺牲了准确性,而…

【latex笔记】双栏格式下插入单栏、双栏格式图片

双栏格式下插入单栏、双栏格式图片 1.缘起multicols2.双栏格式 插入单栏图片3.双栏格式 插入双栏图片 1.缘起multicols 插入双栏格式图片问题被困扰了有很长一段时间,查看网络资源也一直没找到解决方法,今天查看Latex官方文档,才发现因为mul…

spring cloud 整合Feign经行远程调用

文章目录 Feign远程调用Feign替代RestTemplate1)引入依赖2)添加注解3)编写Feign的客户端4)测试5)总结 自定义配置配置文件方式Java代码方式 Feign使用优化 Feign远程调用 先来看我们以前利用RestTemplate发起远程调用…

将rtsp视频流发送到AWS Kinesis Video Streams的方案——使用Gstreamer(C++) Command Line

大纲 1 创建Kinesis Video Streams1.1 创建视频流1.2 记录Creation Time 2 创建策略2.1 赋予权限2.2 限制资源2.3 Json格式描述(或上面手工设置)2.4 注意事项 3 创建IAM用户3.1 生成密钥对3.2 附加策略3.3 记录访问密钥对 4 编译C 创建者库5 发送6 检查参…

聊聊 Jetpack Compose 的 “状态订阅自动刷新” -- mutableStateListOf

Jekpack Compose “状态订阅&自动刷新” 系列: 【 聊聊 Jetpack Compose 的 “状态订阅&自动刷新” - - MutableState/mutableStateOf 】 【 聊聊 Jetpack Compose 的 “状态订阅&自动刷新” - - remember 和重组作用域 】 【 聊聊 Jetpack Compose 的 …

非标设计之气缸类型

空压机: 空压机又称空气压缩机,简单来说就是将机械能转化为压力能来进行工作的,空压机在电力行业应用比较多,除了在电力行业应用较多外,其实空压机还有一个比较常见的用途就是用来制冷和分离气体,输送气体…

java SSM毕业生信息管理myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

前言 学校的规模不断扩大,学生数量急剧增加,有关学生的各种信息量也成倍增长。面对庞大的信息量需要有学生信息管理系统来提高学生管理工作的效率。通过这样的系统可以做到信息的规范管理、科学统计和快速查询、修改、增加、删除等,从而减少管…

【力扣热题100】207. 课程表 python 拓扑排序

【力扣热题100】207. 课程表 python 拓扑排序 写在最前面207. 课程表解决方案:判断是否可以完成所有课程的学习方法:拓扑排序实现步骤Python 实现性能分析结论 写在最前面 刷一道力扣热题100吧 难度中等 https://leetcode.cn/problems/course-schedule…

[leetcode ~二叉树] 模版

文章目录 1. 左叶子之和2. 翻转二叉树 E 1. 左叶子之和 :::details 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15&…

Proteus仿真--基于1602LCD与DS18B20设计的温度报警器

本文介绍基于1602LCD与DS18B20设计的温度报警器设计(完整仿真源文件及代码见文末链接) 仿真图如下 其中温度传感器选用DS18B20器件,主要用于获取温度数据并上传,温度显示1602LCD液晶显示器,报警模块选用蜂鸣器&#…

隐写术和人工智能

在一项新的研究中,人工智能对齐研究实验室 Redwood Research 揭示了大型语言模型 (LLM) 可以掌握“编码推理”,这是一种隐写术形式。 这种有趣的现象使得大型语言模型能够以人类读者无法理解的方式巧妙地将中间推理步骤嵌入到生成的文本中。 大型语言…

从零开始学习 JS APL(五):完整指南和实例解析

目录 学习目标: 学习内容: 学习时间: 学习内容: Window对象: 定时器-延时函数: JS 执行机制: location对象: 本地存储: 本地存储分类- localStorage&#xff1a…

Fiddler移动端抓包

本篇文章,博主想使用通俗易懂的话语,让大家明白以下内容: 什么是抓包哪些场景需要用到抓包Fiddler抓包的原理怎样使用Fiddler进行移动端抓包 抓包 包 (Packet) 是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。 我们平常…

uniapp 云打包 生成安卓证书文件

现在使用uniapp来开发小程序,H5,APP越来越多了,目前开发了一款APP,使用的也是uniapp。在此记录下用uniapp开发app云打包时约到的一些问题吧。 前因是我司安卓同学休产假,像云打包时需要的证书文件只能自己动手来搞。看…