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

要在已打开的网页中点击一个链接并在新标签页中打开,然后捕获新标签页中的所有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.mfbz.cn/a/773772.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[C++初阶]vector的初步理解

一、标准库中的vector类 1.vector的介绍 1. vector是表示可变大小数组的序列容器 , 和数组一样,vector可采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大…

海思SD3403/SS928V100开发(14)WIFI模块RTL8821驱动调试

1.前言 芯片平台: 海思SD3403/SS928V100 操作系统平台: Ubuntu20.04.05【自己移植】 WIFI模块: LB-LINK的RTL8821 2. 调试记录 参考供应商提供的操作手册 2.1 lsusb查看设备 2.2 编译供应商提供的驱动 2.2.1 修改Makefile 2.2.2 编译报错 解决办法: 将Makefile中arm…

FPGA基本资源介绍

文章目录 FPGA资源介绍1.可编程输入输出单元(IOB)2.可配置逻辑块(CLB)3.数字时钟管理模块(DCM)4.嵌入式块RAM(BLOCK RAM / BRAM)4.1其他ram 5.丰富的布线资源6.底层内嵌功能单元7.内嵌专用硬核软核、硬核、以及固核的概念 FPGA资源介绍 1.可编程输入输出单元(IOB) 可编程输入…

大语言模型融合知识图谱的问答系统研究

文章目录 题目摘要方法实验消融实验 题目 大语言模型融合知识图谱的问答系统研究 论文地址:http://fcst.ceaj.org/CN/10.3778/j.issn.1673-9418.2308070 项目地址:https://github.com/zhangheyi-1/llmkgqas-tcm/ 摘要 问答系统(Question Ans…

数据库管理-第217期 Oracle的高可用-02(20240704)

数据库管理217期 2024-07-04 数据库管理-第217期 Oracle的高可用-02(20240704)1 GDS简介2 GDS架构2.1 全局数据服务池2.2 全局数据服务域2.3 全局服务管理2.4 全局数据服务目录2.5 Oracle通知服务 3 GDS简图3.1 负载均衡3.2 只读服务失败转移3.3 多主复制…

1014-33SF 同轴连接器

型号简介 1014-33SF是Southwest Microwave的2.92 mm 同轴连接器。这款连接器采用钢制外壳,铍铜触点,并经过金镀处理,以确保良好的导电性和耐腐蚀性。适用于高频微波应用,例如测试设备、通信系统等。 型号特点 频率范围&#xff1…

openEuler 社区 2024 年 5 月运作报告

概述 2024年5月,在 OpenAtom openEuler(简称:“openEuler”)技术委员会例会上,经技术委员会委员审定,同意开发者在社区成立 SBOM SIG、Intelligence SIG。SBOM SIG 主要围绕 SBOM 构建openEuler社区软件供应链安全&…

【React】Ant Design -- Table分页功能实现

实现步骤 为Table组件指定pagination属性来展示分页效果在分页切换事件中获取到筛选表单中选中的数据使用当前页数据修改params参数依赖引起接口重新调用获取最新数据 const pageChange (page) > {// 拿到当前页参数 修改params 引起接口更新setParams({...params,page})…

Finding and exploting an unused API endpoint

Using 0$ account buy a piece of lether priced at $133 1、尝试访问api接口 大概率可能访问不到,但是可以尝试访问下 /api/swagger/v1 /openapi.json 2、页面功能点寻找 api send to Repeter 3、Find Supported HTTP请求 POST方法测试 通过测试得知支持GET方法和PATC…

[产品]理解产品

课程安排 认识互联网行业 1.行业对比 2.互联网公司 广义理解: 互联网行业的公司大都以计算机网络技术为基础, 利用网络平台帮助企业提供服务, 并以此获取收入 3.行业细分 典型产品 认识产品经理 1.职责差异 不同类型的公司, 产品经理岗位所负责的工作都是略有差异的 1,外包…

Docker Desktop 简易操作指南 (Windows, macOS, Linux)

1. 下载最新版本 Docker Desktop https://www.docker.com/products/docker-desktop/ 2.启动 Docker Desktop 3.常用命令(在 cmd 或 Terminal 中执行) #列出所有镜像(Images) docker images #列出所有容器(Containers&…

后端之路——阿里云OSS云存储

一、何为阿里云OSS 全名叫“阿里云对象存储OSS”,就是云存储,前端发文件到服务器,服务器不用再存到本地磁盘,可以直接传给“阿里云OSS”,存在网上。 二、怎么用 大体逻辑: 细分的话就是: 1、准…

visual studio 2022配置和使用protobuf

上图证明,我真的测了好多遍,测了好多版本的protobuf,花了很多时间。不过好在最后在vs2022上测通了。 下载protobuf 这里是protobuf下载的地址。 Releases protocolbuffers/protobuf GitHub 个人使用的3.21.9这个版本才跑通的。 1、首先…

Lesson 48 Do you like ... ? Do you want ... ?

Lesson 48 Do you like … ? Do you want … ? 词汇 fresh a. 新鲜的【食物】 搭配:fresh water 淡水    fresh man 新生    fresh air 新鲜空气    fresh egg 新鲜鸡蛋 例句:我们喜欢新鲜的空气。    We like fresh egg. egg n. 蛋【通…

unity知识点 专项四 一文彻底说清楚(锚点(anchor)、中心点(pivot)、位置(position)之间的关系)

一 概述 想要使UI控件在屏幕中达到正确的显示效果,比如自适应屏幕尺寸、固定边距等等,首先要理清楚几个基本概念和设置:锚点(anchor)、中心点(pivot)、位置(position)、UI缩放模式、父物件的transform设置 二 Anchor、Pivot与Position 2…

Qualcomm QCA206x EasyMesh For Ubuntu

1. 引言 关于EasyMesh概念我们这里就不再过多的赘述,此篇文档的目的是,让广大初学者,有一个很方便的平台进行EasyMesh的学习和测试。 2. X86 Ubuntu平台 2.1 硬件环境准备 备注:QCA206x WiFi module推荐使用移远的FC64E/FC66E。…

代码随想录算法训练营第74天:路径总结[1]

代码随想录算法训练营第74天:路径总结 ‍ A * 算法精讲 (A star算法) 卡码网:126. 骑士的攻击(opens new window) 题目描述 在象棋中,马和象的移动规则分别是“马走日”和“象走田”。现给定骑士的起始坐标和目标…

细说MCU的ADC模块单通道连续采样的实现方法

目录 一、工程依赖的硬件及背景 二、设计目的 三、建立工程 1、配置GPIO 2、选择时钟源和Debug 3、配置ADC 4、配置系统时钟和ADC时钟 5、配置TIM3 6、配置串口 四、代码修改 1、重定义TIM3中断回调函数 2、启动ADC及重写其回调函数 3、定义用于存储转换结果的数…

【深度学习练习】心脏病预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、什么是RNN RNN与传统神经网络最大的区别在于,每次都会将前一次的输出结果,带到下一隐藏层中一起训练。如下图所示: …

macOS版ChatGPT更新:修复AI对话纯文本存储问题

猫头虎 🐯 建联猫头虎,商务合作,产品评测,产品推广,个人自媒体创作,超级个体,涨粉秘籍,一起探索编程世界的无限可能! macOS版ChatGPT更新:修复AI对话纯文本…