Selenium-使用教程

简介

Selenium 最初是一个用于网站的自动化测试工具,支持各种 ChromeFirefoxSafari 等主流浏览器,同时也支持 phantomJS 无界面浏览器。不过其更通常的使用在于爬虫中使用,其主要是用于解决 requests 无法直接执行 JavaScript 代码的问题,不过用于解析 Dom 元素更有其妙用之处。


基础使用

安装

Python 中使用 Selenium 需要通过 pip 安装即可。

1
pip install selenium

驱动程序

Selenium 在安装之后还需要一个驱动程序来与浏览器交互,不同的浏览器都有自己的驱动程序。列表如下:

浏览器 下载链接
Chrome https://sites.google.com/chromium.org/driver/
Edge https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox https://github.com/mozilla/geckodriver/releases
Safari https://webkit.org/blog/6900/webdriver-support-in-safari-10/

不过在新版本 4.6.0 之后,发行包中包含一个 Selenium Manager 新工具,该工具帮助 Selenium 在发现驱动程序不可用时,会自动发现、下载并缓存驱动程序。

基本使用

模拟点击百度首页输出其标题。

1
2
3
4
5
6
7
8
9
10
11
from selenium import webdriver
from selenium.webdriver.common.by import By

url = 'https://baidu.com'
browser = webdriver.Chrome()
browser.get(url)

title = browser.find_element(By.TAG_NAME, 'title')
print(title.get_attribute('textContent'))

browser.quit()

常用操作

元素定位

通过方法查找元素的函数共有两个:

  • find_element(By.KEY, 'KEY_NAME')
  • find_elements(By.KEY, 'KEY_NAME')

By.KEY 用于定位页面上的元素共有以下八种:

  • ID 通过元素的 ID 属性定位元素。
  • NAME 通过元素的名称属性定位元素。
  • XPATH 通过在 XML 文档中的 XPATH 节点定位元素。
  • LINK_TEXT 通过锚标记中使用的链接文本定位元素。
  • PARTIAL_LINK_TEXT 通过锚标记中使用的链接文本定位元素。
  • TAG_NAME 通过标签名称定位元素。
  • CLASS_NAME 通过类名定位元素。
  • CSS_SELECTOR 使用 CSS 选择器语法定位元素。

WebElement 常用方法

  1. clear()
    如果元素是输入文本,则清除文本。
  2. click()
    单击该元素。
  3. get_attribute()
    获取元素的给定属性。
  4. get_dom_attribute()
    获取元素在 HTML 标记中声明的元素。
  5. get_property()
    获取元素的给定属性。
  6. is_displayed()
    该元素是否对用户可见。
  7. is_enabled()
    该元素使用可用。
  8. is_selected()
    该元素是否被选中。
  9. send_keys()
    模拟在元素中输入内容。
  10. location
    获取元素的坐标。
  11. submit()
    提交表格。
  12. text
    元素的文本。
  13. tag_name
    元素的 tagName 属性。

鼠标键盘事件

  1. click(on_element=None)
    单击左键。
  2. context_click(on_element=None)
    单击右键。
  3. double_click(on_element=None)
    双击左键。
  4. key_down(value, on_element=None)
    按下键盘上的某个键。
  5. key_up(value, on_element=None)
    松开键盘上的某个键。
  6. move_by_offset(xoffset, yoffset)
    鼠标从当前位置移动到某个坐标。
  7. move_to_element(to_element)
    鼠标移动到某个元素。
  8. move_to_element_with_offset(to_element, xoffset, yoffset)
    移动到距某个元素(左上角坐标)多少距离的位置。
  9. send_keys()
    发送某个键或者输入文本到当前元素。

浏览器操作

  1. 获取页面的 URL

    1
    browser.current_url
  2. 获取页面日志

    1
    2
    3
    4
    5
    6
    7
    8
    browser.maximize_window() # 最大化
    browser.fullscreen_window() # 全屏
    browser.minimize_window() # 最小化
    browser.get_window_position() # 获取窗口的坐标
    browser.get_window_rect() # 获取窗口的大小和坐标
    browser.set_window_position(100, 200) # 设置窗口的坐标
    browser.set_window_rect(100, 200, 32, 50) # 设置窗口的大小和坐标
    browser.set_window_size(200, 300) # 设置窗口的大小
  3. 关闭页面

    1
    2
    browser.close() # 关闭当前标签页
    browser.quit() # 关闭浏览器并关闭驱动
  4. 屏幕操作

    1
    2
    3
    browser.save_screenshot('save.png') # 截图,只支持 PNG 格式
    browser.get_screenshot_as_png() # 获取当前窗口的截图作为二进制数据
    browser.get_screenshot_as_base64() # 获取当前窗口的截图作为 base64 编码的字符串
  5. 前进后退刷新

    1
    2
    3
    browser.forward() # 前进
    browser.back() # 后退
    browser.refresh() # 刷新
  1. get_cookie(NAME)
    获取指定键的 Cookies
  2. get_cookies()
    获取所有的 Cookies
  3. delete_cookie(NAME)
    删除指定键的 Cookies
  4. delete_all_cookies()
    删除所有的 Cookies

JavaScript 操作

Selenium 可以自定义执行 JavaScript

1
browser.execute_script("alter('hello selenium!')")

示例 Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# 获取居民消费价格指数 CPI 数据,数据来源于东方财富网。

def to_next_page(browser):
# 点击下一页,获取数据
pagerbox = browser.find_elements(By.CLASS_NAME, 'pagerbox')[0]
a = pagerbox.find_elements(By.TAG_NAME, 'a')
for ai in a:
if ai.text == '下一页':
ai.send_keys(Keys.ENTER)
print(ai.text)
time.sleep(3)
get_data(browser)

def get_data(browser):
# 解析数据结构
table = browser.find_element(By.CLASS_NAME, 'table-model')
tbody = table.find_elements(By.TAG_NAME, 'tbody')[0]
tr = tbody.find_elements(By.TAG_NAME, 'tr')
print(len(tr))
# 遍历数据结构并输出
for tr_e in tr:
td = tr_e.find_elements(By.TAG_NAME, 'td')
print('-'*50)
for td_e in td:
print(td_e.text)
# 下一页
to_next_page(browser)

def parse_url(url):
browser = webdriver.Chrome()
browser.get(url)
# 获取 CPI 数据
get_data(browser)
browser.quit()

if __name__ == '__main__':
url = 'https://data.eastmoney.com/cjsj/cpi.html'
# 解析 URL 并输出数据
parse_url(url)

异常信息

NoSuchElementException

在获取页面元素后,如果 Dom 发生变化就会出现该异常。

stale element reference: stale element not found

分析该问题是因为在 Dom 树中未找到该元素。因此其解决方案就是保证在操作前,该元素存在且是可操作的。


引用

官方文档


个人备注

此博客内容均为作者学习所做笔记,侵删!
若转作其他用途,请注明来源!