在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。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