基于Selenium模块实现切换句柄
前言
有些网站页面在点开链接后会出现新的窗口,但是浏览器对象 browser(driver) 还是之前页面的对象,针对此问题,需要切换到不同的窗口进行操作,Selenium 模块提供了 switch_to.window() 方法 切换句柄 和 window_handles 属性 获取句柄列表,下面详细介绍如何使用 Selenium 模块完成句柄的切换,并以实际案例进行展示。
正文
1、常用方法
- 获取当前窗口句柄:
browser.current_window_handle
- 获取所有句柄:
browser.window_handles
- 切换句柄:
browser.switch_to.window()
2、使用流程
- 先创建浏览器对象:
browser = webdriver.Chrome()
- 先获取当前所有句柄(列表):
all_handles = browser.window_handles
- 再切换到指定句柄(利用列表下标索引取值):
browser.switch_to.window(all_handles[1])
3、使用示例
3.1、梳理需求
使用 selenium 抓取民政部最新行政区划代码,由于点击链接后,会出现界面的跳转,所以需要通过 selenium 实现句柄的切换
3.2、程序源码
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class MZBSpider:
def __init__(self):
self.options = webdriver.ChromeOptions() # 创建options功能对象
self.options.add_argument('--headless') # 设置无界面模式
self.driver = webdriver.Chrome(options=self.options) # 创建浏览器对象
self.driver.get(url='https://www.mca.gov.cn/article/sj/xzqh/2020/') # 输入网址
def parse_html(self):
"""
function: html解析函数
in: None
out: None
return: None
others: HTML Parse Func
"""
new_month_a = self.driver.find_element(By.XPATH,
'//*[@id="list_content"]/div[2]/div/ul/table/tbody/tr[1]/td[2]/a') # 找到最新月份的a节点
time.sleep(1) # 给页面的加载预留时间
new_month_a.click() # 点击
li = self.driver.window_handles # 出现两个窗口,需要切换句柄,先获取句柄列表
self.driver.switch_to.window(li[1]) # 切换句柄
tr_list = self.driver.find_elements(By.XPATH, '//*[@id="2020年10月份县以上行政区划代码_32423"]/table/tbody/tr')
item = {}
try:
for tr in tr_list[3:]:
one_city_list = tr.text.split()
item["城市"] = one_city_list[1].strip()
item["行政代码"] = one_city_list[0].strip()
print(item) # 打印
except Exception as e:
self.driver.quit() # 出现异常退出
def run(self):
"""
function: 程序入口函数
in: None
out: None
return: None
others: Program Entry Func
"""
self.parse_html()
if __name__ == '__main__':
spider = MZBSpider()
spider.run()
其中:
li = self.driver.window_handles # 出现两个窗口,需要切换句柄,先获取句柄列表
self.driver.switch_to.window(li[1]) # 切换句柄
这两句是实现句柄切换的具体步骤