博客
关于我
selenium+python之切换窗口
阅读量:507 次
发布时间: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/

    你可能感兴趣的文章
    PostgreSQL 10.0 preview 变化 - pg_xlog,pg_clog,pg_log目录更名为pg_wal,pg_xact,log
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 15章 并行查询_15.2. 何时会用到并行查询?...
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较
    查看>>
    PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色
    查看>>
    Postgresql 12.9如何配置允许远程连接
    查看>>
    PostgreSQL 9.6 同步多副本 与 remote_apply事务同步级别 应用场景分析
    查看>>
    Postgresql CopyManager 流式批量数据入库
    查看>>
    PostgreSQL cube 插件 - 多维空间对象
    查看>>
    PostgreSQL Daily Maintenance - cluster table
    查看>>
    PostgreSQL on Linux 最佳部署手册
    查看>>
    PostgreSQL Oracle 兼容性之 - pipelined
    查看>>
    PostgreSQL Point-In-Time Recovery (Incremental Backup)
    查看>>
    postgresql Streaming Replication监控与注意事项
    查看>>
    postgresql 不需要付费_使用数据传输在PostgreSQL执行 外部连接运算符
    查看>>
    postgresql 主从配置_生产环境postgresql主从环境配置
    查看>>
    postgresql 函数&存储过程 ; 递归查询
    查看>>
    PostgreSQL 分组聚合查询中 filter 子句替换 case when
    查看>>
    PostgreSQL 同步流复制锁瓶颈分析
    查看>>
    PostgreSQL 备份与还原命令 pg_dump
    查看>>
    Postgresql 外部表插件postgres_fdw的安装和使用
    查看>>