Selenium环境的安装
- 浏览器驱动的安装
- 安装Selenium库
- 启动浏览器窗口
- Selenium的基本操作
- 创建浏览器句柄
- 控制浏览器
- 查找元素
- 操作页面元素
Selenium环境的安装
浏览器驱动的安装
要想使用Selenium驱动浏览器,就要先安装对应版本的浏览器驱动.对于Chrome浏览器,其驱动的下载位置为https://sites.google.com/a/chromium.org/chromedriver/home.
下载好驱动后,我们要将驱动所在位置加入到系统路径PATH中.
安装Selenium库
使用pip install selenium即可安装selenium.
启动浏览器窗口
创建selenium.webdriver的Chrome对象,即可开启一个浏览器窗口,并返回一个句柄用以操作该浏览器.
from selenium import webdriver
driver = webdriver.Chrome()
Selenium的基本操作
下面介绍Selenium库的基本操作,具体内容请参考Selenium官方文档.
创建浏览器句柄
下面三种方式都可以创建浏览器句柄.
- 若chromedriver已被添加到路径,则可直接调用Chrome类的构造函数.
from selenium import webdriver
driver = webdriver.Chrome()
- 若chromedriver没有被添加到路径,则调用Chrome类的构造函数需要指定该驱动文件所在路径.
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/home/user/chromedirver')
- 要使用无界面模式启动浏览器,则需要向构造函数传入一个Option参数指定以无界面模式启动
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
option = Options()
option.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=option)
以无界面模式启动浏览器时,不会显示浏览器窗口.可以使用driver对象的save_screenshot()方法对当前窗口进行截图.
控制浏览器
- 访问网址
driver.get('https://www.baidu.com')
- 控制浏览器的前进后退
driver.refersh() # 刷新页面
driver.forward() # 前进页面
driver.back() # 后退页面
- 退出浏览器
driver.quit() # 关闭浏览器窗口并销毁driver对象
- 获取页面的状态
driver.current_url # 返回 页面的URL
driver.page_source # 返回 页面源码
driver.get_cookie('BAIDUID') # 返回 指定名字的cookies
driver.get_cookies() # 返回 所有cookies的列表
- 执行javascript代码
# 同步执行js代码
driver.execute('window.scrollTo(0, document.body.scrollHeight)')
# 异步执行js代码
driver.execute_async_script('send_xml_request()')
通过执行js代码将页面拉至指定位置,可以防止由于懒加载导致查询不到元素的问题
- 等待页面元素在使用WebDriver的find_xxx方法找不到某元素时会报错,而这可能与网速有关.因此,在查询元素的时候,应尽量使用等待.
- 隐式等待: 阻塞指定时间(单位为秒)直到下一个查找语句得到结果.若超过阻塞时间仍得不到指定元素则报错.
driver.implicityly_wait(10) # 阻塞最多10秒以得到下个查找语句的结果
- 显式等待: 阻塞指定时间(单位为秒)直到查询结果满足指定条件.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# 阻塞最多10秒直到driver句柄查到的结果存在
sort_btn = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, './/div[@class="f-sort"]/a[2]'))
)
expected_conditions包内定义了很多见名知义的条件,常用的有presence_of_element_located,element_to_be_clickable,element_to_be_selected,presence_of_all_elements_located等.
- 截图
driver.save_screenshot('./screenshot/image1.png') # 截图到文件./screenshot/image1.png中
查找元素
浏览器句柄WebDriver对象有18个以find_xxx开头的方法,可以根据返回值的类型分为两类.find_element_by_xxx()方法返回以WebElement对象的形式返回第一个匹配的页面元素,find_elements_by_xxx()方法以WebElement列表的形式返回所有匹配的页面元素对象.
方法 | 查询条件 |
| 根据节点的类名查找 |
| 根据节点的id查找 |
| 根据节点的name属性查找 |
| 根据节点的标签名查找 |
| 根据链接的文本查找 |
| 根据链接的文本进行模糊查找 |
| 根据CSS选择器语法查找 |
| 根据XPath语法查找 |
操作页面元素
页面元素WebElement对象存在如下属性和方法,可以对页面元素进行操作
- 查找子元素:与WebDriver完全相同,WebElement有一系列find_xxx()方法,用来在子元素中查找元素.
- 查询元素状态:
- 查询元素的文本内容
web_element.text
- 查询元素的属性
web_element.get_attribute('id')
web_element.get_attribute('href')
- 查询元素的CSS属性
web_element.value_of_css_property('height')
- 查询元素的坐标
web_element.rect # 得到 {'height': 220, 'width': 220, 'x': 200, 'y': 628}
web_element.location # 得到 {'x': 200, 'y': 628}
- 操作元素:
- 点击元素
web_element.click()
- 向可写入元素发送键盘事件
from selenium.webdriver.common.keys import Keys # 导入特殊键
input_web_element.send_keys('keys') # 写入字符串'keys'
input_web_element.send_keys(Keys.RETURN) # 写入回车键