版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
我们之前在《web自动化测试第3步:元素的基础操作和浏览器基础操作》这一节里最后预留了一个悬念,就是我们通过点击打开了一个新的页面,这时浏览器同时打开了两个页面,我们用close()方法关闭,却是关闭的初始页面,这时我们如果在新打开的页面来查找元素定位,也一定是定位不到的,所以我们要用到切换浏览器页签:也就是切换句柄handle切换的方法。
一、切换页签(句柄handle)的基础用法:
备注:部分方法为老写法,官方已经不推荐使用;点击这篇文章查看切换handle新写法。
1.获取浏览器当前所在页签的句柄:
- current_window_handle()
2.获取所有页面窗口的句柄
- window_handles()
3.将定位的页面转到指定的window_name页面
- switch_to_window(window_name):
- window_name:指定页面窗口的handle
二、关于webdriver源码展示
-
@property
-
def current_window_handle(self):
-
"""
-
Returns the handle of the current window.
-
-
:Usage:
-
driver.current_window_handle
-
"""
-
if self.w3c:
-
return self.execute(Command.W3C_GET_CURRENT_WINDOW_HANDLE)[
'value']
-
else:
-
return self.execute(Command.GET_CURRENT_WINDOW_HANDLE)[
'value']
-
-
@property
-
def window_handles(self):
-
"""
-
Returns the handles of all windows within the current session.
-
-
:Usage:
-
driver.window_handles
-
"""
-
if self.w3c:
-
return self.execute(Command.W3C_GET_WINDOW_HANDLES)[
'value']
-
else:
-
return self.execute(Command.GET_WINDOW_HANDLES)[
'value']
-
def switch_to_window(self, window_name):
-
""" Deprecated use driver.switch_to.window
-
"""
-
warnings.warn(
"use driver.switch_to.window instead",
-
DeprecationWarning, stacklevel=
2)
-
self._switch_to.window(window_name)
三、实际场景切换窗口
我们依旧以第三节,百度贴吧的场景来实现,如何通过切换窗口来定位其他窗口页面的元素。我们可以通过页面title的变化来判断handle是否已经切换;然后我们关闭这个新打开的页签后,需要手动切换到第一个handle,才能在第一个页面操作。
代码演示:
-
from selenium
import webdriver
-
from time
import sleep
-
-
# sleep方法是为了初学者能够更好地了解操作的变化
-
-
driver = webdriver.Chrome()
-
-
# get() 进入贴吧页面
-
driver.get(
"https://tieba.baidu.com/")
-
sleep(
1)
-
-
# 点击title为娱乐明星的<a>标签元素
-
driver.find_element_by_css_selector(
"a[title = '娱乐明星']").click()
-
sleep(
5)
-
-
# 获取全部窗口的handle
-
all = driver.window_handles
-
print(
"所有页签handle %s" % all)
-
-
# 获取当前窗口的handle(贴吧首页)
-
now_page = driver.current_window_handle
-
print(
"当前页面handle %s" % now_page)
-
-
# 获取当前页面的title(当前title)
-
title_first_page = driver.title
-
print(
"切换前title %s" % title_first_page)
-
-
# 将页面handle转到娱乐明星页面
-
driver.switch_to_window(all[
1])
-
-
# 获取当前页面的title(切换handle后)
-
title_next_page = driver.title
-
print(
"切换后title %s" % title_next_page)
-
-
# 关闭当前页签
-
sleep(
2)
-
driver.close()
-
-
# 必须要切换回另一个页签窗口
-
driver.switch_to_window(all[
0])
-
print(
"切换回第一个页签:%s" % driver.title)
结果:
-
所有页签handle [
'CDwindow-7FDD7BD3B5CCC6AB2F24D23BFAAEE3B3',
'CDwindow-BB6E2A7BB6B1A175947956E61DCF64BD']
-
当前页面handle CDwindow
-7FDD7BD3B5CCC6AB2F24D23BFAAEE3B3
-
切换前title 百度贴吧——全球最大的中文社区
-
切换后title 娱乐明星_百度贴吧
-
切换回第一个页签:百度贴吧——全球最大的中文社区