一、前言
在进行web自动化测试或者App端webview自动化测试时,都会遇到切换标签页的场景,通常情况下使用WebDriverWait里面的一个方法,去等待一个新的标签页打开,然后切换至新的标签页。当有时出现异常,同时打开两个标签页的时候就不能使用WebDriverWait里面的等待方法。
二、方式实现
1、通常解决标签页切换的方法是:
def switch_to_new_window(self, locator, timeout=30, poll_frequency=0.5):
# 获取所有的窗口句柄
handles = self.driver.window_handles
# 点击元素,打开新标签页
self.driver.find_element(*locator).click()
# 等待新的标签页生成
WebDriverWait(self.driver, timeout, poll_frequency=poll_frequency).until(EC.new_window_is_opened(handles))
# 切换至新打开的标签页
self.driver.switch_to.window(self.driver.window_handles[-1])
2、遇到的问题:
- 点击某个元素后,先后生成两个标签页;
- 生成的两个标签页中,其中一个是空白页,无任何内容;
- 空白页有时生成快,有时慢,有时生成后还消失;
使用WebDriverWait里面的等待方法时,有时会切换至空白页面,而且有时切换至空白页后该页面消失了。面对这种异常情况,只能根据异常现象重新去封装一个切换方法。
def switch_to_new_window_wait(self, locator, timeout=30, frequcy=0.5):
# 获取所有的窗口句柄
handles = self.driver.window_handles
# 点击元素,打开新标签页
self.driver.find_element(*locator).click()
used_time = 0
while used_time < timeout:
# 点击元素后获取所有的窗口句柄
old_handles = self.driver.window_handles
time.sleep(frequcy)
# 等待之后再次获取所有的窗口句柄
new_handles = self.driver.window_handles
# 比较等待前后窗口句柄是否相等
if old_handles == new_handles:
# 判断是否有新的标签页生成
if handles[-1] != new_handles[-1]:
try:
self.driver.switch_to.window(new_handles[-1])
# 判断是否进入了空白页
if self.driver.current_url is None:
print("
" + "进入了空白页")
used_time += frequcy
continue
my_log.info("切换至新标签页成功")
return
except:
# 空白页消失报错,等待一定的时间
used_time += frequcy
continue
used_time += frequcy
my_log.error("切换至新标签页失败!")
上面的方法可以解决我遇到的标签页切换问题。