Selenium+python安装及测试
本文参考《Selenium2 python自动化测试》一书的第二章,主要解决安装及测试过程中存在的若干问题。
安装
1、首先,按照书中提供的安装步骤,依次安装python2.7、setuptools、pip,并设置好相关的环境变量。
a、python2.7可从官网下载msi安装包进行安装,安装完将C:\python27和C:\python27\Scripts添加进环境变量的path中。(此处默认安装在C盘根目录,如安装在其他目录请做相应修改)打开cmd,输入python,回车。若进入python环境(即出现符号<<<),则说明python安装成功。
b、从https://pypi.python.org/pypi/pip上下载pip,解压。打开cmd窗口,cd进入解压目录,输入python setup.py install,回车完成安装。
c、安装setuptools,cmd下输入python -m pip install -U setuptools,回车完成安装。
2、安装selenium
打开cmd,输入 pip install -U selenium,回车。自动完成selenium的下载和安装,安装完成后可在C:\python27\Lib\site-packages里找到selenium的源码包位置。
selenium简单测试
打开python的GUI界面IDLE(如安装了eclipse+pydev或其他python的IDE环境,可以在其上开发代码),输入以下代码,代码的具体解析见书中。
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("http://www.baidu.com")
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
browser.quit()
运行时若出现找不到firefox webdriver路径的错误,下载geckodriver.exe,放到C:\Python27目录下即可。若出现以下错误:
selenium.common.exceptions.WebDriverException: Message: Unsupported Marionette protocol version 2, required 3
升级到最新的Firefox版本即可。
将代码中的Firefox改成其他浏览器如IE、Chrome等,需要下载对应的浏览器驱动,并指定好路径。
IE需要下载IEDriverServer.exe,并关闭浏览器的安全设置,并在浏览器的工具->Internet选项->安全里将Internet、本地Internet、可信站点、受限站点下的启用保护模式前的勾去掉。
Chrome需要下载chromedriver.exe,测试无误。
关于python的webdriver API
webdriver原理:
1. WebDriver 启动目标浏览器,并绑定到指定端口。该启动的浏览器实例,做为web driver的remote server。
2. Client端通过CommandExcuter 发送HTTPRequest 给remote server的侦听端口(通信协议: the webriver wire protocol)
3. Remote server 需要依赖原生的浏览器组件(如:IEDriver.dll, chromedriver.exe),来转化转化浏览器的native调用。
webdriver api提供了web上的各种操作和分析。
1、对象(元素)定位
对象(元素)定位和操作是自动化测试的核心,其中操作又是建立在定位的基础上。webdriver 提供了一系列的定位手 段,包括
idnameclass nametag namelink textpartial link textxpathcss selector
对应的webdriver里的函数分别为
find_element_by_id()find_element_by_name()find_element_by_class_name()find_element_by_tag_name()find_element_by_link_text()find_element_by_partial_link_text()find_element_by_xpath()find_element_by_css_selector()
id和name是比较常用的定位方式。xpath定位可以借助Firefox浏览器的firebug和firepath插件,Chrome和IE自带开发者工具。
2、定位一组元素: 通过for循环实现
3、层级定位 : 通过父元素定位子孙元素
4、对象操作
clicksend_keysclear
关于WebElement
5、多层框架(frame)和窗口(window)的定位
元素在frame中时,定位不到。使用driver.switch_to_frame("frame_name")之后,再进行定位
对于window,同样可以采用driver.switch_to_window("window_name")
driver.implicitly_wait(30)可以替代time.sleep(30)
6、调用js方法
driver.execute_script('document.title')
作用:在当前窗口/框架同步执行JavaScript脚本
7、上传文件
定位上传按钮,通send_keys添加本地文件路径就可以了
示例代码:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
import os,time
driver = webdriver.Firefox()
driver.get("http://m.mail.10086.cn")
driver.implicitly_wait(30)
#登录
driver.find_element_by_id("ur").send_keys("手机号")
driver.find_element_by_id("pw").send_keys("密码")
driver.find_element_by_class_name("loading_btn").click()
time.sleep(3)
#进入139网盘模块
driver.find_element_by_xpath("/html/body/div[3]/a[9]/span[2]").click()
time.sleep(3)
#上传文件
driver.find_element_by_id("id_file").send_keys('D:\\selenium_use_case\upload_file.txt')
time.sleep(5)
driver.quit()
9、处理下拉框、switch_to_alert()、accept()
10、控制滚动条到底部
#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)
time.sleep(3)
11、键盘按键、键盘组合键、send_keys()输入中文运行报错问题
通过send_keys()调用按键:
send_keys(Keys.TAB) # TABsend_keys(Keys.ENTER) # 回车
键盘组合键:
#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
send_keys() 输入中文运行报错问题:
send_keys(u"输入中文"),
注:字符串前加上u表示字符串为Unicode编码,Unicode为2字节长度编码,汉字即采用这种编码方式。而每次代码第一行的# --coding: utf-8 --表示UTF-8的实现方式。UTF-8是使用最广的一种unicode的实现方式,是为传输而设计的编码,表示每次传输8位数据。
12、cookies处理
-
driver.get_cookies()获得cookie信息 -
add_cookie(cookie_dict)向cookie添加会话信息 -
delete_cookie(name)删除特定(部分)的cookie -
delete_all_cookies()删除所有cookie
13、鼠标事件
ActionChains类
-
context_click()右击 -
double_click()双击 -
drag_and_drop()拖动
需要注意的是,鼠标的操作不属于webelement的对象,而属于ActionChains 类。因此要测试鼠标的操作,需要在代码开始import进相关的包。如下:
from selenium.webdriver.common.action_chains import ActionChains
而后可以进行鼠标的测试,如以下代码:
#定位到要双击的元素
qqq =driver.find_element_by_xpath("xxx")
#对定位到的元素执行鼠标双击操作
ActionChains(driver).double_click(qqq).perform()
关于unittest
利用selenium IDE(集成在Firefox浏览器中),录制自动化测试脚本。学习基于unittest框架的自动化测试。
题外:
1、自动化测试中解决验证码问题
让开发注释掉验证码部分代码、给测试人员留后门(设置“万能验证码”)、cookies读取验证码
2、关于xpath可以参考
http://www.w3school.com.cn/xpath/xpath_syntax.asp