海鸥一飞 发表于 2018-2-7 15:30:39

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

      有时web应用会打开多个浏览器窗口,当我们要定位新窗口中的元素时,我们需要将webDriver的handle(句柄)指定到新窗口。什么意思?

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

      一、常用方法

      driver.current_window_handle 获取当前窗口handle

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

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

      driver.close() 关闭当前窗口

      二、示例

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

driver = webdriver.Chrome()
driver.get('https://www.sogou.com/')
driver.find_element_by_link_text('搜狗输入法').click()
nowhandle = driver.current_window_handle# 获得当前窗口
print(driver.current_window_handle)
print('当前窗口为:', driver.title)
allhandles = driver.window_handles# 获得所有窗口
for handle in allhandles:# 循环判断窗口是否为当前窗口
   if handle != nowhandle:
       driver.switch_to.window(handle)# 切换窗口
       time.sleep(2)
print('切换到窗口:', driver.title)
driver.find_element_by_link_text('皮肤').click()# 操作新窗口元素
driver.switch_to.window(nowhandle)# 回到原先的窗口
print('回到原来窗口:', driver.title)
driver.close()# 关闭当前窗口,关闭的是当前的窗口
driver.switch_to.window(driver.window_handles)# 再次切换窗口
driver.find_element_by_link_text('词库').click()
time.sleep(5)
driver.quit()   三、封装层函数

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

def switch_to_window(driver, winB):
   """
   :param winB:
       1.切换窗口的标题
       2.切换窗口的序号
       3.切换页面的元素
   :return: True 切换成功
   :Usage:
   driver.switch_to_window('win_name')
   driver.switch_to_window(2) # 切换到第二个窗口
   located=(By.ID,'id') # 确定切换页面的元素
   driver.switch_to_window(located) # 切换到页面中存在located的元素窗口
   """
   result = False
   handles = driver.window_handles
   current_handle = driver.current_window_handle
   if isinstance(winB, tuple):
       for handle in handles:
         driver.switch_to.window(handle)
         time.sleep(2)
         try:
               driver.find_element(*winB)
         except NoSuchElementException:
               pass
         else:
               result = True
               break
       if not result:
         driver.switch_to.window(current_handle)
         time.sleep(2)
   elif isinstance(winB, str):
       for handle in handles:
         driver.switch_to.window(handle)
         time.sleep(2)
         if winB in driver.title:
               result = True
               break
       if not result:
         driver.switch_to.window(current_handle)
         time.sleep(2)
   elif isinstance(winB, int):
       if winB <= len(handles):
         driver.switch_to.window(winB - 1)
         time.sleep(2)
         result = True
   else:
       print('参数错误')
   return result



梦想家 发表于 2018-5-14 16:52:39

:victory:
页: [1]
查看完整版本: selenium自动化测试入门 浏览器多窗口切换