如果在已经打开的网页里面,我点击了一个链接,这个链接在新的标签页打开,如何能得到新的标签页其返回的数据收发数据。

news2024/10/5 14:44:14

要在已打开的网页中点击一个链接并在新标签页中打开,然后捕获新标签页中的所有HTTP请求和响应,你可以使用Selenium库结合selenium-wire插件。下面是一个示例代码,展示了如何实现这一功能:

 

```python

import json

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium_wire import webdriver as wire_webdriver

 

# 设置ChromeDriver路径

service = Service('path/to/chromedriver')

 

# 配置Chrome选项

chrome_options = Options()

# 如果需要无头模式,取消注释以下行

# chrome_options.add_argument('--headless')

 

# 使用selenium-wire初始化WebDriver

driver = wire_webdriver.Chrome(service=service, options=chrome_options)

 

try:

    # 打开初始页面

    driver.get('https://www.example.com')

 

    # 等待页面加载完成

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

 

    # 假设我们要点击的链接的CSS选择器为'a.new-tab-link'

    link = driver.find_element(By.CSS_SELECTOR, 'a.new-tab-link')

 

    # 使用JavaScript在新标签页中打开链接

    driver.execute_script("window.open(arguments[0]);", link.get_attribute('href'))

 

    # 切换到新打开的标签页

    driver.switch_to.window(driver.window_handles[-1])

 

    # 等待新页面加载完成

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

 

    # 捕获新页面的所有请求

    for request in driver.requests:

        if request.method == 'GET' and request.response.status_code == 200:

            try:

                response_json = json.loads(request.response.body.decode('utf-8'))

                print(f"Request URL: {request.url}")

                print("Response JSON:")

                print(json.dumps(response_json, indent=4))

            except json.JSONDecodeError:

                pass

 

finally:

    # 清理资源

    driver.quit()

```

 

但是,上面的代码有一个问题,那就是它直接使用`window.open`方法在新标签页中打开链接,而这种方法并不会触发Selenium的监听,因此你不会捕捉到新标签页中的任何请求。为了真正解决这个问题,你应该使用`link.send_keys(Keys.CONTROL + '\n')`来模拟用户按Ctrl+N的行为,或者使用`Keys.CONTROL + 't'`来打开新标签页,然后在新标签页中导航到链接的目标URL。然而,这需要更复杂的代码来处理窗口焦点和切换,因为Selenium需要在正确的窗口上下文中才能监听到请求。

 

以下是使用`send_keys`方法在新标签页中打开链接的改进版本:

 

```python

import time

import json

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium_wire import webdriver as wire_webdriver

 

service = Service('path/to/chromedriver')

chrome_options = Options()

 

driver = wire_webdriver.Chrome(service=service, options=chrome_options)

 

try:

    driver.get('https://www.example.com')

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

    

    # 假设链接的选择器为'a.new-tab-link'

    link = driver.find_element(By.CSS_SELECTOR, 'a.new-tab-link')

    

    # 在新标签页中打开链接

    original_window = driver.current_window_handle

    link.send_keys(Keys.CONTROL + '\n')

    

    # 等待新标签页加载

    WebDriverWait(driver, 10).until(lambda driver: len(driver.window_handles) > 1)

    

    # 切换到新标签页

    new_window = [window for window in driver.window_handles if window != original_window][0]

    driver.switch_to.window(new_window)

    

    # 等待新页面加载完成

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

    

    # 捕获新页面的所有请求

    for request in driver.requests:

        if request.method == 'GET' and request.response.status_code == 200:

            try:

                response_json = json.loads(request.response.body.decode('utf-8'))

                print(f"Request URL: {request.url}")

                print("Response JSON:")

                print(json.dumps(response_json, indent=4))

            except json.JSONDecodeError:

                pass

 

finally:

    driver.quit()

```

 

在这个版本中,我们使用`send_keys`来模拟用户在链接上按Ctrl+N的行为,从而在新标签页中打开链接。我们还使用了`WebDriverWait`来等待新标签页的出现,并在新标签页加载完成后才开始捕获请求。这样,我们就能确保所有相关的请求都被捕获到了。

```

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

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

相关文章

阿里云服务器配置、搭建(针对Spring boot和MySQL项目)

这是一篇极其详细且痛苦的文章,还是在两位后端的大佬手把手教导下、以及我找遍全网所有资料、问了N遍AI、甚至直接申请阿里云工单一对一询问客服一整天、连续清空再上传反复30多次整个项目jar包......总结出来的终极要人命踩坑的问题总结 一、首先购买服务器 其实不…

Apache Seata分布式事务及其三种模式详解

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata分布式事务及其三种模式详解 分布式事务 Seata 及其三种模式详解 | Meetup#3 回顾…

基于TCP的在线词典系统(分阶段实现)

1.功能说明 一共四个功能: 注册 登录 查询单词 查询历史记录 单词和解释保存在文件中,单词和解释只占一行, 一行最多300个字节,单词和解释之间至少有一个空格。 2.功能演示 3、分阶段完成各个功能 3.1 完成服务器和客户端的连接 servic…

【深度学习】图形模型基础(5):线性回归模型第四部分:预测与贝叶斯推断

1.引言 贝叶斯推断超越了传统估计方法,它包含三个关键步骤:结合数据和模型形成后验分布,通过模拟传播不确定性,以及利用先验分布整合额外信息。本文将通过实际案例阐释这些步骤,展示它们在预测和推断中的挑战和应用。…

编程上下文Context及其实现原理

编程上下文Context及其实现原理 author:shengfq date:2024-07-06 title:编程上下文Context及其实现原理 category:编程思想1.编程中的上下文Context是指什么? 在编程和软件工程领域,“上下文”(Context)是一个多义词,其含义可以…

产品经理-​合作的6类干系人(8)

在一个项目中,产品经理并不是一个人在战斗,而是在很多同事的配合下共同完成项目。那产品经理到底要和哪些角色配合,一起完成项目呢 中间的产品经理是一个项目的驱动者。而产品经理的前方是“Boss/Leader”,也就是创业团队中公司的…

地级市数字经济指数、互联网用户数、数字金融普惠指数

2000-2022年地级市数字经济指数(含控制变量) 目录 数字经济如何改善环境污染 一、引言 二、文献综述 三、实证模型 四、数据来源 五、程序代码 六、运行结果 数字经济如何改善环境污染 摘要: 本论文旨在探讨数字经济对环境污染的改善作…

三级_网络技术_04_中小型网络系统总体规划与设计

1.下列关于路由器技术特征的描述中,正确的是()。 吞吐量是指路由器的路由表容量 背板能力决定了路由器的吞吐量 语音、视频业务对延时抖动要求较低 突发处理能力是以最小帧间隔值来衡量的 2.下列关于路由器技术特征的描述中,正确的是()。 路由器的…

Matlab中collectPlaneWave函数的应用

查看文档如下: 可以看出最多5个参数,分别是阵列对象,信号幅度,入射角度,信号频率,光速。 在下面的代码中,我们先创建一个3阵元的阵列,位置为:(-1,0,0&#x…

JavaWeb----JSPJSTL

目录 JSP显隐注释在JSP中写java程序JSP的指令标签JSP中的四大域对象简易版用户登录EL表达式 JSTL条件动作标签if标签 choose\when\otherwise标签迭代标签格式化动作标签 用户登录实例查看是否安装了mysql用户登录界面后台实现 JSP JSP全名是Java Server Pages,它是建…

【后端面试题】【中间件】【NoSQL】MongoDB查询优化3(拆分、嵌入文档,操作系统)

拆分大文档 很常见的一种优化手段,在一些特定的业务场景中,会有一些很大的文档,这些文档有很多字段,而且有一些特定的字段还特别的大。可以考虑拆分这些文档 大文档对MongoDB的性能影响还是很大的,就我个人经验而言&…

常见算法和Lambda

常见算法和Lambda 文章目录 常见算法和Lambda常见算法查找算法基本查找(顺序查找)二分查找/折半查找插值查找斐波那契查找分块查找扩展的分块查找(无规律的数据) 常见排序算法冒泡排序选择排序插入排序快速排序递归快速排序 Array…

在Apache HTTP服务器上配置 TLS加密

安装mod_ssl软件包 [rootlocalhost conf.d]# dnf install mod_ssl -y此时查看监听端口多了一个443端口 自己构造证书 [rootlocalhost conf.d]# cd /etc/pki/tls/certs/ [rootlocalhost certs]# openssl genrsa > jiami.key [rootlocalhost certs]# openssl req -utf8 -n…

Pycharm远程连接GPU(内容:下载安装Pycharm、GPU租借、配置SSH、将代码同步到镜像、命令行操控远程镜像、配置远程GPU解释器)

目录 windows下载安装pycharmGPU租借网站AutoDlfeaturize好易智算 GPU租借GPU选择选择镜像充值 然后创建镜像创建成功 复制SSH登录信息 远程进入镜像 在Pycharm中进行ssh连接新建SFTP配置SSH复制ssh根据复制的信息填写ssh配置测试连接 将代码同步到远程镜像上设置mappings将本地…

React 省市查询组件完整代码

目录 一、地区文件 二、Antd配合使用 三、实现效果 一、地区文件 下载地址:全国省市区数据_JSON格式_SQL格式 export const chinaArea {0: {1: 北京,2: 天津,3: 河北省,4: 山西省,5: 内蒙古自治区,6: 辽宁省,7: 吉林省,8: 黑龙江省,9: 上海,10: 江苏省,11: 浙…

计算机出现找不到msvcp140.dll无法继续执行代码怎么办?推荐7个有效解决方法

在日常使用电脑过程中会经常遇到各式各样的问题,比如msvcp140.dll丢失或找不到msvcp140.dll文件是最常见的问题之一,那么遇到这个问题要怎么解决呢?msvcp140.dll到底是什么?为什么会出现msvcp140.dll丢失问题?今天给大…

原生事件监听及组件内置事件处理

监听事件 我们可以使用 v-on 指令 (简写为 ) 来监听 DOM 事件,并在事件触发时执行对应的 JavaScript。用法:v-on:click“handler” 或 click“handler”。 事件处理器 (handler) 的值可以是: 内联事件处理器:事件被触发时执行的…

《QT从基础到进阶·四十三》QPlugin插件多线程问题和只有插件dll没有头文件和lib文件时调用插件中的方法

1、插件和多线程问题: 创建插件对象不能放到多线程执行,不然报错:ASSERT failure in QWidget: "Widgets must be created in the GUlthread. //不能放在多线程执行 QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName))…

单选多选提交问卷,代码示例

element中 需要对接口返回的数据进行分析。多选问题使用checkbox,单选题使用radio。 多选时可以绑定min/ma&am…

Transformer前置知识:Seq2Seq模型

Seq2Seq model Seq2Seq(Sequence to Sequence)模型是一类用于将一个序列转换为另一个序列的深度学习模型,广泛应用于自然语言处理(NLP)任务,如机器翻译、文本摘要、对话生成等。Seq2Seq模型由编码器&#…