51Testing软件测试论坛

标题: selenium自动化测试入门 浏览器多窗口切换 [打印本页]

作者: 海鸥一飞    时间: 2018-2-7 15:30
标题: selenium自动化测试入门 浏览器多窗口切换
      有时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
复制代码





作者: 梦想家    时间: 2018-5-14 16:52





欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2