介绍
selenium 支持 Chrome、Firefox、Safari 等主流浏览器。下面以 Chrome 浏览器为例。
开始使用
from selenium import webdriver # 导入 webdriver
import time # selenium 经常会用到 time.sleep(time)。因为 selenium 可能会在网页没有完全加载完成时就去获取和操作 DOM,导致出错,所以适当使用 time.sleep(time) 以防出错
driver = webdriver.Chrome() # 打开 Chrome 浏览器
driver.get(url) # get 方法打开网页
driver.maximize_window() # 最大化窗口(因为有时候需要根据屏幕像素定位,所以最大化是有必要的)
driver.minimize_window() # 最小化窗口
driver.page_source # 网页源代码
driver.save_screenshot('screenshot.png') # 保存当前网页截图
driver.close() # 关闭当前窗口
driver.quit() # 关闭所有窗口并退出浏览器,清除临时目录下的临时文件
DOM 操作
查找元素
el = driver.find_element_by_id(id) # 根据 id 查找元素。同样的方法还有根据 类名、标签名、xpath、css选择器 查找
child_el = parent_el.find_element_by_class_name(class_name) # find_element(s)_by_xxx 方法也可以通过一个元素调用,这样只会在其子元素中查找符合条件的元素
parent_el = child_el.find_element_by_xpath('./..') # selenium 没有原生提供根据子元素获取父元素的方法,只能通过 xpath 的语法来做到这一点
如果要获取兄弟结点,有两种方法:
- 先获取父节点,再通过父节点获取兄弟结点;
- 使用 xpath 语法中的
preceding-sibling
、following-sibling
等(TODO)
处理元素
el.click() # 点击元素
el.clear() # 如果是输入框,清空框里的东西
el.send_keys(string) # 如果是输入框,将 string 填写到框中
el.submit() # 自动寻找 el 最近的表单并提交
el.save_screenshot("el_screenshot.png") # 保存当前元素的截图
el.text # 元素的文本内容
el.get_attribute(attr_name) # 获取元素某个属性的属性值
el.value_of_css_property(style_name) # 获取元素的某个 css 属性的值
处理 cookies
cookies = driver.get_cookies() # 获取 cookies(是一个列表。列表每个元素都是一个 cookie,以字典形式存储)
driver.add_cookie(cookie) # 添加一个 cookie,以后继续通过 selenium 操作浏览器时都会使用这个 cookie
for cookie in cookies: # 迭代添加所有 cookie
driver.add_cookie(cookie)
处理对话框
alert = driver.switch_to.alert # 定位到 alert 对话框
alert.accept() # 相当于点击 alert 对话框中的“确定”按钮
alert.dismiss() # 相当于点击 alert 对话框中的“取消”按钮
alert.text # alert 对话框的文本内容
多个窗口的处理
driver.window_handles # 所有窗口的句柄(是一个列表)
driver.switch_to_window(handle) # 聚焦到某个窗口
处理 iframe
网页中存在 iframe
标签时,要想操作 iframe
包含的网页,必须:
driver.switch_to_frame(iframe_id)
使用下面这行代码回到外层网页:
driver.switch_to_default_content()
复杂点击和按键事件
单击事件是最常用的操作,可以直接 el.click()
调用。其他点击和按键事件则需要导入另一个类:
from selenium.webdriver.common.action_chains import ActionChains # 导入 ActionChains 类
ActionChains(driver).double_click(el).perform()
# ActionChains(driver) ———— 创建对象,参数是 driver;
# double_click(el) ———— 鼠标双击事件,参数是要双击的元素;
# 写了 perform(),该操作才会执行
执行 JS 代码
driver.execute_script("alert(1)")
技巧:处理延时加载的网页
有些网页内容或图片在用户下拉后才动态加载出来,此时就需要模拟这个下拉过程。
下面这段代码的功能是,将网页每秒向下滚动 500 像素:
top = 500 # 不要设太大也不要太小,500 差不多
scrollHeight = driver.execute_script("return document.body.scrollHeight") # 获取当前网页高度
while top < scrollHeight:
print("当前距网页顶部:" + str(top) + "px")
driver.execute_script("document.documentElement.scrollTop = " + str(top)) # 滚动
top += 500
time.sleep(1)
scrollHeight = driver.execute_script("return document.body.scrollHeight")