介绍
selenium 支持 Chrome、Firefox、Safari 等主流浏览器。下面以 Chrome 浏览器为例。
开始使用
from selenium import webdriver # 导入 webdriverimport 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 操作浏览器时都会使用这个 cookiefor cookie in cookies: # 迭代添加所有 cookiedriver.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 += 500time.sleep(1)scrollHeight = driver.execute_script("return document.body.scrollHeight")
