本文参考《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 提供了一系列的定位手 段,包括
id
name
class name
tag name
link text
partial link text
xpath
css 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、对象操作
click
send_keys
clear
关于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) # TAB
send_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
网友评论