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

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

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

相关文章

【微信小程序开发实战项目】——花店微信小程序实战项目(4)

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

Nginx的安装与配置 —— Linux系统

一、Nginx 简介 1.1 什么是 Nginx Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务…

Linux系统部署MongoDB开源文档型数据库并实现无公网IP远程访问

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 💡 推荐 前些天发现了一个巨牛的人工智能学习网站&am…

现代农业利器:土壤检测仪器的应用与未来

在现代农业发展的浪潮中,土壤检测仪器以其精准、高效的特点,成为了农业生产的得力助手。这些看似不起眼的设备,实际上在保障农产品质量、提高农业生产效率方面发挥着举足轻重的作用。 一、土壤检测仪器:现代农业的“眼睛” 土壤检…

Vector的扩容过程是怎样的

Vector的扩容过程在C中是一个动态调整内存空间以容纳更多元素的过程。这一过程主要发生在向Vector中添加元素时,如果当前Vector的容量不足以容纳新元素,就会触发扩容操作。以下是Vector扩容过程的详细步骤: 扩容机制 判断是否需要扩容&…

记录第一次写脚本

使用csh语言,Linux系统操作的 写和执行csh(C Shell)脚本不需要额外的软件,只需要一个支持csh的终端环境。 1.检查是否安装了C Shell 在终端terminal运行以下命令 which csh 如果返回路径,比如/bin/csh&#xff0c…

SpringBoot 启动流程六

SpringBoot启动流程六 这句话是创建一个上下文对象 就是最终返回的那个上下文 我们这个creatApplicationContext方法 是调用的这个方法 传入一个类型 我们通过打断点的方式 就可以看到context里面的东西 加载容器对象 当我们把依赖改成starter-web时 这个容器对象会进行…

STM32-HAL-FATFS(文件系统)(没做完,stm32f103zet6(有大佬的可以在评论区说一下次板子为什么挂载失败了))

1STM32Cube配置 1-1配置时钟 1-2配置调试端口 1-3配置uart 1-4配置SDIO(注意参数)(其中他的初始化的异常函数给注释,SD卡文件写了) 配置了还要打开中断和DMA可在我的其他文章中看一样的 1-5配置FatFs (只改了图选中…

java中响应式编程:@FunctionalInterface用法实例

在Java中&#xff0c;Function<T, R>接口是Java 8引入的函数式接口之一&#xff0c;主要用来代表一个输入参数并产生一个结果的函数。它是响应式编程和函数式编程风格的重要组成部分&#xff0c;特别是在处理流&#xff08;Stream&#xff09;和异步操作时非常有用。 Fu…

QT c++函数模板与类模板的使用

QT c类模板的使用 #pragma once#include <QtWidgets/QMainWindow> #include "ui_QtWidgetsApplication5.h"class QtWidgetsApplication5 : public QMainWindow {Q_OBJECTpublic:QtWidgetsApplication5(QWidget *parent nullptr);~QtWidgetsApplication5();te…

Arthas实战(4)- 线程死锁问题排查

一、 准备测试应用 新建一个 SpringBoot应用&#xff0c;写一段线程死锁的代码&#xff1a; GetMapping("/threadLock") public void threadLock() {Thread thread1 new Thread(() -> {synchronized (resource1) {System.out.println(Thread.currentThread().g…

Solution

(解决方案)可行性研究报告暨设计方案-zengwenfeng.doc 基本上都要300-500多页&#xff0c;大型【纯软件】&#xff0c;县级0-200万&#xff0c;市级项目500-1500万不等&#xff0c;省部级1000-10000万不等都有。本例为过往已完成项目案例目录结构。搞方案都要准备1-3个月呢。所…

go语言 类型和常量

go语言 类型和常量 一、基础类型 Go语言是一种静态类型语言&#xff0c;这意味着所有变量的类型在编译时必须明确&#xff0c;并且一旦定义&#xff0c;类型就不能改变。 1.数字类型 整数类型 int8&#xff1a;占1个字节&#xff0c;范围是-128到127。int16&#xff1a;占2…

房屋租赁管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;中介管理&#xff0c;房屋信息管理&#xff0c;房屋类型管理&#xff0c;租房订单管理&#xff0c;租房信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;房屋信息&a…

极狐GitLab 将亮相2024空天信息大会暨数字地球生态峰会,携手中科星图赋能空天行业开发者

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

测试类型介绍-功能测试入门指南

1. 功能测试定义​ 功能测试&#xff0c;作为软件质量保证的关键环节&#xff0c;专注于验证软件是否按预期执行其指定功能。它直接面向用户需求&#xff0c;确保每一个功能点都能正确无误地工作。简而言之&#xff0c;功能测试是检查软件功能是否符合设计规范的过程。 2. 为…

Django文档简化版——Django快速入门——创建一个基本的投票应用程序

Django快速入门——创建一个基本的投票应用程序 准备工作1、创建虚拟环境2、安装django 1、请求和响应&#xff08;1&#xff09;创建项目&#xff08;2&#xff09;用于开发的简易服务器&#xff08;3&#xff09;创建投票应用&#xff08;4&#xff09;编写第一个视图1、编写…

Qualcomm QCA206x EasyMesh For Ubuntu

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

Mysql笔记-v2【7月5日更新】

零、 help、\h、? 调出帮助 mysql> \hFor information about MySQL products and services, visit:http://www.mysql.com/ For developer information, including the MySQL Reference Manual, visit:http://dev.mysql.com/ To buy MySQL Enterprise support, training, …

详解yolov5的网络结构

转载自文章 网络结构图&#xff08;简易版和详细版&#xff09; 此图是博主的老师&#xff0c;杜老师的图 网络框架介绍 前言&#xff1a; YOLOv5是一种基于轻量级卷积神经网络&#xff08;CNN&#xff09;的目标检测算法&#xff0c;整体可以分为三个部分&#xff0c; ba…