一、运行环境
selenium 支持 Chrome、Firefox、Safari 等主流浏览器。下面以 Chrome 浏览器为例。
1.1 Windows 环境部署
安装 Python3,用 pip 安装 selenium 包。
从官网下载安装 Chrome 浏览器。
下载 Chrome 浏览器驱动 chromedriver(下载地址),放在任意目录下,并加入
PATH
环境变量。注意:chromedriver 的版本要与 Chrome 浏览器的版本对应(在浏览器地址栏输入
about:version
可以查看浏览器版本,版本号看前三位就行)
1.2 Linux 环境部署
1.2.1 安装 Python3 和 selenium 包
下载 Python3 源码(下载地址),编译安装:
1
2
3
4$ wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
$ tar -xzf Python-3.7.2.tgz
$ cd Python-3.7.2
$ sudo ./configure && sudo make && sudo make install安装 selenium 包
1
$ sudo pip3 install selenium
1.2.2 安装 Chrome 浏览器(CentOS 7)
配置 yum 源
1
$ sudo vim /etc/yum.repos.d/google-chrome.repo
写入以下内容:
1
2
3
4
5
6[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pubyum 安装 google-chrome 浏览器
1
$ sudo yum -y install google-chrome-stable --nogpgcheck # 由于 Google 官方源被墙,需要加 --nogpgcheck 参数,以防安装失败
1.2.3 安装 Chrome 浏览器(Ubuntu)
安装 Chrome 浏览器官方 PPA:
1
2$ sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.list.d/
$ wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -安装 Chrome 浏览器:
1
2$ sudo apt update
$ sudo apt install google-chrome-stable
1.2.4 下载 chromedriver
下载地址、注意事项与 Windows 相同。下载完成后移动到 /usr/bin
或 /usr/local/bin
目录下,或者也可以将 chromedriver 所在目录加入 PATH
环境变量。
二、selenium 的基本操作
2.1 开始使用
1 | from selenium import webdriver # 导入 webdriver |
2.2 DOM 操作
2.2.1 查找元素
1 | el = driver.find_element_by_id(id) # 根据 id 查找元素。同样的方法还有根据 类名、标签名、xpath、css选择器 查找 |
如果要获取兄弟结点,有两种方法:
- 先获取父节点,再通过父节点获取兄弟结点;
- 使用 xpath 语法中的 preceding-sibling、following-sibling 等(TODO)
2.2.2 处理元素
1 | el.click() # 点击元素 |
2.3 处理 cookies
1 | cookies = driver.get_cookies() # 获取 cookies(是一个列表。列表每个元素都是一个 cookie,以字典形式存储) |
2.4 处理对话框
1 | alert = driver.switch_to.alert # 定位到 alert 对话框 |
2.5 多个窗口的处理
1 | driver.window_handles # 所有窗口的句柄(是一个列表) |
2.6 处理 iframe
网页中存在 iframe
标签时,要想操作 iframe
包含的网页,必须:
1 | driver.switch_to_frame(iframe_id) |
使用下面这行代码回到外层网页:
1 | driver.switch_to_default_content() |
2.7 复杂点击和按键事件
单击事件是最常用的操作,可以直接 el.click()
调用。其他点击和按键事件则需要导入另一个类:
1 | from selenium.webdriver.common.action_chains import ActionChains # 导入 ActionChains 类 |
三、Chrome 无头模式
在没有图形界面的主机上,浏览器无法启动,此时可以用 Chrome 的无头模式运行selenium。(无头模式只是没有打开 GUI,但浏览器的渲染工作是真真正正在进行的)
使用无头模式:
1 | from selenium import webdriver |
无头模式基本操作与一般模式相同。
无头模式中经常会用到保存截图的操作:driver.save_screenshot(path)
或 el.save_screenshot(path)
,可以通过查看截图了解运行过程。
四、启动带有用户配置的浏览器
1 | from selenium import webdriver |
在浏览器中输入 chrome://version
,找到 个人资料路径,删除最后的 /default,剩下的就是用户配置所在目录。
五、遇到过的问题及解决方法
linux 上以 root 身份运行 Chrome 时需要加
--no-sandbox
参数:1
2
3chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
driver = webdriver.Chrome(chrome_options=chrome_options)在 linux 上运行脚本时,需要在脚本开头加
1
2#!/usr/local/bin/python3
# -*-coding:utf8-*-在 CentOS 下,如果要将脚本加入计划任务中定时运行,Python3 和脚本位置都必须是绝对路径。
曾遇到过这种情况:linux 下手动执行脚本,执行成功;但用任务计划程序定时自动执行时,显示 chromedriver 不在环境变量中。这是因为使用任务计划程序时,环境变量
PATH
只包含/usr/bin:/bin
,只是正常情况下的一部分,所以最好将 chromedriver 放在/usr/bin
或/bin
路径下。