1、搭建环境
需要的环境
- 浏览器(Firefox/Chrome/IE…)-----选择Chrome
- Python
- Selenium
- Selenium IDE(如果用Firefox)
- FireBug、FirePath(如果用Firefox)
- chromedriver、IEDriverServer、phantomjs.exe
- IDE(Pycharm/Sublime/Eclipse…)
1.1、安装selenium
pip install selenium
1.2、下载chromedriverchromedriver
没有64位版本,32即可驱动[下载链接]
放置在python根目录,大版本要对应
2、控制浏览器
from selenium import webdriver browse =webdriver.Chrome()#实例化,打开浏览器 browse.maximize_window()#最大化浏览器 browse.implicitly_wait(8)#设置隐式时间等待 browse.get('https://www.baidu.com') browse.quit()
使用的是Selenium 的 WebDriver API ,主要涉及两个类
- WebDriver 类:主要靠直接实例化该类为对象,然后用其对象直接调用该类的方法和属性
- Chrome 是 WebDriver 的子类,是 WebDriver 类的一种
- WebElement 类:主要通过 WebDriver 类实例化的对象,通过对页面元素的查找,得到 WebElement 类的对象,然后调用该类的方法和属性
# 浏览器打开网址 driver.get("https://www.baidu.com") # 浏览器最大化 driver.maximize_window() # 设置浏览器的高度为800像素,宽度为480像素 driver.set_window_size(480, 800) # 浏览器后退 driver.back() # 浏览器前进 driver.forward() # 浏览器关闭 driver.close() # 浏览器退出 driver.quit()
3、webDriver工作原理
3.1一条Selenium脚本执行时后端都发生了哪些事情
- 对于每一条Selenium脚本,一个http请求会被创建并且发送给浏览器的驱动
- 浏览器驱动中包含了一个HTTP Server,用来接收这些http请求
- HTTP Server接收到请求后根据请求来具体操控对应的浏览器
- 浏览器执行具体的测试步骤
- 浏览器将步骤执行结果返回给HTTP Server
- HTTP Server又将结果返回给Selenium的脚本,如果是错误的http代码我们就会在控制台看到对应的报错信息
3.2为什么使用HTTP协议呢?
因为HTTP协议是一个浏览器和Web服务器之间通信的标准协议,而几乎每一种编程语言都提供了丰富的http libraries,这样就可以方便的处理客户端Client和服务器Server之间的请求request及响应response,WebDriver的结构中就是典型的C/S结构,WebDriver API相当于是客户端,而小小的浏览器驱动才是服务器端。
那为什么同一个浏览器驱动即可以处理Java语言的脚本,也可以处理Python语言的脚本呢?
这就要提到WebDriver基于的协议:JSON Wire protocol。
JSON Wire protocol是在http协议基础上,对http请求及响应的body部分的数据的进一步规范。
我们知道在HTTP请求及响应中常常包括以下几个部分:http请求方法、http请求及响应内容body、http响应状态码等。
常见的http请求方法:
GET:用来从服务器获取信息。比如获取网页的标题信息
POST:向服务器发送操作请求。比如findElement,Click等
http响应状态码:
在WebDriver中为了给用户以更明确的反馈信息,提供了更细化的http响应状态码,比如:
7: NoSuchElement
11:ElementNotVisible
200:Everything OK
现在到了最关键的http请求及响应的body部分了:
body部分主要传送具体的数据,在WebDriver中这些数据都是以JSON的形式存在并进行传送的,这就是JSON Wire protocol。
JSON是一种数据交换的格式,是对XML的升级与替代,下面是一个JSON文件的例子:
{
"firstname": "Alex",
"lastname": "Smith",
"moble": "13300000000"
}
下面的例子是WebDriver中在成功找到一个元素后JSON Wire Protocol的返回:
{"status" : 0, "value" : {"element" : "123422"}}
所以在Client和Server之间,只要是基于JSON Wire Protocol来传递数据,就与具体的脚本语言无关了,这样同一个浏览器的驱动就即可以处理Java语言的脚本,也可以处理Python语言的脚本了。