本文基于“白月黑羽教python”中自动化测试板块的学习,归纳总结并扩展的关于selenium介绍和使用方法。
简介
必要性及原理
selenium作为web自动化测试工具,目前在python爬虫中应用也越来越广泛。其主要应用原理是:通过完全模拟浏览器的操作,比如输入框输入、点击超链接元素、下拉滚动条等等来拿到js渲染之后的代码。
必要性:之前用的requests是对一个页面发送请求,只能获得当前加载出来的部分页面即最初的源代码,动态加载的数据是获取不到的,比如js渲染后的代码、下拉滚轮得到的数据和一些框内隐藏元素等等。
selenium的优点
- 免费、灵活
Selenium不是市场上唯一的自动化测试工具,而是唯一可以与付费产品竞争的免费工具。由于它可以在所有平台上移植,并且通常不需要学习新语言,因此Selenium提供了无与伦比的灵活性。 - 广泛语言的支持、浏览器和平台
支持java、C#、PHP、Python、JavaScript、R等多种语言在Windows、Linux、Mac、iOS多平台操作,同时支持Google、IE,Firefox,Opera,Safari等多种浏览器。 - 庞大社区
Udemy,Lynda.com和Coursera提供了几种学习Selenium的选项。 数百个分步的YouTube教程, 一个关于Quora的主题以及25,000个关注者,以及有关StackOverflow的55k个问题,预示着庞大的社区正在蓬勃发展,这为市场提供了更多的Selenium人才。 - 大型插件库
Selenium可以通过各种插件扩展到其标准功能之外。
selenium的缺点
- 需要专业的学习有着陡峭的学习曲线
,Selenium不允许进行无代码测试。 无代码测试是当下的一个趋势,测试人员只需要一些测试工具,在交互界面操作即可,但是selenium通过需要对其中一种编程语言有很好的了解。 - 没有技术支持
我们提到了丰富的教程,问题,答案以及指向聊天室的链接,您可以在其中向社区寻求帮助。 不利的一面是,提供帮助的是社区,而不是产品创建者。 - 爬取数据的效率低
- 环境部署繁琐
环境安装
- 下载安装selenium:pip install selenium 或者集成工具添加
- 下载浏览器驱动程序:http://chromedriver.storage.googleapis.com/index.html
- 查看驱动和浏览器版本的映射关系:
https://www.cnblogs.com/Summer-skr–blog/p/11715259.html
基本使用
下文只是爬虫简单的使用和xpath方法选择。如果看详细使用方法,请点击这里。
浏览器的创建
from selenium import webdriver
wd = webdriver.PhantomJS("驱动器地址")
wd = webdriver.Safari("驱动器地址")
wd = webdriver.Chrome("驱动器地址")
wd = webdriver.Firefox("驱动器地址")
wd = webdriver.Edge("驱动器地址")
wd.quit() # 关闭浏览器,连同驱动器关闭
wd.close() # 关闭当前页面
基本访问
wd.get(url) #url即为要访问的浏览器地址
选择元素方法
1. 选择元素是selenium的重中之重,告诉浏览器我们选择浏览器的特征
2. 查找元素
(1)id标签(最常用)
input = wd.find_element_by_id(""),返回对象是web_element对象
(2) class属性:
所有 class_name 是a的标签:
wd.find_elements_by_class_name(“a”),没有的话,会返回异常
在元素的内容可以用 text 找到
for element in elements:
print(element.text)
第一个 class_name 是a的标签:
wd.find_element_by_class_name(“a”), 没有的话,返回空列表
(3) 标签名:
wd.find_elements_by_tag_name("span")
WebElement:
选择的是元素的内部,即wb.find之后的返回值再次选择
操控元素的方法
需要提前通过查找元素找到input写入框、button按钮
在搜索框内输入
input.send_keys("liyang")
点击发送请求
button.click()
在输入的关键字后面加\n,表示回车输入查找
获取元素文本内容
element.text
获取元素属性
element.get_attribute("srcid")
这些属性是放在尖括号中间的内容
获取整个html文本
通过选择元素找到第一次所要找的元素框得到element
element.get_attribute("outerHTML")
获取元素内部的html文本
通过选择元素找到第一次所要找的元素框得到element
element.get_attribute("innerHTML")
获取在输入框中输入内容
找到文本框element
element.get_attribute("value")
用text不能获取到完整内容需要用到下面的方法:
element.get_attribute("innerText")
xpath选择元素
绝对路径:从根节点一层层写起,用 / 一层一层写下去
相对路径:不用从跟几点开始写,用 // 写第一个,可以在后面继续追加
方法:find_element(S)_by_xpath()
通配符:
//div/* div里面所有的节点
根据class属性选择:
[@属性值 = “”]
例如://*[@id= "white"]
//*[@id] 找到所有属性为 id 不管内容什么的内容
属性值一定 要写完整
泛式选择
选择style属性值包含color字符串的页面元素 //*[contains(@style,"color")]
选择style属性值 以color字符串开头 的页面元素 //*[starts_with(@style,"color")]
以----结尾 不是用ends_with
按次序选择
某类型的第几个元素://p[1] 表示p类型的第二个,不是第一个p类型的第二个
任意类型的第二个: //div/*[2]
某个类型的最后一个://p[last()]
倒数第二个: //p[last()-1]
范围选择:
选择option类型第1到2个子元素: //option[position()<=2]
class属性内容为“multi” 前面限制元素//...
选择倒数第一个和倒数第二个: //option[position()>=last()-1]
组选择
//option | //h4 选择所有的option和所有的h4
选择 父节点(必须xpath)
/.. 可以套娃一层层持续
选择 id 为china的父节点 //*[@id="china"]/..
选择所有 后续兄弟节点
/following-sibling::
选择class为single的元素 所有后续兄弟节点://*[@class="single"]/following-sibling::*
选择所有 前面兄弟节点
/preceding-sibling::