博客
关于我
selenium+python之切换窗口
阅读量:506 次
发布时间:2019-03-07

本文共 2147 字,大约阅读时间需要 7 分钟。

用Selenium控制多窗口操作:窗口句柄切换实例

一、理解窗口句柄

在Selenium中,每当打开一个新窗口,会产生一个唯一的浏览器窗口句柄。所有当前窗口的句柄会被存储在window_handles属性中,这个属性返回的是一个句柄列表。每个句柄具有类似格式的字符串形式(如CDwindow-XXXX),其中CD表示浏览器类型(Chrome或Edge)。

例如,在打开百度主页面后,点击某个链接会自动产生新的窗口,此时可以通过driver.window_handles获取所有窗口句柄。通过查看句柄列表,可以判断不同的窗口状态。


二、Windows句柄的获取与切换

  • 获取所有窗口句柄逐次获取当前所有窗口句柄的代码如下:

    from selenium.webdriver import Chromefrom time import sleepdriver = Chrome()  # 使用上下文管理器更优driver.get('http://www.baidu.com')  # 访问百度sleep(2)  # 等待2秒handles = driver.window_handles  # 获取窗口句柄列表print("当前窗口句柄:", handles)
  • 观察句柄变化关注窗口句柄的变化规律是基于操作流程。例如:

    • 当通过百度链接打开“百度新闻”窗口时,句柄的顺序大致为:
    • 初始搜索窗口(百度主页)
    • 新打开的百度新闻窗口(CDwindow-XXXX)这种顺序并不仅仅依赖于界面布局,而是基于操作先后性。
  • 统一的窗口句柄格式不论是Chrome还是Edge窗口,窗口句柄的格式均符合标准性模式,例如:

    CDwindow-XXXXXXXXXXXXXXXX

    这种格式便于分类识别不同类型的窗口。


  • 三、窗口句柄切换方法

    当需要操作窗口时,仅切换到指定句柄的窗口即可。使用以下方法:

    from selenium.webdriver import Chromefrom time import sleepdriver = Chrome()  # 使用上下文管理器driver.get('http://www.baidu.com')  # 访问百度主页sleep(2)  # 等待页面加载# 点击新闻链接driver.find_element_by_link_text('新闻').click()sleep(2)  # 等待新闻页面加载# 获取所有窗口句柄handles = driver.window_handlesprint("可操作窗口句柄:", handles)# 切换到第三个窗口(百度新闻窗口)driver.switch_to.window(handles[2])sleep(10)  # 允许页面完全加载# 点击“科技”链接tech_link = driver.find_element_by_link_text("科技")tech_link.click()sleep(2)  # 允许页面跳转完成

    四、切换窗口注意事项

  • 窗口判断依据核实切换窗口的依据。例如,百度新闻窗口的判断可基于以下条件:

    • 如果句柄以“CDwindow-”开头,且包含特定判断关键字,就为百度新闻窗口。
  • 窗口顺序问题切换窗口时,索引必须与实际操作窗口的句柄顺序一致。例如,若新窗口是第三个窗口,则必须选择handles[2]

  • 窗口状态监控在关键操作前,建议重新获取窗口句柄列表,确保已进入目标窗口状态。


  • 五、适用场景与结论

    • 场景一:当打开新窗口后,需要在多窗口环境下执行自动化测试或操作。
    • 场景二:当需要跨窗口切换时,且目标窗口句柄已知或可以通过程序获取。
    • 结论:通过切换句柄,能够实现浏览器窗口间的精确控制,从而完成复杂的自动化任务。

    六、代码示例

    以下代码展示了完整的窗口句柄获取与切换流程:

    from selenium.webdriver import Chromefrom time import sleep# 初始化浏览器driver = Chrome()# 访问百度主页driver.get('http://www.baidu.com')sleep(2)# 点击“新闻”链接driver.find_element_by_link_text('新闻').click()sleep(2)# 获取当前所有窗口句柄current_handles = driver.window_handlesprint("所有窗口句柄:", current_handles)# 切换到“百度新闻”窗口# 假设“百度新闻”窗口是第三个窗口driver.switch_to.window(current_handles[2])# 进行后续操作,例如点击科技链接driver.find_element_by_link_text('科技').click()sleep(2)

    七、优化建议

  • 代码结构化:将操作逻辑细化为函数,便于重复使用。
  • 增加异常处理:确保程序对意外句柄切换等情况有预案。
  • 跨浏览器适配:测试Edge或Firefox等其他浏览器的句柄操作流程。
  • 通过理解窗口句柄机制,可以实现对多窗口环境的统一控制,为复杂应用自动化提供重要支持。

    转载地址:http://bkljz.baihongyu.com/

    你可能感兴趣的文章
    Node.js之async_hooks
    查看>>
    Node.js初体验
    查看>>
    Node.js升级工具n
    查看>>
    Node.js卸载超详细步骤(附图文讲解)
    查看>>
    Node.js卸载超详细步骤(附图文讲解)
    查看>>
    Node.js基于Express框架搭建一个简单的注册登录Web功能
    查看>>
    node.js学习之npm 入门 —8.《怎样创建,发布,升级你的npm,node模块》
    查看>>
    Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
    查看>>
    Node.js安装及环境配置之Windows篇
    查看>>
    Node.js安装和入门 - 2行代码让你能够启动一个Server
    查看>>
    node.js安装方法
    查看>>
    Node.js官网无法正常访问时安装NodeJS的方法
    查看>>
    node.js模块、包
    查看>>
    node.js的express框架用法(一)
    查看>>
    Node.js的交互式解释器(REPL)
    查看>>
    Node.js的循环与异步问题
    查看>>
    Node.js高级编程:用Javascript构建可伸缩应用(1)1.1 介绍和安装-安装Node
    查看>>
    nodejs + socket.io 同时使用http 和 https
    查看>>
    NodeJS @kubernetes/client-node连接到kubernetes集群的方法
    查看>>
    NodeJS API简介
    查看>>