软件测试知识持续更新中
第二章 python webdriver 环境搭建第一节 环境搭建准备工具如下:windows 环境安装linux 环境安装
第二节 使用 IDLE 来编写 python有效地使用 IDLE
第三节 第一个自动化脚本代码解析:
第四节 安装浏览器驱动
第三章 python webdriver API第一节、浏览器的操作3.1.1、浏览器最大化3.1.2、设置浏览器宽、高3.1.3、控制浏览器前进、后退python 基础知识补充:
第二节 简单对象的定位3.2.1 id 和 name 定位3.2.2 tag name 和 class name 定位3.2.3 link text 与 partial link text 定位3.2.4 XPath 定位3.2.5 CSS 定位css 中的结构性定位
未完待续
第二章 python webdriver 环境搭建
有了上一节的基础后,下面我们就开始动手搭建自己的自动化测试环境。这也是我们实施自动化测试的准备工作,本书选用 python 语言,如果读者选用的其它语言,请参考其它资料进行环境的搭建。
第一节 环境搭建
准备工具如下:
下载 python【python 开发环境】 http://python.org/getit/ 下载 setuptools 【python 的基础包工具】 http://pypi.python.org/pypi/setuptools 下载 pip 【python 的安装包管理工具】 https://pypi.python.org/pypi/pip
要想使用 python 语言开发,首先需要 python 开发环境,需要说明的是 python 目前最新版本分:2.7.x 和3.3.x(简称 python 2 和 python 3);python 3 并非完全的向下兼容 python 2 ,语法上也有较大的 差异。python 3在性能上更加优秀,但由于 python 2多年的发展,大量的类库、框架是基于 python 2, 所以,目前两个版本都在维护更新。笔者推荐新手从 python 2开始学习 python,因为有丰富的资料、类 库和框架给我们学习和使用。当然,随着时间的推移,python 3 才是 python 发展的未来。
setuptools 是 python 的基础包工具,可以帮助我们轻松的下载,构建,安装,升级,卸载 python的软件包。 pip 是python软件包的安装和管理工具,有了这个工具,我们只需要一个命令就可以轻松的python 的任意类库。
windows 环境安装
第一步、安装 python 的开发环境包,选择需要安装路径进行安装,笔者下载的是目前最新的 python2.7.5版本,安装目录为:C:\Python27。
第 二 步 、 安 装 setuptools 通 过 前 面 提 供 的 setuptools 的 连 接 , 拖 动 页 面 到 底 部 找 到 , setuptools-1.3.2.tar.gz 文件(版本随着时间版本会有更新),对文件进行解压,找到 ez_install.py 文件,进入 windows 命令提示(开始–运行–cmd 命令,回车)下执行 ez_install.py: C:\setuptools-1.3>python ez_install.py
如果提示 python 不是内部或外部命令!别急,去添加一下 python 的环境变量吧!桌面“我的电脑” 右键菜单–>属性–>高级–>环境变量–>系统变量中的 Path 为:
变量名:PATH 变量值:;C:\Python27
第三步、安装 pip ,通过上面提供的链接下载 pip-1.4.1.tar.gz(版本随着时间版本会有更新),我默认解压在了 C:\pip-1.4.1 目录下,打开命令提示符(开始–运行–cmd 命令,回车)进入 C:\pip-1.4.1目录下输入: C:\pip-1.4.1 > python setup.py install
再切换到 C:\Python27\Scripts 目录下输入: C:\Python27\Scripts > easy_install pip
第四步、安装 selenium,如果是电脑处于联网状态的话,可以直接在 C:\Python27\Scripts 下输入 命令安装: C:\Python27\Scripts > pip install -U selenium 如果没联网,可以通过下载安装: selenium 下载地址: https://pypi.python.org/pypi/selenium 下载 selenium 2.33.0 (目前的最新版本),并解压把整个目录放到 C:\Python27\Lib\site-packages 目录下。
linux 环境安装
下面以 unbuntu 为例进行安装,其它版本的 linux 可能会有所差异,在绝大多数 linux 和 UNIX 系统安装中(包括 Mac OS X),Python 的解释器就已经存在了。我们需要做的就是打开终端,输入 python 命令进行验证,这里不再介绍 python 的安装。
第一步、安装:setuptools root@fnngj-H24X:~# apt-get install python-setuptools
第二步、安装 pip 下载 pip 安装文件,切换到文件目录,对其进行解压: root@fnngj-H24X:/home/user/python# tar -zxvf pip-1.4.1.tar.gz 切换到解压目录: root@fnngj-H24X:/home/user/python# cd pip-1.4.1/ 进行 pip 的安装 root@fnngj-H24X:/home/user/python/pip-1.4.1# python setup.py install
第三步、安装 selenium root@fnngj-H24X:/home/user/python/pip-1.4.1# pip install -U selenium
第二节 使用 IDLE 来编写 python
相信上面的配置过程已经让不少新手感到非常繁琐,万事开头难,我们有必要花一点时间在环境的配 置上,因为环境的搭建是后面实施自动化测试的前提。
如果笔者是第一次接触 python 语言且编程能力薄弱,那么笔者建议使用 python 自带的 IDLE 来编写 脚本。为了更好的通过 IDLE 帮助们编写 python+webdriver 脚本,我们需要先了解一下 IDLE。
IDLE 提供了一个功能完备的代码编辑器,允许你在这个编辑器中编写代码,另外还有一个 python shell(python 的交互模式),可以在其中试验运行代码。
第一次启动 IDLE 时,会显示“三个大于号”提示符(>>>),可以在这里输入代码。python shell 得 到你的代码语句后会立即执行,并在屏幕上显示生成的结果。如图
有效地使用 IDLE
IDLE 提供了大量的特性,不过只需了解其中一小部分就能很好地使用 IDLE。 TAB 完成: 先键入一些代码,然后按下 TAB 键。IDLE 会提供一些建议,帮助你完成这个语句。
回退代码语句: 按下 Alt+P,可回退到 IDLE 中之前输入的代码语句,或者按下 Alt+ N 可以移至下一个代码语句。 如图 2.x 按 Alt+P 回退到上一次编辑的代码。
第三节 第一个自动化脚本
有了上面的环境,你一定很迫切想要编写并运行一个自动化脚本,下面就来体验一下 python 与wegdriver 结合之后编写的脚本是多么简洁: 如果是 windows 用户,在开始菜单找到 python 目录,打开 IDLE(python GUI)程序,启动的是一个 交互模式。可以输入:from selenium import webdriver 上面的命令为导入 selenium 的相关包,如果回车后没有报错表示我们的 selenium 安装是成功的。
下面通选择菜单栏 File—>New Windows 或通过快捷键 Ctrl+N 打开新的窗口。输入以下代码:
# 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()
输入完成后命令为 baidu.py 保存,按 F5 快捷键运行脚本,将看到脚本启动 Firefox 浏览器进入百度页, 输入“selenium” 点击搜索按钮,最后关闭浏览器的过程。(这里默认读者已经安装了 Firefox 浏览器)
我们后面的脚本也将会在这个编辑器下完成,在你还没找到更好的编辑器之前。
代码解析:
#coding = utf-8 为了防止乱码问题,以及方便的在程序中添加中文注释,把编码统一成 UTF-8。
from selenium import webdriver 导入 selenium 的 webdriver 包,只有导入 webdriver 包我们才能使用 webdriver API 进行自动化脚本 的开发。 import 所引入包,更专业的叫法为:模组(modules)
browser = webdriver.Firefox() 需要将控制的 webdriver 的 Firefox 赋值给 browser;获得了浏览器对象才可以启动浏览器,打开网址,操作页面严肃,Firefox 是默认已经在 selenium webdriver 包里了,所以可以直接调用。当然也可以调用 Ie 或 Chrome ,不过要先安装相关的浏览器驱动才行。
browser.get(“http://www.baidu.com”) 获得浏览器对象后,通过 get()方法,可以向浏览器发送网址。
browser.find_element_by_id(“kw”).send_keys(“selenium”) 关于页面元素的定位后面将会详细的介绍,这里通过 id=kw 定位到百度的输入框,并通过键盘方法 send_keys()向输入框里输入 selenium 。多自然语言呀!
browser.find_element_by_id(“su”).click() 这一步通过 id=su 定位的搜索按钮,并向按钮发送单击事件( click() )。
browser.quit() 退出并关闭窗口的每一个相关的驱动程序。
第四节 安装浏览器驱动
WebDriver 支持 Firefox (FirefoxDriver)、IE (InternetExplorerDriver)、Opera (OperaDriver) 和Chrome (ChromeDriver) 。 对 Safari 的 支 持 由 于 技 术 限 制 在 本 版 本 中 未 包 含 , 但 是 可 以 使 用SeleneseCommandExecutor 模拟。它还支持 Android (AndroidDriver)和 iPhone (IPhoneDriver) 的移动 应用测试。它还包括一个基于 HtmlUnit 的无界面实现,称为 HtmlUnitDriver。
各个浏览器驱动下载地址: https://code.google.com/p/selenium/downloads/list
安装 chrome 浏览器驱动,下载 ChromeDriver_win32.zip(根据自己系统下载不同的版本驱动),解压 得到 chromedriver.exe 文件放到环境变量 Path 所设置的目录下,如果前面我们已经将(C:\Python27 ) 添加到了环境变量 Path 所设置的目录,可以将 chromedriver.exe 放到 C:\Python27\目录下。
安装 IE 浏览器驱动,下载 IEDriverServer_Win32_x.xx.zip,将解压得到 IEDriverServer.exe,同样 放置到 C:\Python27\目录下。
liunx 系统下,同样下载系统对应的浏览器驱动,并将驱动放置到环境变量 Path 所设置的目录下, 这里不再详细介绍。
安装完成后可以用 IE 和 chrome 来替换 firefox 运行上面的例子。 browser = webdriver.Firefox() 替换为: browser = webdriver.Ie() 或 browser = webdriver.Chrome()
如果程序能调用相应的浏览器运行,说明我们的浏览器驱动安装成功。
OperaDriver 是 WebDriver 厂商 Opera Software 和志愿者开发了对于 Opera 的 WebDriver 实现。安装 方式与 IE、chrome 有所不同;请参考其它文档进行安装。
第三章 python webdriver API
这一章将详细的讲解基于 python 的 webdriver API,笔者更愿意读者自已去查询 webdriver API 中各种操作方法的使用,为了保持本书由浅入深的完整性,本章将用相当有篇幅介绍基于 python 语言的webdriver 对种操作的使用。通过本章的学习,我们掌握 web 页面上各种元素、弹窗的定位与操作,以及浏览器 cookie 的操作,JavaScript 的调用等问题。
第一节、浏览器的操作
3.1.1、浏览器最大化
在统一的浏览器大小下运行用例,可以比较容易的跟一些基于图像比对的工具进行结合,提升测试的 灵活性及普遍适用性。比如可以跟 sikuli 结合,使用 sikuli 操作 flash。
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
print "浏览器最大化"
driver.maximize_window() #将浏览器最大化显示
driver.quit()
3.1.2、设置浏览器宽、高
在不同的浏览器大小下访问测试站点,对测试页面截图并保存,然后观察或使用图像比对工具对被测页面的前端样式进行评测。比如可以将浏览器设置成移动端大小(320x480),然后访问移动站点,对其样式进行评估;
#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://m.mail.10086.cn")
#参数数字为像素点
print "设置浏览器宽480、高800显示"
driver.set_window_size(480, 800)
driver.quit()
3.1.3、控制浏览器前进、后退
浏览器上有一个后退、前进按钮,对于浏览网页的人是比较方便的;对于 web 自动化测试来说是一个比较难模拟的操作;webdriver 提供了 back()和 forward()方法,使实现这个操作变得非常简单。
#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
#访问百度首页
first_url= 'http://www.baidu.com'
print "now access %s" %(first_url)
driver.get(first_url)
#访问新闻页面
second_url='http://news.baidu.com'
print "now access %s" %(second_url)
driver.get(second_url)
#返回(后退)到百度首页
print "back to %s "%(first_url)
driver.back()
#前进到新闻页
print "forward to %s"%(second_url)
driver.forward()
driver.quit()
为了使脚本的执行过程看得更清晰,在每一步操作上都加了 print 来打印当前的 URL 地址。 运行结果如下:
>>> ================================ RESTART ================================
>>>
now access http://www.baidu.com
now access http://news.baidu.com
back to http://www.baidu.com
forward to http://news.baidu.com
实际测试中,这两个功能平时很少被使用,笔者所能想到的场景就是几个页面来回跳转,但又不想用 get url 的情况下。
python 基础知识补充:
下面打开 python shell 做以下练习:
>>> name = 'huhu'
博客园---虫师
http://fnng.cnblogs.com 34
>>> age = 26
>>> print "my name is %s" %name
my name is huhu
>>> print "my age is %d" %age
my age is 26
>>> print "my name is %d" %name
Traceback (most recent call last):
File "
print "my name is %d" %name
TypeError: %d format: a number is required, not str
>>> print "my name is %s ,age is %d" %(name,age)
my name is huhu ,age is 26
在 python 2 中使用 print 语句进行打印输出,如果是字符信息的话需要对打印的信息加单引号(‘’)或双引号(“”),它们本质上没有任何区别,不过使用引号时必须要成对出现。
上面的例子中我们定义一个字符串变量 name 和一个数据变量 age,要想在 print 打印字符串中引用这 两个变量就要用到“格式化字符串”的东西,在 print 打印字符串中指定变量类型,“%s”表示输出的类型为字符串,“%d”表示输出类型为整型数字。
name 为字符串类型,我们用%d 来指定输出类型就会报错。如果我们不确定变量类型的话可以使用%r,它的含义是“不管什么都打印出来”。
第二节 简单对象的定位
对象(元素)的定位和操作是自动化测试的核心部分,其中操作又是建立在定位的基础上的,因此元 素定位就显得非常重要。(本书中用到的对象与元素同为一个事物)
一个对象就像是一个人,他会有各种的特征(属性),如比我们可以通过一个人的身份证号、姓名或 者他的住址找到这个人。那么一个元素也有类似的属性,我们可以通过这种唯一区别于其它元素的属性来定位这个元素。当然,除了要操作元素时需要定位元素外,有时候我们只是为了获得元素的属性(class 属性,name 属性)、text 或数量也需要定位元素。
webdriver 提供了一系列的元素定位方法,常用的有以下几种
idnameclass nametag namelink textpartial link textxpathcss selector 分别对应 python 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()
3.2.1 id 和 name 定位
id 和 name 是我们最常用的定位方式,因为大多数元素都有这两个属性,而且在对控件的 id 和 name 命名时一般使其有意义也会取不同的名字。通过这两个属性使我们找一个页面上的属性变得相当容易。
通过元素中所带的 id 和 name 属性对元素进行定位: id=”gs_htif0” find_element_by_id(“gs_htif0”) name=”btnK” find_element_by_name(“btnK”) name=”btnI” find_element_by_name(“btnI”)
3.2.2 tag name 和 class name 定位
不是所有的前端开发人员都喜欢为每一个元素添加 id 和 name 两个属性,但除此之外你一定发现了一 个元素不单单只有 id 和 name,它还有 class 属性;而且每个元素都会有标签。