selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。
Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
这里要说一下比较重要的PhantomJS,PhantomJS是一个而基于WebKit的服务端JavaScript API,支持Web而不需要浏览器支持,其快速、原生支持各种Web标准:Dom处理,CSS选择器,JSON等等。PhantomJS可以用用于页面自动化、网络监测、网页截屏,以及无界面测试
搭建python环境
以下实验都是在python2.7环境下运行的
在python安装目录的Scripts下(比如我的是:D:\devtools\Python37\Scripts)运行命令行,并输入以下命令安装:
pip install -U selenium
搭建java环境
下载selenium的服务端(下载地址:http://selenium-release.storage.googleapis.com/2.53/selenium-server-standalone-2.53.0.jar)
解压,然后在selenium-server-standalone-2.53.0.jar的目录下使用命令java -jar selenium-server-standalone-2.53.0.jar 启动。
在本文中还用不到服务端,所以可以暂时不启动。
chrome driver下载地址:http://chromedriver.storage.googleapis.com/index.html?path=2.7/
解压后,将chromedriver.exe文件放在chrome的安装目录下的Application文件夹下(比如我的是:C:\Program Files (x86)\Google\Chrome\Application)
然后设置path环境变量,把chrome的安装目录(比如我的是:C:\Program Files (x86)\Google\Chrome\Application)添加到path中。
然后使用下列程序来测试一下:
# coding=utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print driver.title
driver.quit()
可能出现的错误:
1. chromedriver.exe文件被杀毒软件删掉,程序运行后报错:找不到路径。
解决方法:在杀毒软件中为chromedriver.exe添加信任
2. 提示Chrome version的问题,版本过旧
解决方法:给Chome升级,右上角的三点->帮助->关于Google Chrome->版本更新
二、使用程序自动在百度中输入搜索词进行搜索
# coding=utf-8
from selenium import webdriver
import time
# 打开chrome浏览器
driver = webdriver.Chrome()
# 输入网址,打开www.baidu.com
driver.get('http://www.baidu.com')
# 找到id=kw的输入框,输入selenium
driver.find_element_by_id("kw").send_keys("selenium")
# 找到id=su的按钮,进行点击
driver.find_element_by_id("su").click()
# 睡眠5秒
time.sleep(5)
# 关闭浏览器
driver.quit()
三、使用程序自动登录新浪微博
# coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time,os
# 打开chrome浏览器
driver = webdriver.Chrome()
# 输入网址,打开www.baidu.com
driver.get('http://weibo.com')
driver.maximize_window()
driver.implicitly_wait(20)
# 有的输入框可能有默认的一些提示值,先将框中的值删掉
# driver.find_element_by_id("loginname").clear()
# 找到id=loginname的输入框,输入用户名
driver.find_element_by_name("username").send_keys("18606146174")
# Keys.TAB相当于模拟处于账号框时使用TAB键然后移动到下面的密码框
driver.find_element_by_name("username").send_keys(Keys.TAB)
time.sleep(2)
# 输入密码
driver.find_element_by_name("password").send_keys("a123456")
# 定位到密码框,然后敲回车(enter)
driver.find_element_by_name("password").send_keys(Keys.ENTER)
# 睡眠5秒
time.sleep(5)
# 关闭浏览器
driver.quit()
在不添加
driver.maximize_window()
driver.implicitly_wait(20)
这两行代码时,会出现下面这个错误
可能是由于页面没有加载完整造成的,通过放大浏览器,使用智能等待,然后再去找相应id或name的元素。
四、其他的用法
(1)webdriver提供了一些列的对象定位方法,常用的有:id,name,class name,link text, partial link text,tag name, xpath, css selector
拿百度的输入框作为例子:
# coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time,os
# 打开chrome浏览器
driver = webdriver.Chrome()
# 输入网址,打开www.baidu.com
driver.get('http://www.baidu.com')
# 通过id方式定位
driver.find_element_by_id("kw").send_keys("selenium")
# 通过name方式定位
driver.find_element_by_name("wd").send_keys("selenium")
# 通过tag name方式定位
driver.find_element_by_tag_name("input").send_keys("selenium")
# 通过class name方式定位
driver.find_element_by_class_name("s_ipt").send_keys("selenium")
# 通过css方式定位
driver.find_element_by_css_selector("#kw").send_keys("selenium")
# 通过xpath方式定位
driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(3)
# 关闭浏览器
driver.quit()
2)智能等待
通过添加implicitly_wait()方法就可以方便的实现智能等待;
implicitly_wait(30)的用法应该比time.sleep()更智能,后者智能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
import time
driver.implicitly_wait(30)
(3)打印title
print driver.title # 把页面titile打印出来
(4)浏览器最大化
driver.maximize_window() #将浏览器最大化显示
(5)设置浏览器宽、高
driver.set_window_size(480,800) #设置浏览器宽480、高800显示
(6)操作测试对象
一般webdriver中比较常用的操作对象的方法有下面几个
click 点击对象
send_keys 在对象上模拟按键输入
clear 清除对象的内容,如果可以的话
submit 提交表单
(7)鼠标事件
ActionChains类
context_click() 右击
double_click() 双击
drag_and_drop() 拖动