51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3106|回复: 1
打印 上一主题 下一主题

selenium自动化测试入门 浏览器多窗口切换

[复制链接]
  • TA的每日心情
    无聊
    2024-9-27 10:07
  • 签到天数: 62 天

    连续签到: 1 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 2018-2-7 15:30:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
          有时web应用会打开多个浏览器窗口,当我们要定位新窗口中的元素时,我们需要将webDriver的handle(句柄)指定到新窗口。什么意思?

          假设我们打开web应用,在系统运行过程中重新打开一个新窗口(可以是页签,当前浏览器存在两
    个窗口),这时我们webDriver对浏览器的操作指针(句柄)还再原窗口,如果需要操作新窗口元素就
    要将handle句柄切换到新窗口。

          一、常用方法

          driver.current_window_handle 获取当前窗口handle

          driver.window_handles 获取所有窗口的handle,返回list列表

          driver.switch_to.window(handle) 切换到对应的窗口

          driver.close() 关闭当前窗口

          二、示例

          示例:进入搜狗搜索 --> 打开搜狗输入法页面 --> 输入法页面查看皮肤 --> 关闭搜狗搜索页面
    --> 输入法页面查看词库
    1. from selenium import webdriver
    2. import time

    3. driver = webdriver.Chrome()
    4. driver.get('https://www.sogou.com/')
    5. driver.find_element_by_link_text('搜狗输入法').click()
    6. nowhandle = driver.current_window_handle  # 获得当前窗口
    7. print(driver.current_window_handle)
    8. print('当前窗口为:', driver.title)
    9. allhandles = driver.window_handles  # 获得所有窗口
    10. for handle in allhandles:  # 循环判断窗口是否为当前窗口
    11.    if handle != nowhandle:
    12.        driver.switch_to.window(handle)  # 切换窗口
    13.        time.sleep(2)
    14. print('切换到窗口:', driver.title)
    15. driver.find_element_by_link_text('皮肤').click()  # 操作新窗口元素
    16. driver.switch_to.window(nowhandle)  # 回到原先的窗口
    17. print('回到原来窗口:', driver.title)
    18. driver.close()  # 关闭当前窗口,关闭的是当前的窗口
    19. driver.switch_to.window(driver.window_handles[0])  # 再次切换窗口
    20. driver.find_element_by_link_text('词库').click()
    21. time.sleep(5)
    22. driver.quit()
    复制代码
        三、封装层函数

         在自动化测试中切换窗口页面一般会封装为函数,如下示例:

    1. def switch_to_window(driver, winB):
    2.    """
    3.    :param winB:
    4.        1.切换窗口的标题
    5.        2.切换窗口的序号
    6.        3.切换页面的元素
    7.    :return: True 切换成功
    8.    :Usage:
    9.    driver.switch_to_window('win_name')
    10.    driver.switch_to_window(2) # 切换到第二个窗口
    11.    located=(By.ID,'id') # 确定切换页面的元素
    12.    driver.switch_to_window(located) # 切换到页面中存在located的元素窗口
    13.    """
    14.    result = False
    15.    handles = driver.window_handles
    16.    current_handle = driver.current_window_handle
    17.    if isinstance(winB, tuple):
    18.        for handle in handles:
    19.            driver.switch_to.window(handle)
    20.            time.sleep(2)
    21.            try:
    22.                driver.find_element(*winB)
    23.            except NoSuchElementException:
    24.                pass
    25.            else:
    26.                result = True
    27.                break
    28.        if not result:
    29.            driver.switch_to.window(current_handle)
    30.            time.sleep(2)
    31.    elif isinstance(winB, str):
    32.        for handle in handles:
    33.            driver.switch_to.window(handle)
    34.            time.sleep(2)
    35.            if winB in driver.title:
    36.                result = True
    37.                break
    38.        if not result:
    39.            driver.switch_to.window(current_handle)
    40.            time.sleep(2)
    41.    elif isinstance(winB, int):
    42.        if winB <= len(handles):
    43.            driver.switch_to.window(winB - 1)
    44.            time.sleep(2)
    45.            result = True
    46.    else:
    47.        print('参数错误')
    48.    return result
    复制代码




    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-23 18:47 , Processed in 0.061620 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表