一、什么是Selenium
selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
二、selenium基本使用
声明浏览器对象
上面我们知道了selenium支持很多的浏览器,但是如果想要声明并调用浏览器则需要:
1 | from selenium import webdriver |
driver_path为你所下载的浏览器driver,且储放的位置。其他的支持的浏览器都可以通过这种方式调用
设置无头浏览器
如果你不希望浏览器打开,那么你可以选择使用Chrome或Firefox的无头版本(PhantomJS已经嗝屁)
下面我们来设置一下chrome无头版本
1 | from selenium.webdriver.chrome.options import Options |
访问页面
1 | from selenium import webdriver |
上述代码运行后,会自动打开Chrome浏览器,并登陆百度打印百度首页的源代码,然后关闭浏览器
查找元素
单个元素查找
1 | from selenium import webdriver |
这里我们通过五种不同的方式去获取响应的元素,第一种是通过id的方式,第二个中是CSS选择器,第三种是xpath选择器方式结果都是相同的。
这里列举一下常用的查找元素方法:
1 | find_element_by_name |
下面这种方式是比较通用的一种方式:这里需要记住By模块所以需要导入from selenium.webdriver.common.by import By
1 | from selenium import webdriver |
当然这种方法和上述的方式是通用的,browser.find_element(By.ID,”q”)这里By.ID中的ID可以替换为其他几个
多个元素查找
其实多个元素和单个元素的区别,举个例子:find_elements,单个元素是find_element,其他使用上没什么区别,获得的是一个列表
元素交互操作
操作输入框
1 | from selenium import webdriver |
运行的结果可以看出程序会自动打开Chrome浏览器并打开淘宝输入ipad,然后删除,重新输入MakBook pro,并点击搜索
操作checkbox
因为要选中checkbox标签,在网页中是通过鼠标点击的,因此要选中checkbox标签,那么先选中这个标签,再通过执行click事件来完成
1 | check_ele = browser.find_element_by_id('q') |
选择select
select元素不能直接点击,因为点击后还要选中元素,因此selenium为select标签专门提供了一个类,selenium.webdriver.support.ui.Select,将获取到的元素当成参数传到这个类中,创建对象,然后就就可以用这个对象进行选择了
1 | from selenium.webdriver.support import Select |
动作链
将动作附加到动作链中串行执行
1 | from selenium import webdriver |
更多操作:
click_and_hold(element):点击但不松开鼠标
context_click(element):右键点击
double_click(element):双击
等待
当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常, 换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
隐式等待
到了一定的时间发现元素还没有加载,则继续等待我们指定的时间,如果超过了我们指定的时间还没有加载就会抛出异常,如果没有需要等待的时候就已经加载完毕就会立即执行
1 | from selenium import webdriver |
显示等待
指定一个等待条件,并且指定一个最长等待时间,会在这个时间内进行判断是否满足等待条件,如果成立就会立即返回,如果不成立,就会一直等待,直到等待你指定的最长等待时间,如果还是不满足,就会抛出异常,如果满足了就会正常返回
1 | from selenium import webdriver |
上述的例子中的条件:EC.presence_of_element_located()是确认元素是否已经出现了
EC.element_to_be_clickable()是确认元素是否是可点击的
常用的判断条件:
1 | title_is 标题是某内容 |
执行JavaScript
这是一个非常有用的方法,这里就可以直接调用js方法来实现一些操作,
下面的例子是通过登录知乎然后通过js翻到页面底部,并弹框提示
1 | from selenium import webdriver |
获取元素属性
get_attribute(‘class’)
1 | from selenium import webdriver |
获取文本值
text
1 | from selenium import webdriver |
获取ID,位置,标签名
id
location
tag_name
size
1 | from selenium import webdriver |
截图
1 | from selenium import webdriver |
cookie操作
get_cookies()
delete_all_cookes()
add_cookie()
1 | from selenium import webdriver |
选项卡管理
通过执行js命令实现新开选项卡window.open()
不同的选项卡是存在列表里browser.window_handles
通过browser.window_handles[0]就可以操作第一个选项卡
switch_to_window()被标记成不建议使用,因为已经计划把他从今后版本中去除,目前需要使用switch_to.window()方法
1 | import time |
设置代理ip
因为经常爬取网站可能会被封ip,所以我们需要代理ip
1 | from selenium import webdriver |