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

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

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

一、理解窗口句柄

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

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


二、Windows句柄的获取与切换

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

    from selenium.webdriver import Chrome
    from time import sleep
    driver = 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 Chrome
    from time import sleep
    driver = Chrome() # 使用上下文管理器
    driver.get('http://www.baidu.com') # 访问百度主页
    sleep(2) # 等待页面加载
    # 点击新闻链接
    driver.find_element_by_link_text('新闻').click()
    sleep(2) # 等待新闻页面加载
    # 获取所有窗口句柄
    handles = driver.window_handles
    print("可操作窗口句柄:", 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 Chrome
    from 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_handles
    print("所有窗口句柄:", current_handles)
    # 切换到“百度新闻”窗口
    # 假设“百度新闻”窗口是第三个窗口
    driver.switch_to.window(current_handles[2])
    # 进行后续操作,例如点击科技链接
    driver.find_element_by_link_text('科技').click()
    sleep(2)

    七、优化建议

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

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

    你可能感兴趣的文章
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP三大特征抽取器:CNN、RNN与Transformer全面解析
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP度量指标BELU真的完美么?
    查看>>
    NLP的不同研究领域和最新发展的概述
    查看>>
    NLP的神经网络训练的新模式
    查看>>
    NLP采用Bert进行简单文本情感分类
    查看>>
    NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
    查看>>
    NLP项目:维基百科文章爬虫和分类【02】 - 语料库转换管道
    查看>>
    NLP:使用 SciKit Learn 的文本矢量化方法
    查看>>
    nmap 使用方法详细介绍
    查看>>
    Nmap扫描教程之Nmap基础知识
    查看>>
    nmap指纹识别要点以及又快又准之方法
    查看>>
    Nmap渗透测试指南之指纹识别与探测、伺机而动
    查看>>
    Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    NMAP网络扫描工具的安装与使用
    查看>>
    NMF(非负矩阵分解)
    查看>>
    nmon_x86_64_centos7工具如何使用
    查看>>
    NN&DL4.1 Deep L-layer neural network简介
    查看>>