TA的每日心情 | 无聊 2024-9-27 10:07 |
---|
签到天数: 62 天 连续签到: 1 天 [LV.6]测试旅长
|
有时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[0]) # 再次切换窗口
- 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
复制代码
|
|