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() 关闭当前窗口
二、示例
示例:进入搜狗搜索 --> 打开搜狗输入法页面 --> 输入法页面查看皮肤 --> 关闭搜狗搜索页面
--> 输入法页面查看词库
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
复制代码
作者:
梦想家
时间:
2018-5-14 16:52
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2