博客
关于我
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/

    你可能感兴趣的文章
    NodeJS API简介
    查看>>
    Nodejs express 获取url参数,post参数的三种方式
    查看>>
    nodejs http小爬虫
    查看>>
    nodejs libararies
    查看>>
    nodejs npm常用命令
    查看>>
    nodejs npm常用命令
    查看>>
    Nodejs process.nextTick() 使用详解
    查看>>
    NodeJS yarn 或 npm如何切换淘宝或国外镜像源
    查看>>
    nodejs 中间件理解
    查看>>
    nodejs 创建HTTP服务器详解
    查看>>
    nodejs 发起 GET 请求示例和 POST 请求示例
    查看>>
    NodeJS 导入导出模块的方法( 代码演示 )
    查看>>
    nodejs 开发websocket 笔记
    查看>>
    nodejs 的 Buffer 详解
    查看>>
    NodeJS 的环境变量: 开发环境vs生产环境
    查看>>
    nodejs 读取xlsx文件内容
    查看>>
    nodejs 运行CMD命令
    查看>>
    Nodejs+Express+Mysql实现简单用户管理增删改查
    查看>>
    nodejs+nginx获取真实ip
    查看>>
    nodejs-mime类型
    查看>>