🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快
有时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
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。