当前位置: 首页 > news >正文

【Python】Selenium怎么切换浏览器的页面

我们在爬网使用Selenium进行测试的时候,有时候想要点击浏览器里面的网址,跳到另一个页面上,获取第二个页面的内容。

在这里插入图片描述
可是有时候从官网进去,点击跳转到下一个页面以后,却没法定位到下一个页面的元素,这时候就需要在多个浏览器标签页或窗口之间切换了,以下是切换浏览器页面的方法,这里主要使用的是window_handles进行切换:

1. 获取所有标签页句柄,并切换到特定标签页

如果是需要点击页面的某个元素进入到下一页,需要定位到跳转下一个浏览器页面的元素,点击后,等待获取所有的浏览器标签页的句柄。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 创建WebDriver实例,指定WebDriver的路径
driver = webdriver.Chrome(executable_path='path/to/chromedriver')# 打开目标网页
driver.get('https://XXX.com')# 等待页面加载完成,然后定位元素element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '')))
# 点击元素
element.click()# 等待新窗口打开,获取新窗口的句柄
WebDriverWait(driver, 10).until(lambda d: len(d.window_handles) > 1) 

使用driver.window_handles来获取当前浏览器所有打开的标签页的句柄列表,这意味着可以看到当前的浏览器有多少个页面,最后以列表的形式呈现出来。

tabs = driver.window_handles
print(tabs)
print(len(tabs)) #打印列表的个数

接着使用driver.switch_to.window()方法,传入标签页句柄的位置,来切换到特定的标签页。

driver.switch_to.window(tabs[1])  # 切换到第二个标签页
driver.switch_to.window(tabs[2])  # 切换到第三个标签页

在新标签页中执行完操作后,可以关闭它并返回到原来的标签页,否则如果打开过多,可能会导致计算机资源不足,从而影响其他应用程序的性能,甚至可能导致浏览器或操作系统变慢或崩溃。

driver.close()  # 关闭当前标签页
driver.switch_to.window(tabs[0])  # 切换回第一个标签页

2. 打开新标签页,并连接新的网址

可以使用JavaScript来打开一个新标签页,并自动切换到新的空白标签页。

driver.execute_script("window.open();")

在这里插入图片描述
然后获取新的标签页句柄并切换:

new_tab = driver.window_handles[-1]  # 新标签页通常是列表中的最后一个
driver.switch_to.window(new_tab)

然后连接目标的网址,最后关闭这个窗口并返回到原来的标签页。

driver.close()  # 关闭当前标签页
driver.switch_to.window(tabs[0])  # 切换回第一个标签页

3.示例代码

点击网页元素,实现跳转的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 创建WebDriver实例,指定WebDriver的路径
driver = webdriver.Chrome(executable_path='path/to/chromedriver')# 打开目标网页
driver.get('https://XXX.com')# 等待页面加载完成,然后定位元素element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '')))
# 点击元素
element.click()# 等待新窗口打开,获取新窗口的句柄
WebDriverWait(driver, 10).until(lambda d: len(d.window_handles) > 1) driver.switch_to.window(driver.window_handles[-1])  # 切换到新标签页
#进行下一步对新标签页的操作,此部分自行编辑# 关闭新标签页并返回到原标签页
driver.close()
driver.switch_to.window(driver.window_handles[0])  # 切换回原标签页# 关闭新窗口
driver.close()# 最后,关闭浏览器
driver.quit()

新建空白窗口后,连接网址的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 创建WebDriver实例,指定WebDriver的路径
driver = webdriver.Chrome(executable_path='path/to/chromedriver')# 打开目标网页
driver.get('https://XXX.com')
sleep(3)driver.execute_script("window.open();")
driver.switch_to.window(driver.window_handles[-1])  # 切换到新窗口# 在新窗口中进行操作...
driver.get("http://www.XXX2.com")
sleep(3)# 切换回原标签页
driver.switch_to.window(driver.window_handles[0]) # 关闭新窗口
driver.close()# 最后,关闭浏览器
driver.quit()

请注意,不同的浏览器可能在处理标签页和窗口时有细微的差别,在使用的过程中,注意浏览器的区别,上面使用的是谷歌浏览器。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 关于Flutter的build
  • python gradio 的输出展示组件
  • 中介者模式(行为型)
  • 【JVM】JVM调优练习-随笔
  • 从C向C++20——C++11(1)
  • Sentinel规则持久化Push模式两种实现方式
  • Redis 关于内存碎片的解决方法
  • bug等级和优先级
  • 设计模式学习(二)工厂模式——抽象工厂模式+注册表
  • Token Labeling(NeurIPS 2021, ByteDance)论文解读
  • 数据结构--二叉树遍历
  • SAP 消息输出 - Adobe Form
  • C++相关概念和易错语法(22)(final、纯虚函数、继承多态难点)
  • Odoo创建一个自定义UI视图
  • sentinel网关限流配置及使用
  • JavaScript 如何正确处理 Unicode 编码问题!
  • angular学习第一篇-----环境搭建
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Java 最常见的 200+ 面试题:面试必备
  • Java程序员幽默爆笑锦集
  • Java知识点总结(JavaIO-打印流)
  • React as a UI Runtime(五、列表)
  • Spring Boot MyBatis配置多种数据库
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 首页查询功能的一次实现过程
  • 数据科学 第 3 章 11 字符串处理
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 译自由幺半群
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 你对linux中grep命令知道多少?
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • MyCAT水平分库
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​Linux·i2c驱动架构​
  • ​业务双活的数据切换思路设计(下)
  • ###C语言程序设计-----C语言学习(3)#
  • ###项目技术发展史
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C++20) consteval立即函数
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (三) diretfbrc详解
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)LINQ之路
  • .gitignore文件忽略的内容不生效问题解决
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .Net环境下的缓存技术介绍