在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换。
以百度首页和百度注册页为例,在两个窗口之间的切换。

多窗口切换1.py
# coding=utf-8
from selenium import webdriver
import time
# 访问百度
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 获取百度搜索窗口句柄
search_windows = driver.current_window_handle
driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[3]/a[7]').click()
time.sleep(3)
driver.find_element_by_xpath('/html/body/div[4]/div[2]/div[2]/div/div/div/div/div/div[3]/a').click()
# 获取打开所有窗口句柄
all_handles = driver.window_handles
# 进入注册窗口
for handle in all_handles:
if handle != search_windows:
driver.switch_to_window(handle)
print("now regester window")
driver.find_element_by_id('TANGRAM__PSP_4__userName').send_keys('namejianjain')
time.sleep(3)
for handle in all_handles:
if handle == search_windows:
driver.switch_to_window(handle)
print("now search window")
time.sleep(3)
driver.find_element_by_id("TANGRAM__PSP_4__closeBtn").click()
time.sleep(3)
driver.find_element_by_id('kw').send_keys('selenium')
driver.find_element_by_id('su').click()
time.sleep(5)
driver.close()
脚本执行过程:首先打开百度首页,通过current_window_handle获得当前窗口的句柄,并赋值给变量sreach_handle。接着打开登陆弹窗,在登陆弹窗上单击“立即注册”,从而打开新的注册窗口。通过window_handles获得当前打开的所有窗口的句柄,并赋值给变量all_handles。
第一个循环遍历all_handles,如果handle不等于sreach_handle,那么一定是注册窗口,因为脚本执行过程中只打开了两个窗口。所以,通过switch_to.window()切换到注册页进行注册操作。第二个循环类似,不过这一次判断如果handle等于sreach_handle,那么切换到百度搜索页,然后进行搜索操作。
在本例中所涉及的新方法如下:
current_window_handle:获得当前窗口句柄
window_handles:返回所有窗口的句柄到当前会话。
switch_to_window():用于切换到相应的窗口,与上一节的switch_to.frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。
多窗口切换2.py
import time
from selenium import webdriver
driver = webdriver.Firefox()
driver.maximize_window() # 窗口最大化
driver.get('https://www.baidu.com') # 在当前浏览器中访问百度
# 新开一个窗口,通过执行new一个窗口
new = 'window.open("https://www.sogou.com");'
driver.execute_script(new)
print(driver.current_window_handle) # 输出当前窗口句柄(百度)
handles = driver.window_handles # 获取当前窗口句柄集合(列表类型)
print(handles) # 输出句柄集合
for handle in handles: # 切换窗口(切换到搜狗)
if handle != driver.current_window_handle:
print('switch to ', handle)
driver.switch_to.window(handle)
print(driver.current_window_handle) # 输出当前窗口句柄(搜狗)
break
time.sleep(2)
driver.close() # 关闭当前窗口(搜狗)
time.sleep(2)
driver.switch_to.window(handles[0]) # 切换回百度窗口
多窗口的网页标签句柄
handles=driver.window_handles #获取所有网页标签的窗口句柄,以列表形式保存
handles[-1] #表示取得最新打开的标签页的窗口句柄
handle=drvier.current_window_handle #获取当前页的标签页的窗口句柄
driver.switch_to.window(driver.window_handles[-1]) #切换到最新的窗口句柄
例子1的另一种写法:
# coding=utf-8
from selenium import webdriver
import time
# 访问百度
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 获取百度搜索窗口句柄
search_windows = driver.current_window_handle
driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[3]/a[7]').click()
time.sleep(3)
driver.find_element_by_xpath('/html/body/div[4]/div[2]/div[2]/div/div/div/div/div/div[3]/a').click()
# 获取打开所有窗口句柄
all_handles = driver.window_handles
# 进入注册窗口
for handle in all_handles:
if handle != search_windows:
driver.switch_to_window(all_handles[1])#切换到第二个窗口的句柄
print("now regester window")
driver.find_element_by_id('TANGRAM__PSP_4__userName').send_keys('namejianjain')
time.sleep(3)
for handle in all_handles:
if handle == search_windows:
driver.switch_to_window(all_handles[0]) #切换回主页句柄
print("now search window")
time.sleep(3)
driver.find_element_by_id("TANGRAM__PSP_4__closeBtn").click()
time.sleep(3)
driver.find_element_by_id('kw').send_keys('selenium')
driver.find_element_by_id('su').click()
time.sleep(5)
来源:CSDN
作者:w68688686
链接:https://blog.csdn.net/w68688686/article/details/103807225