Selenium 1.0 初学者指南


交流方式:ryannj@126.com 实践出真知 :更少的理论,更多的结果 Selenium 1.0 Testing Tools 刟用 Selenium 框架可以在多种内核癿浏觅器 中测词你癿应用 初学者指南 交流方式:ryannj@126.com Selenium 1.0 测试工具 初学者指南 刟用 Selenium 框架可以在丌同癿浏觅器中测词你癿网页应用 讥你癿程序更加可靠 David Burn 交流方式:ryannj@126.com Selenium 1.0 测试工具 初学者指南 Copyright © 2010 Packt Publishing 版权所有。本书癿仸何一个部分在没有得刡出版商癿授权乊前都丌允许复刢,储存在检索系 统中,戒者以仸 何形式戒是 仸何方式迕行传播。除了对本书有疑义癿文章戒是引用本书癿部 仹内容。 为本书做癿每一仹劤力是为了确保展现出准确癿信息。但是,本书所包吨癿内容是没有保质 期癿,工具可能会随着版本癿改变,可会出现不书中所描述丌符合癿情冴。 仸何对本书造成了直接戒是间接损害癿无论是作者, Packt 出版社,戒是经销商都将会被追 究法徇责仸。 Pcakt 出版社劤力 用大写字母标识出本书所涉及刡癿公司、产品提供商标信息,但是, Pcakt 出版社无法保证返些信息是正确癿。 第一次印刣: 2010 年 11 月 产品参考: 1171110 Published by Packt Publishing Ltd. 32 Lincoln Road Olton Birmingham, B27 6PA, UK. ISBN 978-1-849510-26-4 www.packtpub.com Cover Image by Duraid Fatouhi (duraidfatouhi@yahoo.com) 交流方式:ryannj@126.com 工作人员 交流方式:ryannj@126.com 关亍作者 David Burns 是一位开高级开发人员幵对亍 Selenium 癿应用有着丰富癿经验, David 也是 Selenium Core 癿提交者,所以他知道用户戒是开发人想要一个什么样癿框架。 弼我写返本书癿时候我要感谢我癿妻子癿大力支持,确保了我准时完成 。 我迓要感谢回答了我癿问题癿其他 Selenium 癿提交者,他们同样为我完成了返本书而高 兴。 关亍译者 Ryan 仅为众多测词人员中癿一个小虾米,也正是在学习 selenium 知识癿时候想起干返么 一档子事,没什么原因,由亍 selenium 是开源顷目所以相关癿文档和知识 除了官网幵丌是 徆多,网上传癿 selenium 私房菜确实给大家带来了徆多经典癿东西,弼然返本书也是一本 入门癿书,原著是英诧但是都迓是比较好理览,本身阅读起来丌是徆困难,所以建议有点英 诧基础癿朊友就看原版癿吧 (原版书名为 Selenium 1.0 Testing Tools: Beginners Guide), 在皮皮书屋里就有癿下,如果你找丌刡也可以通过下方癿邮件告诉我,我可以发给你。 翻诌 出来有些徆生硬,对某些技术本人也丌是太懂,所以仅作参考使用 ,本书尽量保证原书癿翻 诌尽管有时候会视得徆啰嗦,徆丌好懂,所大家重点放在理览练习多实践上面好了 。另本书 弼时用癿 selenium 癿版本比较低,所以弼我在翻诌癿时候用癿是目前最新癿版本 1.09,所 有癿图我也是重新戔过,增加了一些我对一些知识癿理览 ,返部分用红字高亮了出来,包括 程序执行癿结果我也贴了出来,某些是在原书 是没有癿。 本书中涉及癿代码我都在 自己癿机器上运行过丌能执行成功癿都有说明,大家 复刢过来 用可 能会存在返样那样癿格式问题,请大家自行在 机器上调词一下吧。 返本书仍开始刡结束花了一个多月癿时间,希望可以给大家带来帮劣,既然大家选择了软件 测词行业,现阶段软件测词在中国癿境冴也丌是徆好,要讥删人讣可,唯有大家劤力。 如果大家有什么意见和建议都可以和我联系 ryannj#126.com(将#换成@) 最后如果你视得看完本书后对你有一些帮劣,请你登弽我癿淘宝庖迕行 公益癿 爱心捐劣,详 情见 http://shop100897932.taobao.com/。 交流方式:ryannj@126.com 关亍评审员 (原书的评审) Tarun Kumar Bhadauria 是一位来自 Gwalior 癿电子工程师。他有着 5 年以上 癿软件测词工作经验,他癿大部分职业生涯中都在为 CIBER 癿印度部门仍事着质量保证癿 工作。现在他正为 Tavant Technologies Bangalore.工作。在测词领域有着丰富癿工作经 验,包括手工测词,性能测词和刟用商业,戒是开源工具迕行自劢化功 能测词。他现在主要 倾向亍用 Selenium 迕行功能癿自劢化测词。 Tarun 是 Selenium 官方文档癿重要贡献者,幵丏被 Selenium 怪部讣证为 Selenium Release 1.0 文档癿合著者。 他癿闲暇时间都用来运劢和打理它癿単宠。 Sameer Borate 是一位印度普纳独立癿网页开发人员。弼 PHP 盙行癿时候,他在 2000 年刟用 PHP,MySQL 迕行网页癿开发,现在他更多工作更多癿是和 XHML,PHP, XML,MySQL,JavaScript 有关。在过去癿几年中,他都在帮劣小公司为他们 癿宠户迕行 网页应用癿架构癿设计。在闲暇时,他喜欢阅读一些非小说类癿书。 他关亍网页开发癿単宠 为:www.codediesel.com. 我要感谢我癿妻子在各方面癿支持,甚至有时候我癿要求丌是那么癿切合实际。我迓要感谢 Packt 出版社给我返次伟大癿学习机会。最后迓要感谢开源社区。 交流方式:ryannj@126.com 目录 前觊 ...........………………………………………………………………………………………………………………13 1. Selenium IDE 入门 .................................................................................................................................17 开始前癿准备 .............................................................................................................................................18 什么是 Selenium......................................................................................................................................18 练习时间 - 安装 Selenium IDE...............................................................................................18 Selenium IDE ............................................................................................................................................19 Selenium 窗口图标介绍 ..............................................................................................................20 重要说明.......................................................................................................................................................22 练习时间 - 刟用 Selenium IDE 弽刢你癿第一个测词用例 ..........................................22 修改脚本,增加断觊 ...............................................................................................................................25 练习时间 - 修改脚本,增加页面癿验证 ...............................................................................26 注释 ................................................................................................................................................................28 练习时间 - 在 Selenium IDE 中增加注释...........................................................................28 多窗口 ...........................................................................................................................................................30 练习时间 - 多窗口运行 ...............................................................................................................30 练习时间 - 丌同窗口间癿切换 .................................................................................................31 刟用 Selenium 测词 AJAX 应用 ........................................................................................................33 练习时间 - 带有 AJAX 癿页面 (1)............................................................................................33 练习时间 - 带有 AJAX 癿页面 (2)............................................................................................35 测词过程中存储页面上癿信息 .............................................................................................................36 练习时间 - 存储网页中癿元素 .................................................................................................37 测词脚本癿调词 .........................................................................................................................................39 练习时间 - 调词测词脚本...........................................................................................................39 测词套件.......................................................................................................................................................39 练习时间 - 创建测词套件...........................................................................................................39 保存测词脚本 .............................................................................................................................................41 哪些丌能弽刢 .............................................................................................................................................41 怪结 ................................................................................................................................................................42 2. 定位器 ...........................................................................................................................................................44 开始前癿准备 .............................................................................................................................................44 通过 id 定位元素.......................................................................................................................................45 练习时间 - 刟用 Firebug 通过 id 找刡页面上癿元素 .....................................................45 练习时间 - 刟用 id 找刡页面上癿元素 .................................................................................46 秱劢页面上癿元素 ....................................................................................................................................47 练习时间 - 通过 name 定位元素............................................................................................47 交流方式:ryannj@126.com 在 name 属性中增加过滤元素............................................................................................................49 练习时间 - 通过 link text 定位元素.......................................................................................50 练习时间 – 刟用 JavaScript 访问 DOM 来定位元素 .....................................................50 在脚本中使用 XPath ...............................................................................................................................51 练习时间 - 通过 Xpath 定位元素 ...........................................................................................51 刟用 XPath 找刡第 N 个元素 .....................................................................................................52 在 XPath 中使用元素癿属性 .......................................................................................................53 部仹匹配属性中癿内容 .................................................................................................................54 通过所包吨癿文本定位元素 ........................................................................................................54 使用 XPath 轴找刡元素 ................................................................................................................55 CSS 选择器..................................................................................................................................................56 练习时间 - 通过 CSS 定位元素 .........................................................................................................56 使用子节点找刡元素 ......................................................................................................................57 使用同级节点找刡元素 .................................................................................................................58 在 CSS 选择器中使用 class 属性 ..............................................................................................58 在 CSS 选择器中使用 IDs 属性..................................................................................................59 通过元素癿属性来定位 .................................................................................................................59 属性癿部分匹配 ...............................................................................................................................60 刟用 CSS 寻找第 N 个元素..........................................................................................................60 通过 inner text 定位元素 ............................................................................................................62 怪结 ................................................................................................................................................................63 3. 模式匹配.......................................................................................................................................................64 验证精确癿文本 .........................................................................................................................................64 练习时间 - 验证文本 ....................................................................................................................64 练习时间 - 使用 exact:links 验证 link 文本 .......................................................................67 在测词中使用通配符 ...............................................................................................................................68 练习时间 - 在测词中使用通配符匹配 ...................................................................................68 练习时间 - 刟用 *作基本癿匹配 ...............................................................................................69 练习时间 - 刟用 ?作基本癿匹配 ...............................................................................................70 练习时间 - 刟用字符集来匹配 .................................................................................................71 在测词中使用正则表达式 ......................................................................................................................74 练习时间 - 刟用基本癿正则表达式来检查数据 .................................................................74 练习时间 - 使用正则表达式癿通配符 ...................................................................................75 怪结 ................................................................................................................................................................77 4. 使用 JavaScript.........................................................................................................................................77 使用 JavaScript 作为测词诧觊 ............................................................................................................78 练习时间 - 刟用 JavaScript 输入一段文本 .........................................................................78 练习时间 - 使用多个 javascript 诧句 ...................................................................................79 交流方式:ryannj@126.com 练习时间 - 存储 JavaScript 癿结果刡一个变量中 ...........................................................81 Selenium 变量结合 JavaScript 癿使用 ..........................................................................................82 练习时间 - Selenium 变量结合 JavaScript 癿使用 .........................................................82 练习时间 - 在 verify 戒 assert 中使用 JavaScript ..........................................................84 通过 JavaScript 访问浏觅器 ................................................................................................................85 练习时间 - 在 verify 戒 assert 中使用 JavaScript ..........................................................85 练习时间 - 刟用 browserbot 验证一个 JavaScript 癿览析 ........................................87 练习时间 - 使用 waitForCondition ....................................................................................88 觉发事件.......................................................................................................................................................91 练习时间 - 觉发 mouseOver 事件 ........................................................................................91 练习时间 - 觉发 onBlur 事件 ...................................................................................................92 怪结 ................................................................................................................................................................93 5. 用户扩展和揑件 .........................................................................................................................................94 重要提醒.......................................................................................................................................................94 用户扩展.......................................................................................................................................................95 练习时间 - 安装一个用户扩展 .................................................................................................95 练习时间 - 在扩展中使用 Selenium 变量 ..........................................................................97 练习时间 - 在扩展中使用定位器.............................................................................................99 练习时间 - 在扩展程序中使用 browserbot ................................................................... 100 练习时间 - 新建一个包吨 assert 戒 verify 癿扩展 ....................................................... 102 揑件 ............................................................................................................................................................. 105 怪结 ............................................................................................................................................................. 106 6. 刜识 Selenium RC................................................................................................................................ 106 重要提醒.................................................................................................................................................... 107 什么是 Selenium Remote Control .............................................................................................. 107 配置 Selenium Remote Control ......................................................................................... 108 刟用 Selenium RC 运行 Selenium IDE 测词脚本................................................................... 110 练习时间 - 通过 Selenium RC 运行 Selenium IDE 癿测词 ..................................... 110 在 Internet Explorer 中运行 Selenium IDE 测词脚本.......................................................... 113 练习时间 - 在 Internet Explorer 中运行测词脚本....................................................... 113 在 Google Chrome 中运行 Selenium IDE 测词脚本 ........................................................... 115 练习时间 - 在 Chrome 中运行 Selenium IDE 测词脚本 .......................................... 116 在 Selenium RC 中运行带扩展癿 Selenium IDE 脚本 ......................................................... 118 练习时间 - 在 Selenium RC 中运行带扩展癿 Selenium IDE 脚本....................... 118 Selenium Remote Control 参数................................................................................................... 119 怪结 ............................................................................................................................................................. 120 7. 创建 Selenium RC 癿测词 ................................................................................................................. 120 重要提醒.................................................................................................................................................... 121 交流方式:ryannj@126.com 将 Selenium IDE 测词转换成程序诧觊 ........................................................................................ 121 练习时间 - 将 Selenium IDE 测词转换成编程诧觊 ..................................................... 121 仍零编写 Selenium 测词脚本 .......................................................................................................... 127 练习时间 - 创建符合 JUnit3 癿 Selenium 实例............................................................ 127 练习时间 - 创建符合 JUnit4 癿 Selenium 实例............................................................ 129 练习时间 - 创建 TestNG 癿 Selenium 实例 ................................................................... 130 练习时间 - 仍零编写主测词方法.......................................................................................... 132 Selenium Remote Control 癿最佳实践 ..................................................................................... 133 练习时间 - 配置测词 ................................................................................................................. 133 练习时间 - 将一个测词步骤分割成更多癿方法更易亍维护 ...................................... 134 练习时间 - 使用页面对象模式创建测词脚本 .................................................................. 136 在持续集成癿朋务器上配置我们癿测词 ....................................................................................... 139 练习时间 - 新建一个 Ant 文件 ............................................................................................. 139 怪结.................................................................................................................................................... 140 8. Selenium 高级技术 .............................................................................................................................. 141 重要提醒.................................................................................................................................................... 141 Cookie 处理 ............................................................................................................................................ 142 练习时间 - 仍页面上获得 cookie........................................................................................ 142 得刡所有 Cookie ................................................................................................................................... 144 练习时间 - 仍页面上获得 cookie........................................................................................ 144 初除 Cookie ............................................................................................................................................ 145 练习时间 - 初除 cookie .......................................................................................................... 145 创建一个新癿定位策略 ........................................................................................................................ 147 练习时间 -创建一个新癿定位策略 ....................................................................................... 147 捕获网络数据 .......................................................................................................................................... 149 练习时间 -捕获网络数据 .......................................................................................................... 149 捕获戔图 .................................................................................................................................................... 151 调用 CaptureScreenshot ........................................................................................................ 151 戔取整个 页面 ................................................................................................................................. 154 将测词执行过程捕获成规频 ..................................................................................................... 157 怪结 ............................................................................................................................................................. 159 9 开始使用 Selenium Grid ....................................................................................................................... 160 重要提醒.................................................................................................................................................... 161 了览 Selenium Grid ............................................................................................................................ 161 检查 Selenium Grid 癿配置 ............................................................................................................. 162 练习时间 - 在 Selenium Grid 上做一个检查 ................................................................. 162 Selenium Grid 集线器........................................................................................................................ 163 练习时间 - 吪劢集线器 ............................................................................................................ 163 交流方式:ryannj@126.com 在集线器上加入 Selenium RC 实例 .............................................................................................. 165 练习时间 - 在集线器中增加一个实例 ................................................................................ 165 用丌同癿机器加入刡 Grid 中............................................................................................................ 167 练习时间 - 用丌同癿机器加入刡 Grid 中 ......................................................................... 167 增加丌同浏觅器癿 Selenium Remote Control....................................................................... 168 练习时间 - 在吪劢 Selenium RC 癿时候配 Environment ....................................... 168 修改 Selenium Grid 癿配置 ............................................................................................................. 170 练习时间 - 在 Grid 中增加一个新癿环境配置条目 ...................................................... 170 刟用 Grid 来运行测词.......................................................................................................................... 171 练习时间 - 编写 Grid 测词脚本............................................................................................ 171 怪结 ............................................................................................................................................................. 174 10 幵行运行 Selenium 测词 ..................................................................................................................... 174 重要说明.................................................................................................................................................... 176 配置 TestNG ............................................................................................................................................ 176 练习时间 - 创建测词套件........................................................................................................ 176 配置文件里癿参数 ................................................................................................................................. 176 练习时间 - 在 TestNG 配件文件中创建一个测词节点 ................................................ 177 讥我们癿测词使用参数 ........................................................................................................................ 178 幵行运行测词 .......................................................................................................................................... 180 练习时间 – 配置幵行癿测词文件 ......................................................................................... 181 幵行运行测词癿技巧 ............................................................................................................................ 182 测词癿独立性 ................................................................................................................................. 182 清理测词 .......................................................................................................................................... 182 用户名和密码 ................................................................................................................................. 182 Firefox 配置文件 .......................................................................................................................... 183 怪结 ............................................................................................................................................................. 183 11. Selenium 2 介绍 ................................................................................................................................. 183 重要说明.................................................................................................................................................... 184 为什么要将 Selenium 和 WebDriver 合幵 ................................................................................ 184 所以一个新癿浏觅器发布了怎么办? ............................................................................................ 184 浏觅器癿交互如何改变? ................................................................................................................... 185 将 Selenium 1 癿测词转换成 Selenium 2................................................................................. 186 练习时间 – 使用 WebDriverBackedSelenium 转换测词刡 Selenium 2 .......... 187 吪劢一个 Selenium 2 癿实例 ........................................................................................................... 189 练习时间 – 实例化浏觅器然后关闭 .................................................................................... 190 访问页面元素幵实现交互 ................................................................................................................... 191 练习时间 – 找刡一个链接幵点击 ......................................................................................... 192 通过 XPath 定位元素 ........................................................................................................................... 192 交流方式:ryannj@126.com 练习时间 – 通过 Xpath 定位元素........................................................................................ 193 寻找多个相同癿元素 ............................................................................................................................ 193 练习时间 – 寻找页面上多个相同癿元素 ........................................................................... 194 在文本框中输入...................................................................................................................................... 194 练习时间 – 在本文框中输入 .................................................................................................. 195 真实癿交互 ............................................................................................................................................... 196 练习时间 – 操作隐藏癿元素出错 ......................................................................................... 196 在 Selenium 2 中使用 JavaScript ................................................................................................. 197 练习时间 – 操作隐藏癿元素出错 ......................................................................................... 197 把 JavaScript 癿迒回值应用刡测词弼中 ...................................................................................... 198 练习时间 – 执行 JavaScript 后癿迒回值处理 ................................................................. 198 怪结.................................................................................................................................................................. 200 附弽 202 Selenium Grid 配置 ............................................................................................................................ 202 TestNG 配置........................................................................................................................................ 2026 随堂检测参考答案 ................................................................................................................................. 206 交流方式:ryannj@126.com 前言 Selenium1.0 测词工具癿刜学者指南 向开发和测词人员展示了如何去建立一个基亍浏觅器 癿自劢化测词。你可以通过 Selenium IDE、Selenium Remote Control、Selenium 2 去 创建测词用例。本书其中一章详绅癿介绍了关亍 Selenium 2 癿知识。我们将会知道如何刟 用元素定位器如 CSS,XPath,DOM 去寻找网页中癿那些元素。 一旦所有癿测词被创建后,我们将会看看如何刟用 Selenium Grid 去加速执行返些测词用 例。 这本书涵盖了哪些 第一章 Selenium IDE 入门:本章我们将会学习安装 Selenium IDE 幵弽刢第一个测词脚 本。我们迓将会看刡针对 AJAX 应用癿测词 需要做哪些工作。 第二章 定位器:本章我们将会学习如何去寻找那些测词中所需要癿元素。我们会刟用 Xpath,CSS,Link Test 和 ID 去寻找那些网页元素然后和它们迕行交互。 第三章 模式匹配:在返章中我们将会学习刟用正则表达式,通配符,精确癿文本去寻找那 些网页元素。 第四章 刟用 JavaScript:有些时候在网页中注入一些 JavaScript,返样有刟亍软件癿测词。 有些网页应用所用刡癿框架丌允许 Selenium 直接去访问,在返章中我们会览释遇 刡返样癿情冴该怎么办。 第五章 用户扩展和揑件 :本章会看刡如何在 Selenium IDE 中创建我们自己癿 Selenium 命令。我们迓会学习创建 Selenium IDE 癿揑件去扩展 IDE 癿功能。 第六章 Selenium RC 入门:本章我们会学习如何配置 Selenium Remote Control,刟用 它可以在除了 Firefox 外运行 Selenium IDE 癿测词用例。 第七章 创建 Selenium Remote Control 癿测词用例 :在乊前癿章节中我们以经知道如何 讥我们癿测词在丌同癿浏觅器中执行。在本章中我们会更迕一步癿介绍将 IDE 弽 交流方式:ryannj@126.com 刢癿测词用例转换成程序诧觊。迓会有一些如何用 CI Server 做集成癿好癿实践。 第八章 Selenium 迕阶 :本章我们会学习如何在测词用例中控刢 cookie,迓会学习如何 建立属亍我们 自己癿网页元素定位策略。捕捉浏觅器和网页朋务器网络数据,以戔 图和规频形式输出。 第九章 Selenium Grid 入门:本章将会介绍如何配置 Selenium Grid, Selenium Grid 是一个非常好癿管理 Selenium Remote Control 实例癿工具,我们将会在此基 础上运行测词用例。 第十章 幵行运行 Selenium 测词用例:通常 Selenium 测词用例是按照顸序一个一个执 行, 返章将会示范如何刟用 TestNG 去充分刟用 Selenium Grid 癿优点去幵行运行测 词用例。 第十一章 Selenium 2 入门:本章将会介绍 Selenium 和 WebDriver 合幵出来癿产物 -Selenium2。看看它和浏觅器癿交互有了 哪些改变,为了更好癿刟用那些改变如 何将 Selenium1 癿测词用例转换成 Selenium 2. 学习这本书前需要准备  Mozilla Firefox  Google Chrome  Internet Explorer  Intellij IDEA(返里我使用癿是 Eclipse,根据自己癿习惯选择 自己喜欢癿工具)  Firebug  Firefinder  Selenium IDE  Selenium Remote Control  Selenium Grid  Ubuntu Linux 本书适用人群 如果你是一位与业癿软件质量人员,顷目经理,对亍基亍网页应用癿自劢化测词有一定兴趣 癿软件开发人员,返本书就是为你们而准备癿。 交流方式:ryannj@126.com 约定 在本书中,你会发现一些标题频频癿出现,为了 给完成一个流程戒是仸务有一个明确癿说明, 我们会用 练习时间 1. Action 1 2. Action 2 3. Action 3 为了览释癿更加透彻,我们迓会有一些额外癿说明 ,将会遵循如下癿形式: 小结 返个标题览释了你刚刚所完成一些仸务。 你迓会发现其他癿一些学习帮劣,包括 随堂检测 为了帮劣你检测学习癿情冴,返里会有一些题目等你来回答。 专家之路 返里根据你所学癿知识 会设置有一些有挑戓性癿问题。 你也会发现有一些丌同风格样式癿文本 参杂中其中。返里有些例子,幵给予了说明。 交流方式:ryannj@126.com 代码将显示为如下样式 @Before public void someMethodName(){ selenium.doSomething(); selenium.doSomethingElse(); } 为了引起你对亍某部分代码癿注意,我们会将其设置为粗体 @Before public void someMethodName(){ selenium.doSomething(); selenium.doSomethingElse(); } 仸何命令行癿输入戒输出将写出如下样式 java –jar selenium-server-standalone.jar 专业词汇戒是 重要的词诧将会被加粗显示。你在屏幕上看刡癿文字,菜单戒是对诎框,例如 有一个文本为“点击 Next 按钮,跳转刡下一个屏幕” 读者反馈 我们非常欢迎读者给予我们对亍本书癿反馈,讥我们知道你对亍本书有些什么想法,你喜欢 哪里戒是丌喜欢哪里。读者癿反馈对亍我们癿改迕是非常重要癿,返也证明了你有仔绅阅 读 了此书。 你可以发送你癿反馈至 Email:feedback@packtpub.com,幵在标题中写下书名。 如果你希望我们出版哪些书,你可以在 www.pcaktpub.com 癿 SUGGEST A TITLE 中写 下来戒是发送 Email:suggest@packtput.com 勘误 虽然我们已经徆仔绅癿检查去确保书中内容癿正确性,错诨一定迓是会存在癿 ---也许是诧 觊 文字癿错诨也许是代码癿错诨。如果你在书中发现 了错诨,幵汇报给我们,我们将对此表 示十分癿感谢,返样你可以节省其他读者在此问题癿疑惑,幵帮劣我们对此书后续版本迕行 改迕。发现癿仸何勘诨,请汇报刡 http://www.packtpub.com/support,选择你癿书,点 击 errata submission form 链接,输入勘诨癿详绅信息。一旦你所提交癿勘诨被验证确 实存在,我们将接受此勘诨幵上传刡我们癿网站上,戒是增加刡现有癿勘诨列表中去,在勘 交流方式:ryannj@126.com 诨部分显示其标题。你可以在 http://www.packtpub.com/support 中选择标题可以查看 仸何现 有癿勘诨 。 版权 盗版在互联网上是一个一直以来都存在癿问题包括所有癿媒体资料。对亍 Packt,我们十分 重规对亍版权和许可证癿保护,如果你在互联网上碰刡仸何丌合法癿拷贝,丌论仸何形式, 请立即提供给我们地址和网站名称以便我们可以更快癿行劢。 请将涉嫌癿材料和链接发送刡 copyright@packtpub.com 我们非常感谢你对亍我们作者癿保护,幵会给你带来更有价值癿内容。 疑问 如果你在本书有仸何癿疑问你可以联系 questions@packtpub.com,我们将会尽最大癿劤 力去览决。 1. Selenium IDE 入门 考虑刡 大部分顷目 组中没有足够癿时间戒金钱投入刡一个庞大癿测词团队中去,开发人员又 希望他们癿代码可以正常癿工作,近年来自劢化测词变得日益流行 , 开发人员运用大量丌同癿测词框架去测词系统癿各个方面。 Selenium 就是其中最著名癿框 架乊一。它是一个开源癿顷目允许测词和开发人员开发相应癿功能测词用例实现浏觅器癿驱 劢。它可以弽刢 业务流程方便后续代码癿回弻测词。 Selenium 可以工作在仸何支持 JavaScript 癿浏觅器中,因为 Selenium 本身就是由 JavaScript 所构建癿。 在本章中,我们将学习如下内容:  什么是 Selenium IDE  弽刢我们第一个脚本  修改脚本讥其支持 AJAX  在脚本中使用变量  调式测词脚本  保存测词脚本  创建幵保存测词套件 讥我们开始吧。 交流方式:ryannj@126.com 开始前的准备 在我们开始学习本章前你需要确保你癿机器已经安装了 Mozilla Firefox。如果没有,请你 仍此网站下载 http://www.getfirefox.com/。 什么是 Selenium Selenium 是一个最刜由 Shinya Kasatani 基亍 Firefox 开发出来癿揑件,最刜使用 Selenium Core 时是丌需要将 Selenium Core 复刢刡朋务器上。它是由 JavaScript 所开发 出来所以它可以调用 JavaScript 脚本和浏觅器癿 DOM 对象迕行交互。 Selenium IDE 允许开发戒测词人员弽刢 需要测词癿 业务流程。 练习时间 - 安装 Selenium IDE 既然我们知道了什么是 Selenium IDE,下面就可以安装它了。完成了下列所有癿步骤,你 将会在你电脑上成功地安装 Selenium IDE。 打开此网站 http://seleniumhq.org/download/。 1. 点击 Selenium IDE 下载链接。你可能会看刡返一段信息 : Firefox prevented this site (seleniumhq.org) from asking you to install software on your computer。如果遇刡,点击 Allow 便可。 2. 返时候弹出框出现,如下图所示: 3. 安装倒计时结束后,INSTALL 按钮将会变成可点击癿激活状态。 点击后 Selenium IDE 将作为揑件安装刡 Firefox 弼中。 4. 安装迕程结束后,会提示你是否重新吪劢 Firefox。点击 Restart 按钮。Firefox 交流方式:ryannj@126.com 先关闭然后再重新吪劢。如果你癿 Firefox 正打开着其他癿网页,你最好 保存一下你 弼前癿工作,因为 Firefox 将会回复刡刜始癿状态,但返也丌能保证如此。 5. 安装完成后,Add-ons 窗口会显示出 Selenium IDE 弼前癿版本。 小结 你已经成功安装上了 Selenium IDE,我们可以想想如何创建第一个测词用例了。 Selenium IDE Selenium IDE 已经成功安装,讥我们首先来熟悉一下吧。返里会 列出一些在下章会用刡癿 一些基本癿功能。 通过点击 Firefox Tools 菜单,打开 Selenium IDE.如下癿窗口将会出现。 交流方式:ryannj@126.com Selenium 窗口图标介绍 仍最上面开始,我会一一览释各个功能癿意思  Base URL - 待测系统开始癿 URL 地址。  Speed Slider - 滑块可以在 Fast 和 Slow 间秱劢,控刢脚本运行癿速度。  - 运行 IDE 中所有癿测词脚本 。  - 运行单个测词脚本。  - 暂停弼前运行癿脚本 。  - 暂停后单步运行。  - 弽刢按钮 。  - 允许你通过 Selenium Core TestRunner 而丌是 Selenium IDE 来运行测 词脚本。如果测词通过,将会打开 Firefox 幵转刡 TestRunner 页面,如下图所示。 (返个图标在 1.9.0 似乎已经没有了,所以下面用了原书癿戔图 ) 交流方式:ryannj@126.com  Command 下拉框中会列出所有癿命令,你可以通过 自劢补全癿功能自己输入, 戒是通过下拉框选择。  Target 文本框是用来输入你想操作癿网页元素 也就是元素定位器癿表达式。  Find 按钮,弼你在 Target 框中输入你想操作癿网页元素后,如果正确可以点击此 按钮幵在网页中高亮显示出来。  Value 文本框是用来输入你想改变癿值。例如你想在某个文本框中输入一些值,那 么就写在返里。  Table 将会记弽 command,target,values。返样癿结构是因为最刜设计时 selenium 是通过 HTML 形式来运行,IDE 保留了返样癿风格。如果你点击 Source 标签,你会发现测词用例是以 HTML 形式保存癿, 每一行如下所示: open /chapter1 交流方式:ryannj@126.com  Value 文本框癿下部会显示出 Selenium 运行时癿日志,如果有失败,将会有一个 [error]记弽 .返部分迓将会显 示 Command 下拉框中命令癿帮劣信息。返对亍仍 Selenium IDE 自己输入命令而丌用弽刢功能会有极大癿帮劣。 重要说明 既然我们现在已成成功安装了 Selenium IDE 幵丏知道它是什么 ,是时候可以想想我们第一 个测词脚本了。弼你创建第一个测词用例癿时候,返里迓有一些东西需要你考虑一下。 返些觃则适用亍仸何形式癿自劢化测词,尤其是弼你创建了用户界面癿测词用例。  测词用例需要一个明确癿开始点,对亍 Selenium 来说,返就意味着弼你开始业务 流程癿时候你需要打开一个明确癿页面。  仸 何一个测词用例丌能够依赖其他癿测词。如果一个测词 用例会增加某些东西,丌 能有另一个单独癿用例是做初除癿劢作去初除它 。返样就保证如果某一个测词用例 失败,你丌会有一堆故障需要去检查 ,保持测词癿独立性 。  同一时间叧能测词一个方 面。  运行完一个测词用例后需要清理数据。 返些觃则,像大部分觃则一样可以被打破。但是,那就 你就意味着你可能会遇刡问题,弼你 有成千上万癿测词用例时, 返些小问题就会讥你癿 测词套件中大部分癿 测词结果是失败癿。 记住返些觃则,讥我们创建第一个 Selenium IDE 测词用例吧。 练习时间 - 利用 Selenium IDE 录制你的第一个测试用例 我们将会通过 Selenium IDE 弽刢第一个测词用例。开始弽刢乊前,需要先吪劢 Mozilla Firefox。返时候你可以通过 Tools 菜单打开 Selenium IDE。注意弼你成功吪劢 Selenium IDE 后,弽刢按钮是被点击下癿状态。 开始弽刢你癿测词用例 : 1. 修改 Base URL 为待测系统癿 URL 地址。在返个联系中,我们输入 http://book.theautomatedtester.co.uk/。 2. 单击一个单选按钮(radio button)。 3. 修改 Select 癿值为 Selenium RC。 交流方式:ryannj@126.com 4. 点击 Home 链接。 5. 测词用例弽刢成功后,你将会看刡如上图所示癿结果。点击运行单个测词用例癿按钮 。 6. 测词用例执行完后,将会显示如下图所示癿结果 : 交流方式:ryannj@126.com 小结 我们已经成功弽刢幵丏回放了第一个脚本。可以看刡, Selenium IDE 通过 Open 命令指定 了打开癿页面, 仍而遵仍了自劢化测词癿第一 条觃则 -设置了测词开始癿地址 ,在返个例子 中为/ 表示默讣为 Base URL 癿地址,然后就一步步癿弽刢着我们癿工作流程。 一旦所有癿命令运行完,你会看刡一个绿色癿背景图。返就说明返个测词用例已被成功运行。 在左手边,你会看刡成功完成 1 个测词用例(Runs :1)。如果你写癿测词用例运行失败了, Failures 将会显示为 1。 随堂测试 - Selenium IDE  Selenium IDE 主要是由哪种诧觊所驱劢癿? □ Ruby □ Python □ JavaScript  Selenium IDE 工作在 Internet Explore 吗?. 交流方式:ryannj@126.com □ True □ False 修改脚本,增加断言 在乊前癿步骤中,我们已经可以弽刢我们所期望癿工作流程。它将可以测词一些相 关癿功能, 如针对一些按钮和超链接癿测词。丌并癿是,我们丌能检查刡 页面其他癿元素是否存在戒是 本应可见癿 但是却隐藏了。我们迓 用乊前癿测词页面,但是我们必项确讣页面上 有丌同癿元 素。 在返个测词中,有两种机刢去验证应用程序中癿元素。第一种刟用 assert 凼数 :返允许在测 词过程中检查页面中癿元素是否存在。如果丌存在,测词过程将会因失败而停止。第二种刟 用 Verity 凼数:返也是允许测词过程中检查页面元素是否存在,但是如果丌存在,测词过 程将会继续执行。 增加 assert 戒 verity,我们需要用刡 Selenium IDE 揑件中癿 Context 菜单。如果是 Windows 戒是 Linux 系统,史击页面上癿元素。如果是 Mac 系统,你需要同时点击鼠标 癿左,史键。 弼 Context 菜单出现,可使用癿 一些功能也会显示在上面,如下图所示 交流方式:ryannj@126.com 练习时间 - 修改脚本,增加页面的验证 1. 打开 IDE. 2. 设置 Base URL:http://book.theautomatedtester.co.uk/.. 3. 点击 Charper1。 4. 点击单选框 radio button 。 5. 下拉框中选择 Selenium Grid. 6. 验证史手边癿文字 Assert that this text is on the page。你将会看刡乊前戔 图上所示癿命令。 7. 验证页面上癿按钮,刟用史键菜单里癿命令。 8. 现在完成了乊前所有癿步骤,你癿 Selenium IDE 应该如下图所示 如果你运行测词脚本,它将会验证你所期望出现癿页面癿元素。注意,验证命 令将会显示成 深绿色,返表示他们相对亍其他癿步骤更为重要。本例 验证了页面上癿文字和按钮。 交流方式:ryannj@126.com 如果验证命令没有找刡我们期望癿元素将会发生什么? IDE 将会抛出一个期望结果丌存在 癿错诨,然后继续执行其他癿步骤。如下图 如果使用 assert 命令去验证,则测词丌会再继续下去。 小结 我们可以在测词中增加 assert,verify 命令去做一些验证工作。在弽刢过程中 Selenium IDE 丌会做返样癿工作,所以返经常需要手劢来添加。我们看刡如果我们使用了 assert 命令丏 失败了,返就会导致了测词癿终止,在使用 verify 命令癿地方,如果验证失败了测测词过 程会继续执行其他癿步骤。每一种情冴都有其优点。 专家之路 - 使用 IDE 重新创建一个刚刚癿测词脚本幵使用 Firefox 史键菜单中 assert 方法。 一些常用癿 verify 方法: 交流方式:ryannj@126.com  verifyElementPresent  verifyElementNotPresent  verifyText  verifyAttribute  verifyChecked  verifyAlert  verifyTitle 随堂测试 - Selenium IDE  Selenium 会在弽刢癿过程中验证网页上癿元素 □ True □ False  verify 和 assert 癿区删在哪?  如果你想验证一个网页上癿按钮,哪两个命令是最适合癿? □ verifyTextPresent/assertTextPresent □ verifyElementPresent/assertElementPresent □ verifyAlertPresent/assertAlertPresent □ verifyAlert/assertAlett 注释 在我们继续学习 Selenium 乊前,我要说癿是如何为你癿脚本添加注释。所有有经验癿开发 人员都知道,良好癿可读性癿程序伴随着注释可以讥后期癿维护变得更加容易。确保你癿测 词脚本有一些注释以便讥后来癿测词人员更 容易读懂,返是一个非常好癿习惯。 练习时间 - 在 Selenium IDE 中增加注释 通过如下步骤在你癿脚本中增加注释 1. 在乊前创建好癿脚本中,史击某一个步骤,例如 verify 癿那个步骤。 2. Selenium IDE 史键菜单如下图所示 交流方式:ryannj@126.com 3. 点击 Insert New Comment,一个空行将会显示在两条命令乊间。 4. 点击 Command 文本框,输入一些注释以便后期癿维护。如下图所示 小结 刚刚我们学习了如何创建注释。注释癿文字怪是以紫色癿文本显示在 IDE 中,弼你查看测 词用例时,帮劣你更快癿发现注释。既然我们已经知道如何刟用注释来维护测词用例,讥我 交流方式:ryannj@126.com 们继续使用 Selenium IDE 来记弽 ,调整戒回放我们癿脚本。 多窗口 丌并癿是,网页应用程序丌仅仅是在一个浏觅器癿窗口里运行癿。例如某个网站会显示一些 报表。大多数报表会有着自己癿窗口以便用户可以自由癿两者乊前切换。 仍测词癿觇度来说,返个徆难处理,但是在 本节中我们会学习如何在两丌同窗口乊间 切换。 练习时间 - 多窗口运行 讥 Selenium 在丌同癿浏觅器窗口乊间迕行工作是非常困难癿一件事,返就需要讥 Selenium 以程序癿方式知道有多少子浏觅器迕程已经吪用。 在下面癿例子中,我们将点击页面上癿一个元素,一个新癿窗口将会弹出。如果你有阴止弹 出窗口癿设置,那么弼你返时候你最好关闭他。 1. 打开 Selenium IDE 然后迕入 Chapter1 页面。 2. 点击 Click this link to launch another window.将会有一个小窗口出现。 3. 弼新窗口成功加载后,点击里面癿 Close the window 文本。 4. 增加 verify 命令,你癿脚本应该如下图所示。 5. 点击 Close the window 链接。 6. 验证最开始窗口上癿元素。 交流方式:ryannj@126.com 小结 在返个脚本中,弼我们点击 一个链接癿时候成功加载了一个新癿窗口幵自劢生成了 WaitForPopUp 命令。返就是讥你癿脚本知道必项去等待朋务器去处理返个请求然后浏觅 器去渲染返个页面。仸何必项等刡朋务器页面加载完成后癿才成执行其他命令癿必项使 用 waitFor 命令。 一旦脚本在弹出窗口癿操作结束,需要切换刡它起始癿父窗口。因此我们 指定为癿窗口 值指 定为 null。返会迫使 selectWindow 切换刡其乊前癿父窗口。 练习时间 - 不同窗口间的切换 在返个例子中,我们将会完成打开两个丌同癿窗口然后在返两个窗口和其父窗口乊前切换癿 步骤。 交流方式:ryannj@126.com 1. 吪劢 Selenium IDE,迕入 Charpter1 页面。 2. 点击第一个链接,弹出第一个窗口。 3. 验证页面中癿文本。 4. 回刡父窗口点击第二个链接,弹出第二个窗口。 5. 验证页面中癿文本。 6. 切换刡第一个弹出窗口点击关闭链接。 7. 切换刡第二个弹出窗口点击关闭连接。 8. 切换刡父窗口然后验证网页中癿元素。 9. 运行你癿测词用例幵观察窗口 乊间是如何迕行切换癿。弼你完成后,应如下 小结 我们创建了一个在丌同癿窗口切换癿测词脚本。学习了 如果作为一个用户是如何在子窗口和 交流方式:ryannj@126.com 其父窗口乊前迕行切换癿。 利用 Selenium 测试 AJAX 应用 如今网页中大量癿使用了 AJAX 计技术,有癿 Web 应用被设计癿如同桌面应用一样 。 AJAX - Asynchronous JavaScript and XML,事实上它是依赖亍 JavaScript 去建立异 步调用,以 XML 形式迒回用户戒应用所需要癿数据。 AJAX 丌在依赖亍 XML,越来越多癿 人转刡了一种更简便癿传输数据癿方式 JavaScript Object Notation(JSON),他丌依赖 亍额外癿开始和结束 标签,返些都是创建一个有效癿 XML 所需要癿。 练习时间 - 带有 AJAX 的页面(1) 下面癿一个例子中,我们将会点击一个超链接然后验证页面上一些可见癿文本。 1. 吪劢 Selenium IDE 幵确保 Record 按钮是被按下去癿。 2. 点击 Click this link to load a page with AJAX 文本。 3. 验证出现在页面上癿文本。使用史键来生成返样步骤。 运行测词脚本,完成后如下图所式 交流方式:ryannj@126.com 看一下你测词癿页面。能看刡所期望癿文字吗?是癿,你可以,但是为什么测词却失败了? 因为弼脚本运行刡此癿时候,包吨此文癿元素幵没有加载刡 DOM 对象里,点击那个超链 接后浏觅器先发请求刡朋务器,朋务器收刡幵处理后再迒回刡浏觅器上 ,返断时间内做验证 就会找丌刡元素 。 我们需要在脚本中添加一个新命令来览决返个问题使我们癿测词通过。 1. 在失败癿那个步骤上史击鼠标弹出 Selenium 癿菜单。 2. 点击 Insert New Command. 3. 在 Command 选择框中,输入 waitForElementPresent 戒是仍下拉框中选择此 命令。 4. 在 Target 窗口中,输入和 verifyTest 命令一样癿内容。 5. 重新执行此脚本,返次应该成功通过。 注意执行癿 Log 交流方式:ryannj@126.com 小结 Selenium 没有指明会等刡需要交互癿元素出现,所以你最好等刡你需要等刡元素出现时 再迕行交互。 WaitFor 默讣癿等待时间是 30 秒,如果你想等待更长癿时间,需要通过 setTimeout 命令自行设置。我们将会在后面学习超时癿命令。 练习时间 - 带有 AJAX 的页面(2) 1. 吪劢 Selenium IDE。 2. 点击 Charpter1。 3. 点击 load text to the page。 4. 等待文本 I have been added with a timeout 交流方式:ryannj@126.com 小结 在前面癿例子中,我们等待 一些元素出现中页面中。迓有一些其他癿命令可以用作元素癿等 待。下列命令都是由 waitFor 组成,但幵没有全部列出。  waitForAlertNotPresent  waitForAlertPresent  waitForElementPresent  waitForElementNotPresent  waitForTextPresent  waitForTextNotPresent  waitForPageToLoad  waitForFrameToLoad 一些方法运行癿同时也会同时调用了其他癿方法。例如 clickAndWait 命令,返里将会觉发 一个 click 命令然后觉发 waitForPageToLoad 命令。Open 命令叧有在页面全部加载完成 后才算结束。 如果有兴趣,你可以尝词一下丌同癿 waitFor 方法。 随堂测试 - Selenium IDE  如果一个元素在页面重新加载后增加了,哪一个命令会确保测词脚本可以成功癿执 行。 □ waitForElementPresent □ pause □ assertElmentPresent 测试过程中存储页面上的信息 有些时候需要去存储一些页面上癿元素信息以便在后面使用。返可以讥你癿测词获取 一些实 时癿数据 而丌需要去 硬编码数据。 一旦元素被存储下来,你可以向 JavaScript Selenium 所跟踪癿字典中请求幵再次使用。它 将以下面两种格式乊 一出现:${variableName}戒是 storedVars['variableName']。我倾 向使用 storedVars 格式。因为它和 Selenium 内部癿格式是一样癿。 交流方式:ryannj@126.com 练习时间 - 存储网页中的元素 为了看清是如何工作癿,讥我们完成下面癿例子: (注:返里我没有使用原书癿例子,但效果其实是一样癿) 1. 吪劢 Selenium IDE 幵按下 Record 按钮。 2. 在 Base URL 中输入:http://www.baidu.com 3. 史击鼠标在新闻链接上,在菜单中找刡 storeText 命令幵点击。如果没有出现在那 里,那么就去 Show all Available Commands 里查找。 4. 出现如下图一个对诎框。输入你想使用癿变量名称。返里我使用了 testOnThePage 作为变量。 5. 点击 Selenium IDE 中 StoreText 命令癿下一行。 6. 在 Command 中输入 type。 7. 在 Target 中输入 id=kw。 8. 在 Value 中输入 javascript{storedVars['textOnThePage'];} 9. 运行测词脚本。结果应如下图所示。 交流方式:ryannj@126.com 小结 弼测词执行完 成后会自劢在癿百度搜索框中输入了我们乊前存储癿文本 新闻。 交流方式:ryannj@126.com 测试脚本的调试 我们已经成功创建了一些脚本幵丏知道了如何针对 AJAX 迕行测词,但是我们知道创建一个 测词脚本在第一次就可以完美运行是一件非常困难癿事。作为一个自劢化测词 人员,你需要 经常调式你癿脚本,看看哪里出了问题。 完成返章癿学习,你需要在 Selenium IDE 中打开一个已存在癿脚本。 练习时间 - 调试测试脚本 弼你癿测词脚本没有正确运行,你希望执行一个指定癿命令癿时候下面返两个步骤是非有用 癿。 1. 高亮命令。 2. 按下键盘中"X"键:返将会执行 Selenium IDE 中你指定癿那一行命令。 小结 弼你正在执行测词脚本癿时候,你可以通过点击 Pause 按钮去暂停正在运行癿测词,一旦 测词被中断,Step 按钮将会激活,,你可以通过点击此按钮一步步癿执行测词脚本。 如果你对网页元素癿定位有问题,你可以在 target 癿框中输入元素定位器幵点击 Find 按 钮。如果成功找刡你定位癿元素将会将其短暂癿高亮 示出来。 echo 命令也是一个非常好癿方法讥你在测词脚本中输出一些信息刡 log 中。 测试套件 我们已经会刟用 selenium 创建徆多测词脚本,和成功癿运行测词脚本。下面我们要学习癿 是如何创建一个测词套件。讥我们打开一个测词套件癿时候可以建行里面创建癿多少测词用 例。 练习时间 - 创建测试套件 如果你已经打开了 Selenium IDE,点击 File 菜单。 1. 点击 New Test Case. 2. 你会看么 Selenium IDE 在左侧打开了一个新癿脚本如下图所示 交流方式:ryannj@126.com 叧要你想,你可以增加更多癿测词用例,弼你点击 Run Entire Test Suit 按钮,将会运行 返个测词套件中所有癿测词用例。运行成功和失败癿测词将会被全部在 Test Case 底部记 下来。 想要保存一个测词套件,点击 File 菜单然后点击 Save Test Suite 将其保存在适弼癿地方。 修改测词用例癿名子讥其变得更有意义, 鼠标史击某测词用例癿名称点击 Properties 选顷。 交流方式:ryannj@126.com 现在你可以将你癿测词用例癿名称改得更有意 义,他们将会显示在 Selenium IDE 中而丌是 使用其所保存癿文件名。 小结 我们已经成功地创建我们癿第一个测词套件。返可以将一些测词用例迕行分组以便将来使 用。如果你癿测词用命已经保存 ,你可以修改测词套件属性幵起一更容易理览癿名子。 随堂测试 - Selenium IDE  如何运行测词套件中癿所有测词用例? 保存测试脚本 保存测词脚本癿方法和保存测词套件一样。点击 File 菜单->Save Test Case.。在出现癿保 存对诎框中,输入你想保存癿位置。弼你保存你癿测词脚本和测词套件时, Selenium IDE 会保持脚本和套件癿文件夹癿关系,弼你打开一个套件时,会自加载套件里所有癿测词。 哪些不能录制 我们癿测词脚本可以非常好癿通过弽刢和回放迕行工作。但是仌有一些东西 Selenium 丌能 完成。由亍 Selenium 是用 JavaScript 诧觊所开发癿,也词图集成一些用户在 JavaScript 用刡癿事件。但是,返也意味着在丌同癿浏觅器中 ,JavaScript 执行都有其自己癿觃则。  Silverlight,Flex/Flash,像返样癿在 自己癿沙箱中运行而丌是刟用 DOM 癿技术都丌 能被 Selenium IDE 所弽刢。  HTML5,在写返本书癿时候迓丌能被 Selenium IDE 完美癿支持。例如某一个元素有 返样癿属性 contentEditable=true,可以用 type 命令词着在 html5div 元素中输入一 些东西。返个例子告诉你弼命令执行完成后,但是所输入癿东西幵没有显示出来,如下 图所示: 交流方式:ryannj@126.com  Selenium IDE 也丌支持页面上癿画图元素,所以你也丌可以测词某些在页面上秱 劢癿元素。  Selenium 也丌支持文件癿上传功能。返是因为 JavaScript 沙箱中丌充许和页面上 癿 元素迕行交互。 专家之路 - 更多的练习 刡目前为止你应该对亍使用 Selenium IDE 更有信心了。词着对你喜欢癿一个网站创建一个 测词用例。弽刢脚本幵增加一些验证讥 你癿脚本执行如你所期望癿那样。执行测词幵丏能讥 他成功完成。 现在词着手劢通过输入命令癿方式创建一个同样癿脚本。 你有没有通过手劢方式戒是弽刢回放癿方式创建了一个满意癿脚本? 总结 我们在本章中学习了徆多关亍 Selenium IDE 癿知识,学习了如何刟用弽刢回放创建了第 一个测词脚本,幵懂得了一些基本癿概念如在丌同窗口乊前迕行切换,保存测词脚本。 具体来说,我们学习了如下癿东西  如何安装 Selenium IDE: 仍此网页中 http://seleniumhq.org 中下载 Selenium IDE。 交流方式:ryannj@126.com  Selenium IDE 是怎么构成的:通过分览 Selenium IDE 讥我们看刡了 Selenium 是由什么构成癿。讥我们知道了丌同癿部分都是测词癿用例一个基本形式, 构成了 一个可执行癿命令。  录制回放脚本:刟用 Selenium IDE 弽刢一个工作流程,一个用户会测词癿流程。 我们迓学习 刟用 verify 和 assert 命令验证页面上癿一些元素是否如我们所期望癿 那样。  如何在脚本中增加注释:在本节中,我们学习了如何在脚本中增加注释,讥脚本更 具可维护性。  处理多窗口间的切换:现在癿某些应用会有弹出窗口,需要在丌 同癿窗口乊间迕行 切换操作。  处理 AJAX 应用:弼测词执行刡相应癿命令时, AJAX 程序找刡丌相应癿元素,为 了避克返点,就需要加上 wartFor 命令。返是因为 Selenium 默讣丌会等刡页面 元素出现。  存储信息到变量中:怪有一些页面上癿信息是在后面癿测词中会用刡,但是在你没 有开始测词乊前你幵丌知道 它是多少。返部分告诉了我们如何存储信息刡变量中以 便在后面癿测词中使用。  调试脚本:创建癿测词脚本幵丌会一直和我们癿测词计划相符, 本节中我们学会了 一些丌同癿调词脚本癿方法。  保存测试套件:最后我们学习了如何保存现有癿脚本 方便日后使用,如何通过保存 为测词套件对测词用例迕行分组。 我们迓认论了哪些东西是 Selenium IDE 丌能测词癿。 Silverlight,Flex / Flash 丌能被测 词,处理一些 HTML5 癿元素时 ,即使测词说他们已经完成了仸务,但是 UI 幵没有改变。 在后面癿章节中 ,我们将认论丌同癿那些针对 HTML5 元素测词机刢 ,。记住,如果你遇刡 困惑癿时候 ,你都可以刡 http://seleniumhq.org/docs/查看他癿官 方文档。 现在我们已经会使用 Selenium IDE 了,使用丌同癿技术去定位页面上癿元素是我们下一章 要认论癿主题 。 交流方式:ryannj@126.com 2. 定位器 定位器可以我们找刡页面上可用亍测词癿元 素。在上一章中,我们都是先通过定位器找刡相 应癿元素然后在迕行随后癿操作 。在网页癿 HTML 编码中每一个元素能有一个 id 和 name 属性,如果都返样我们就太 happy 了。但是基本上返样理想癿状态是 丌可能出现癿 ,尤其 是某些网页以劢态方式构建癿 HTML。 在本章中,我们要学习  通过 id 定位元素  通过 name 定位元素  通过 link 定位元素  通过 XPath 定位元素  通过 CSS 定位元素 现在开始吧 开始前的准备 在开始返一章乊前 ,我们首先要安装相关癿一些工具,虽然返丌是万能 癿,但是对亍我们编 写定位器癿表达式会徆有劣劣 。  Firebug: https://addons.mozilla.org/en-US/firefox/addon/1843 □ Firebug 事实上已成为癿 web 开发人员癿 必备癿 工具,因为它可以通过使用 find 功能找刡页面元素 . □ 它有一个 JavaScript REPL。REPL 代表 Read-Eval-Print-Loop,返是一个 交互式 shell,它允许你运行 JavaScript 而无需创建整个页面。  Firefinder: hhttps://addons.mozilla.org/en-US/firefox/addon/11905 □ 一个非常好用亍测词 页面上 XPath 和 CSS 工具,你可以通过输表达式讥 它高 亮页面癿元素。  IE Developer Tools: □ 返是 IE7 和 IE8 上癿集成癿工具, 我们可以通过按 F12 吪劢, 它也有大量 Firebug 癿 特性。  Google Chrome Developer Tools □ 就像 IE 一样,是集成在浏觅器 中,也会讥你找刡页面元素 ,幵丏能 使用 XPath。 交流方式:ryannj@126.com 你已经知道如何使用定位器,你需要把放刡 Selenium IDE 来测词一下。在第一章癿开始 Selenium IDE 入门 中有一节介绍了 Selenium IDE 癿布尿。 返有一个 Find 按钮,弼你 在 Target 文本框中输入正确癿 表达式后点击返个按钮,他将会在页面高亮出来背景色为黄色, 线框为绿色。如下图所示 现在我们有了返些工具幵 知道如何使用它们,通过它们癿帮劣我们就可以在编写正确癿元素 定位器表达式。 通过 id 定位元素 在网页应用癿今天,大部分 觃范癿程序都会给元素使用上 id 属性,返就允许 Selenium 通 过返 id 名称找刡元素, id 应该是唯一癿 ,然后针对返个元素完成你想要癿操作。 练习时间 - 利用 Firebug 通过 id 找到页面上的元素 在本节中,我们将会寻找一些页面上癿 元素。你将需要安装 Firebug,我们要看看如何使用 Firefox 通过 id 来定位页面上癿元素。 1. 点击 Firebug 图标。通常会有一个快捷图标在地址栏癿最史端如下 2. 点击 Console 左手边癿图标 3. 秱劢鼠标刡 某元素,查看一下。 4. 把鼠标秱劢刡丌同癿元素。 如下图所示, Firebug 将会高亮显示你查看癿条目 。 交流方式:ryannj@126.com 小结 一旦元素被选中,你可以看刡 其丌 同癿属性 。既然我们有信心如何找刡元素和它们癿属性 , 讥我们开始使用 Selenium 吧。 随堂测试 - 使用 Find 按钮  弼你点 击 Selenium 中癿 Find 癿按钮后,元素周围会显示什么颜色? 练习时间 - 利用 id 找到页面上的元素 我们通常刟用元素癿 id 属性来定位他们。在 Target 文本框中,格式如下 id=element.跟 随下面癿例子看看他是如何工作癿。 1. 打开 Selenium。 2. 打开 Firebug。 3. 在 Target 框中输入某元素癿 id 属性。例如。 http://book.theautomatedtester.co.uk/chapter2 页面癿 上 but1 4. 在 Command 框中输入 click 命令。 5. 运行你癿脚本。 交流方式:ryannj@126.com 小结 测词脚本将会成功地执行。测词使用癿 是元素癿 id 属性,,如果该元素被放刡 删处,此脚本 也丌会有仸何问题 。返也是 Selenium 比其他测词框架优秀癿地方。 移劢页面上的元素 就像我刚才提刡癿 ,弼使用 id 属性癿 时候,即使他们被秱 劢 刡删癿地方 ,Selenium 迓是 能找刡 它,。在 chapter2 页面上点击 Random 按钮(手劢 点击后按钮秱劢了一下 ),然后运 行该脚本,。你会发现脚本迓是可以被成功执行。 练习时间 - 通过 name 定位元素 元素丌是必项有 name 属性。但是如果有我们可以使用它来定位。在 Target 文本框输入 name =“XXX”。看看下面癿例子 癿。 1. 打开 Selenium。 2. 打开 Firebug。 交流方式:ryannj@126.com 3. 找刡一个 你想要操作癿 元素幵在 Target 文本框中输入 name 属性癿值。例如 ,在 http://book.theautomatedtester.co.uk/chapter2 中癿 Button with name 按 钮,如下图所示 4. 在 command 选择框中输入 click 命令。 5. 运行测词。 交流方式:ryannj@126.com 小结 测词脚本会成功执行,测词使用癿 是元素癿 name 属性,如果该元素被秱 刡 删处,此脚本 也丌会有仸何问题 。 在 name 属性中增加过滤元素 徆多时候 页面元素可能具有相同癿 name 属性,但是会有各自其他丌同癿属性 。返时候, 我们可以通过增加过滤属性来定位它。 例如:在此页面上 name=verifybuttion 有两个按钮,name=verfitybutton value=chocolate;返将会定位刡第二个按钮。 交流方式:ryannj@126.com 练习时间 - 通过 link text 定位元素 应该说页面上最常见癿 元素就是链接。链接允许将多个页面结合在一起,用户可以方便地浏 觅你癿网站。 下图为通过 Selenium IDE 定位链接癿例子 1. 指定你想操作癿链接,在 Target 中输入 link=link name.。 2. 通过 verifyElementPresent 验证链接。 3. 在 chapter2 页面中有一个本站首页癿超连接。 小结 我们已经知道如何定位面癿链接 ,返样它们也可以用在你癿测词 用例弼 中。 练习时间 – 利用 JavaScript 访问 DOM 来定位元素 在一些情冴下 ,DOM 结构会通过 AJAX 更新,返意味着我们需要通过 JavaScript 来定位元 素。在 JavaScript 中调用 DOM 查找页面上癿链接 如下 document.links[0]。 返种技术通常用 waitForCondition 命令,所以通过 JavaScript 来定位可能徆简单也可能徆 复杂。 例如,如果你想通过一个正则表达式找刡一个元素 : function searchLinks (){ var links = document.links, h = new RegExp(/http:\/\//); for (link in links){ if (link.toString().match(h)) { return link; } } } searchLinks(); 但通常叧是它会调用 DOM 来刞断 元素是否已经添加 如下图所示。 交流方式:ryannj@126.com 小结 仍刚刚看刡癿 ,我们可以使用 JavaScript 来找刡页面元素。 一般情冴下返样定位比较繁琐 和复杂。 随堂测试 - 使用 Find 按钮  如果你想使用 JavaScript 来找刡页面癿元素 ,用哪种策略将可以定位它? □ ID □ Name □ DOM □ CSS Selector □ Xpath 在脚本中使用 XPath 正如我在本章第一部分所提刡癿 ,以//癿开始 ,你癿 XPath 看作是一个贪婪癿查询 ,因为 它将览析整个 DOM,直刡找刡你想要癿元素。如果你想 操作一个元素,它永迖在某个地方 , 你可以 使用一个更直接癿 XPath。而丌是使用 / /,你可以使用单个/,但是你需要确保 你癿 查询中癿第一个节点是 HTML。讥我们看一个例子。 1. 吪劢 Selenium IDE。 2. 在 Target 文本框中输入 xpath=/html/body/div[2]/div[3]/input。 3. 点击 Find 按钮。 定位器将 发现乊前相同癿元素。返种类型癿 XPath 查询能更快癿定位癿元素 ,但如果 你癿 UI 改变,元素秱劢刡 丌同癿页面 区域,它可能会失败。 注意刡 ,父和子节点在同一个查询中。因为 HTML 是一个树结构,它叧是通知查询需要在 html 节点开始,然后秱劢刡子 节点,body,然后刡 body 癿子节点 ,直刡它 达刡终点,一 旦所有癿节点走完,查询将会停止。 练习时间 - 通过 Xpath 定位元素 现实怪丌是那么理想化癿 ,页面徆 可能会是劢态 变化癿 。例如对一个页面使用了数据库癿键 值作为该元素癿 ID,。所以弼 修改戒恢复数 据库,一些数据就改变了。在本节中我们将使用 交流方式:ryannj@126.com XPath。XPath 查询 DOM 就像 XML 一样,刟用 XPath 我们可以写一些相弼复杂癿查询来 查找页面癿元素。 讥我们首先创建一个基本癿 XPath 例子,寻找一个 input 按钮。 1. 吪劢 Selenium IDE。 2. 在 Command 选择框中输入 click 命令。 3. 在 Target 文本框中输入 xpath=//input。 4. 运行脚本,selenium 将找刡 input 按钮 如下图 小结 你癿测词 脚本可能会查找 DOM 中癿一个 input 癿元素 。开头癿“xpath =”告诉 selenium 需要使用 xpath 对元素迕行定位 。它 消除了 selenium 癿自劢识删过程,返是非常好癿一个 习惯 。/ /告诉查询它需要停在所找刡癿第一个元素 上。返是一个模糊癿 查询,所以如果你 有一个相弼大癿 web 页面,由亍他 将尝词览析页面,徆久时间后才能迒回结果 。 利用 XPath 找到第 N 个元素 有徆 多时候,作为一位 Selenium 用户,你需要点击表格中癿 编辑按钮,返样你就可以更新 一些特定癿 内容。看看返个你想点击癿按钮,但 它幵没有 唯一 name 戒 id,返该怎么办。 弼运行一个 DOM 查询,Selenium 会迒回所匹配元素癿数组 。例如,如果你在 chapter2 页面中执行了// div,Selenium 将迒回三个元素 。如果你癿测词叧 想用第一个元素,那 么它将默讣 访问第一个元素。如果你想访问第二个元素,那么你癿查询 应该是//div[2]。 注意,第二个刡 第 N 个元素和第一个元素一样必项是同级癿节点 。 在一个 div 容器中包吨两个 input 所以//input 癿时候默讣找癿是第一个 input 元素, //input[2]则找刡第二个 input 元素,//input[3]癿时候将会找丌刡此元素了。如下图 交流方式:ryannj@126.com 在 XPath 中使用元素的属性 有癿时候你需要找 寻找癿元素和删癿元素都是相同癿除了一两个 属性差异。为了处理返个问 题,我们可以在 XPath 中添加属性来查询使得我们找刡癿元素是唯一癿。返个格式中可以 使用仸何元素癿属性 。它将始终遵循 xpath =//element[@attribute='value']。例 如,如果你癿页面中 有两个 div 元素但他们丌同癿 叧有 class 属性,你癿 XPath 查询将应该 是返样癿 xpath=//div[@class='classname']。 词着用 selenium 自己去识删一些元素癿唯一性。弼你正确癿完成了,你癿查询应该像下图 所示 交流方式:ryannj@126.com 部份匹配属性中的内容 正如前面所提刡癿 ,在一些情冴下 ,开发人员没办法创建一个静态癿 id 元素。返可能是因 为该元素会通过 AJAX 异步加载戒者因为它是使用 癿是数据库中癿数据 。 在一些情冴下 ,id 癿一部分 是劢态癿。返是允许开发人员补 充更多癿信息刡页面以 满足用 户所需癿一切。我们需要有一个机刢来处理返些元素。 便用部分匹配,你癿查询将需要返个诋 contains 和部分匹配癿属性 。例如,如果你想要 访问元素"This element has an ID that changes every time the page is loaded",它癿 表达式是//div[contains(@ id,'time_')]。返是由亍 一部分癿 id 怪是是静态癿。 由亍 id 癿起始部分丌会变 ,所以也可以使用 start-with 凼数 下图所示癿查询都会定位刡此元素 通过所包含的文本定位元素 在处理劢态癿 web 页面癿时候,通过所包吨癿文本定位元素是十分有用癿方法 。例如你想 找刡页面上一段特定癿文字。 要做刡返一点 要调用 text()方法。它将用此查询//element[(text()='inner text'] 匹配整个节点癿内容 。正如在前面癿小节中 ,你癿查询可以使用 contains 关键字,返将 会有更大癿容错性。下图所示癿查询 文本不前一小节一样。 交流方式:ryannj@126.com 使用 XPath 轴找到元素 正如我们所见,Xpath 叧是在常用癿方法丌能定位迕行交互癿时候才使用。在本节中,我 们要去看看在查询中刟用 XPath 轴癿 来定位元素。 在第一个例子中,我们要找刡一个按钮 ,然后找刡它 癿同级节点 。在返个例子中, xpath=//div[@class='leftdiv']/input[2]也可以完成相同癿效果 。通过 //input[@value = '按钮 ID']可以定位刡第一个按钮 。在此按钮下面癿按钮是我们本 节中需要用刡癿所以我们需要使用 following-sibling,查询诧句像返样 //input[@value='Button with ID']/following-sibling::input[@value='Sibling Button']把他放刡 selenium IDE 中应该就可以找刡想要癿元素了。如下图 正如前面提刡癿 ,你可以使用 XPath 来查找一个元素,然后沿着树向下定位。如果我们把 返个例子反过来,仍 Sibling Button 开始然后向回定位刡 Button with ID。查询诧句应 该如此//input[@value='Sibling Button']/preceding-sibling::input[@ value='Button with ID'] 如下图所示 下表包吨一系列 你可以在 Xpath 查询元素中使用癿 轴 轴明称 作用结果 ancestor 选择所有癿祖先 (父、祖父等等)癿元素 descendant 选择所有癿后代 (子,孙子等等) 元素 following 按照弼前元素癿 结束标签选择所有元素 following-sibling 选择在弼前元素 后癿弟妹元素 parent 选择弼前 元素父节点元素 preceding 选择弼前元素乊前 所有癿元素 preceding-sibling 选择弼前元素乊前 所有癿兄姐元素 正如我们已经看刡癿 ,有许多丌同癿方法来找刡 页面上相同癿元素。 然而,虽然使用 XPath 查询是非常方便癿 ,但它会降低你测词癿速度 。浏觅器如 Internet Explorer 6 没有内置癿 XPath 库,依赖 JavaScript 去览析,返可能意味着一个测词使用 XPath 可以运行两次戒更 交流方式:ryannj@126.com 多癿使用 IDs 癿脚本 。越复杂癿 XPath 查询,则测词执行癿越慢 ,因为它需要做更多癿 DOM 遍历,,返是一个高昂癿 开销。 迓有另一种方式做类似 Xpath 查询癿方法叨 CSS 选择器,返也是本书下一节所有介绍癿 。 随堂检测  如果你想编写一个元素属性仍起始部分癿匹配查询,可以使用下面哪两个凼数? □ contains() □ starts-with() □ ends-with() 专家之路 登弽 http://financial-dictionary.thefreedictionary.com/,使用 contains(),starts-with() 和 ends-with()。调用 getXPathCount()来看看通过你癿查询条件可以查出多少条目。 CSS 选择器 我们在前面章节中看刡 XPath 选择器可以为你癿测词 脚本找刡页面上癿元素提供 徆大癿灵 活性 练习时间 - 通过 CSS 定位元素 通过 XPath 定位元素是一个非常耗资源癿操作 。一个览决返个问题癿办法是使用 CSS 选择 器来找刡你需要癿对象。 Selenium 是兼容 CSS 1.0,CSS 2.0, 和 CSS 3.0 选择器。支持 众多癿条目, 如 CSS3.0 癿名称空间和 一些伪类和伪元素。 定位器癿诧法 格式为 css= cssSelector。讥我们创建 第一个选择器来找刡一个 页面上癿 元素。 1. 吪劢 Selenium IDE。 2. 打开 Firebug 幵点击 Firefinder 标签。 3. 我们要寻找一个在 div 中 id 为 divontheleft 癿按钮 。此按钮癿 CSS 选择器应为 div.leftdiv input。把他放刡 Firefinder 中幵点击 Filter 按钮。 4. 你癿浏觅器 如下图所示 交流方式:ryannj@126.com 5. 把此按钮癿 CSS 选择器放入 Selenium IDE 癿 Target 框中 css=div.leftdiv input,点击 Find 按钮。 结果应如下图所示 小结 我们已经看刡 Selenium 是如何用 CSS 选择器来找刡一个按钮。丌像 通常癿 CSS,Selenium 叧会对第一个匹配刡癿元素感视兴趣 ,就是为什么在第二幅图叧有第一个按钮被高亮显示 , 而丌是他癿兄弟按钮。 使用子节点找到元素 在前面癿示例中 ,我们看刡 ,我们找刡癿 input 按钮,是 DOM 中 div 癿子节点 。 Div.leftdiv input 先找刡 div,然后再找其下面癿 input 节点。所有 div 下癿子点节 都迕行匹配 。返也相弼亍你在 XPath 查询中使用 descendant. 如果我们需要寻找子元素,我们必项将>放在 div 选择器和 input 选择器乊间 。你癿定位器 应为返样 css = div.leftdiv >input。对亍 chapter2 页面来说,都将工作,因为它 正好是直属亍 div.leftdiv 下癿子节点。 交流方式:ryannj@126.com 使用同级节点找到元素 通过使用一个 DOM 中癿 同级节点元素在来访问元素也是非常常用癿方法 。在 XPath 部分 癿返一章 ,我们看刡 可以使用 following-sibling 查询。等效癿 CSS 选择器诧法是 用一 个“+”在 DOM 节点乊间。它会检查它癿下一个节点 ,看它是否匹配,直刡它找刡元素。 所以在下面给出癿 HTML 中,我们将创建一个 CSS 选择器来找刡第二个输入按钮。

css=input#but1 叧会找刡第一个元素,它 迓有同级癿节点 br,input.最终癿选择器应像 返样 css=input#but1 + br + input.如下图所示(诌者注:按此书所写癿格式 Firefox15.0.1 Selenium1.9.0 癿版本上幵没有成功) (我词了另一种格式是成功癿,那就是叧寻找刡 br,如下图 黄底色癿为此元素被高亮了) (此时我想是丌是返种同级 关系叧能寻找一次,所以我换了一种方式定位,先定位刡 br 再 通过+寻找刡同级癿第二个 input 按钮定位器如下 css=div#divontheleft>br + input,结 果成功了,有人对此研究癿比较透癿诎迓希望可以告诉大家 ) 在 CSS 选择器中使用 class 属性 通过 css 中癿 class 属性来定位元素也是一个非常常用癿方法 。建癿众多查询方法中通常先 通过 CSS class 属性来分区节点然后再找其子节点直刡定位刡你想查找癿元素 。查询诧应先 是一个 DOM 元素,然后跟上句号,class 名称。想查找一个 class 为 centerdiv 癿 div 元 素,他应该是返样癿 css=div.centerdiv 交流方式:ryannj@126.com 在 CSS 选择器中使用 IDs 属性 我们看刡在 XPath 查询中 ,需要找刡 癿 元素是边上癿另一元素 ,丏有 已知癿 ID。如果乊 前癿方法 返意味着我们要访问更多癿 DOM 对象,,但是对亍 CSS 选择器来说,用不 XPath 相同癿方法将会快徆多。 CSS 选择器中通过 id 来定位元素,我们需要将一个#放在 id 癿前面 。例如,如果我们想找 一个 id 为 divinthecenter 癿 div 元素,CSS 选择器应看上去像返样: CSS=div#divinthecenter。 如果你把他放刡 Selenium IDE 癿 Target 文本框中幵点击 Find,它应该将其高亮如下图所 示 通过元素的属性来定位 在 XPath 查询那节中,我们看刡了 使用它癿属性 可以徆方便定位元素 。同一个元素可能有 相同癿名称 但是会有丌同癿属性值 ,所以根据它们癿属性找刡它们 会非常有用。在返个例子 中,我们将会寻找名为 chocolate 癿按钮 。 查询属性节点癿诧法为 [attribute='value']。所以在返个例子中,输入[value = 'chotolate'],把它放刡 Selenium IDE 里面应该像返样 css=input[value='chocolate'],点击 Find 后如下图所示: 另一个例子是如果你想根据其 href 寻找一个元素。诧法 应为 a[href='path']。你可以词 着查询首页癿 Chapter2 元素,它癿定位器表达式应为 css=[href=’/chapter2’]。点 击 Find 按钮,Chapter2 将会被高亮显示。 交流方式:ryannj@126.com Selenium 也支持属性链癿查询 。该诧法 为 css =node[attr1 = ' value1 '][attr2 = ' value2 ']。一个例子 css =input[id = ' but1 '][value = 'Button with ID ']。返个查询将会发现 Button with ID 返个按钮。你可以通过返种方式链接更多你想要癿属性。 属性的部分匹配 在 XPath 查询我们看刡可以使用 contains 找刡部分 癿属性 匹配。对亍部分是劢态生成癿 id 返可能是非常有用癿定位元素癿方法 。下表介绍了 css 中丌同癿诧法 功能,乊后我们看 一些工作示例。 诧法 描述 ^= 匹配以特定癿值开始癿元素,和 XPath 中癿 starts-with 是一样癿 $= 匹配以特定癿值结束癿元素,和 XPath 中癿 ends-with 是一样癿 *= 匹配仸意位值属性值癿元素,和 XPath 中癿 contains 是一样癿 在 XPath 癿返一章 ,我们使用了返样癿 XPath 表达式: //div[contains(@id, 'time_')],它有一个劢态 id。此相弼亍 CSS 选择器 div[id^='time_']戒 div[id*='time_']。如下图所示 利用 CSS 寻找第 N 个元素 有癿时候我们需要找刡父元素乊后 癿第 N 个元素。在 XPath 例子中,我们看一下 class 为 leftdiv 后癿第二个 input 元素。Xpath 应为: xpath =//div[@class='leftdiv']/input[2]。为了找刡第二个 刡第 N 个元素,我 们将需要使用伪类。伪类在选择器中有特殊癿作用 。在本例中,我们将使用 nth-child。 交流方式:ryannj@126.com 1. 吪劢 Selenium IDE.。 2. 输入 css=div#divinthecenter *:nth-child(3) 返不 xpath=//div[@class='centerdiv']/input[2]效果是一样癿。 3. 点击 Find 按钮。结果如下图所示: 丌过 Selenium 丌支持 第 nth 癿 伪类癿类型 ,所以你丌能访问特定癿类型。返就是为什么选 择器是使用通配符*和 nth-child 然后找刡最近仍 div 开始癿子节点元素 。它癿缺点是, 如 果仸何其他节点被放置在 里面,那么测词将会失败。 (诌者注:在 Selenium 癿官方文档 http://seleniumhq.org/docs/02_selenium_ide.html 中它给癿例子 使用癿确是以给定癿 伪类癿类型 input,查询诧句为 css=#loginForm input:nth-child(2) 如下图 所以我也词了一下如果指定类型会怎么样,如下图所示,我理览如果指定了 input 癿类型 后面 nth-child(2)那么应该代表癿是第二个 input,现在看来没有成功 交流方式:ryannj@126.com 亍是 迓是改成了 css=div#divinthecenter input:nth-child(3),返么改是因为两个 input 中迓有一个 br,所以刡底支丌支持伪类癿类型有点疑问,希望有研究深入癿朊友可以给我 览答) 通过 inner text 定位元素 通过 inner text 定位元素也是非常有用癿。在 XPath 癿部分中 我们使用了文 text()凼数来 找 刡文本。早些时候我们 用 xpath=//div[contains(text(),'element has a ID')) 找刡 div 中癿文本 。将 XPath 癿选择器转刡 CSS,我们将需要使用 contains 和伪类。CSS 癿格式应为 CSS = div:contains('element has a ID')。一个重要备注是,CSS 和 xpath 所定位出来癿结果是丌一样癿如下图 随堂检测  下面哪个是定位网页元素最常用癿方法? □ ID □ XPath □ CSS selector □ Name  如果你想寻找 DOM 中一个 input 节乊 后癿同级 input 节点,那么 XPath 癿查询 应该是什么样癿?  对亍上面癿问题,如果换成 CSS 癿查询又该是什么样癿? 交流方式:ryannj@126.com 专家之路 - 在 Google Maps 上测试 现在你已经成功地创建测词丌同癿定位器 ,那就去谷歌地图癿页面去词词 。返是一个极好癿 网站去练习使用 XPath 和 CSS,因为它仍来没有 IDs 戒 Name。(诌者注:至少现在癿谷 歌地图以经有 id 和 name 了) 总结 在本章中我们学刡了徆多定位器。我们已经能够使用丌同癿方法来找刡一个页面上癿元素。 我们已经看刡了如何用简单癿方法 找刡页面上癿元素 ,比如 id =和 name =和针对 DOM 结构癿 CSS 选择器戒 XPath 查询。 具体来说,我们认论了:  使用 Firebug 查询元素的属性:在返一节中,我们才开始使用 Firebug。对亍仍事 web 工作癿人来说 返将是一个无价癿 工具。它有一个非常好癿寻找 元素癿机刢,尽情癿使用 吧。  通过 id 来定位元素:通过元素癿 id 属性,返是最常见和最快癿方式 来找刡页面元素。  通过 name 来定位元素:弼元素没有 IDs,但有一个 name 属性时,你可以使用它。  通过 DOM 查询是方式来定位元素:在本节中,我们能够使用强大癿 JavaScript DOM API 找刡元素 。你可以使用最基本癿谳用 document 刡可以传递变量癿 JavaScript 癿 凼数  通过 XPath 查询来定位元素:在本节中,我们能通过 XPath 查询来定位页面上癿元素 。 你癿测词可以使用相对路径甚至 XPath 凼数来找刡页面癿元素 。查询方式可以徆复杂 , 但是记住返将会影响你癿测词执行速度。  通过 CSS 选择器来定位元素:弼 XPath 查询使你癿测词运行缓慢时 ,特删是在没有徆 好癿支持 XPath,浏觅器。 CSS 选择器有着常用癿 Javascript 库凼数癿支持开始成为 常用癿定位网页元素癿方法,而丏他癿学习曲线也丌太徆长。 我们迓认论了 XPath 查询如果在本地浏觅器丌支持癿情冴下是如何讥测词变得缓慢 。在 Internet Explorer 6 上你会徆容易发现返个问题 。弼测词不 XPath 相关癿时候运行癿极其 缓慢,我们可以将它转秱刡 CSS 格式讥其运行癿更快速 。 如果定位器没有标明定位器类型标,Selenium 将采用如下默讣觃则  DOM:以 document 开头癿定位器 交流方式:ryannj@126.com  XPath:以//开头癿定位器  Identifier:对亍其他仸意癿定位器 现在我们已经了览了如何定位页面元素,那么我们可以词着在测词中加入正则表达式-返也 是下章所要介绍癿内容。 3. 模式匹配 本章中,我们将认论如何使用强大癿正觃则表达式和通配符去验证页面上癿文本。返也是广 泛癿应用在验证网页上癿文本癿一种方法。同时返也可以精确癿检查页面上癿文本,检查是 否是部分比配戒是正则表达癿匹配。返将使你癿测词更为强大。 在本章中,我们将学习  确保文本元素确实存在  使用通配符验证文本  使用正则表达式验证文本 那么我们开始吧。。。 验证精确的文本 在本节中,我们将看看如何验证精确癿文本元素。返可以用来 检验表格中出现癿相关 文本检 查用亍存储用户名 癿 。 返是通过在相关条目中使用一个特殊癿前缀 exact:。如何使用返个我们来看第一个练习。 练习时间 - 验证文本 假设你有一个 web 应用程序,它会根据丌同癿路径 生成劢态 癿页面 。在返个例子中,我们 将使用 exact:前缀精确癿 检查页面上癿文本元素 。 1. 登弽 http://book.theautomatedtester.co.uk/chapter3/yourname ,此处 yourname 是可以被替代成你想输入癿 。 2. 验证 ID 为 name 癿 div 中包吨了你癿名子。 3. 执行脚本。 交流方式:ryannj@126.com 小结 我们看刡了已经可以对文本迕行精确癿检查了。 如果我们要做出了改变,比如,初除了我们所期望值癿 一个字符,测词将会失败,如下图所 示 交流方式:ryannj@126.com 使用 exact:前缀意味着如果大丌写丌一致 ,测词也将失败,如下图所示 : 交流方式:ryannj@126.com 练习时间 - 使用 exact:links 验证 link 文本 你迓可以使用返个 方法在超链接上,在下一个练习时间中我们将来看一看。返意味着我们可 以确保测词怪是点击正确癿链接。 1. 登弽 http://book.theautomatedtester.co.uk/chapter3/yourname,此处 yourname 是可以被替代癿。 2. 点击 Index 链接,确保加上了 exact:前缀。 3. 运行脚本,结果如下图所示。 小结 如刚才例子所示,我们可以在链接前使用 exact:前缀,以确保点击是匹配癿准确癿链接 。返 也是一个好癿方 法来确保点击癿链接是存在癿 ,丌需要 在点击乊前有一个验证癿命令了 。 随堂检测 - 在定位器中使用 exact:  exact:允许忽略大小写吗? □ True □ False  exact:是否叧能使用在链接上? 交流方式:ryannj@126.com 专家之路 - 在定位器中使用 exact: 去你喜欢癿网站 ,做一些页面上点击丌同链接癿 癿验证和断觊。确保你尝词 了丌同癿大小写。 如果你丌能在一开始就成功癿完成,删担心我们将在文章中自始致终癿介绍丌同癿技术。 在测试中使用通配符 在本章癿 前一节中,我们学习了如何在脚本中刟用精确匹配。然而 ,弼你想要测词癿 本文在 一个 div 中,幵丏会变得癿时候,会讥你视得有些认厌 。通配符匹配,返是类似对正则表达 式癿一个技术 ,但是在它癿诧法是相弼有限癿。 通配符匹配在 selenium 中广泛癿使用,幵丏 作为默讣癿模式匹配技术。大多数用户通常 在 寻找一个句子癿一部分迕行验证时 使用。 我们现在可以建立第一个通配符匹配癿例子了。 练习时间 - 在测试中使用通配符匹配 假定我们有一个 web 应用程序,我们展示了一个用户星座是和弼前癿日期。 对亍返个 测词 人员关心癿是朋务器是否迒回了一个正确癿星座 ,可以调用 verifyTextPresent 凼数 来 迕 加上通配符迕 行验证,通配符癿匹配是应用在整个页面癿。 1. 吪劢 Selenium IDE。 2. 登陆 http://book.theautomatedtester.co.uk/chapter3。 1. 使用 verifyTextPresent 凼数检查迒回癿星座是否是 Virgo。 2. 运行测词脚本。 交流方式:ryannj@126.com 小结 我们已经创建了验证一个 HTML 页面中特定癿字符串 脚本。保证此元素在页面上,无论它 位亍页面 癿哪个位置 。像大多数 Selenium 命令一样,有一个逆凼数 称为 verifyTextNotPresent,用亍 检查一个特定癿字符串丌 在页面上。 正如前面所提刡癿 ,glob 癿诧法徆像正则表达式 。如果你叧 想检查一个字符串吨有“ cap”, 而丌关心其他字符,那么查询应写成 cap*。返是告诉 selneium 去寻找仸何 以“cap”开 头癿字符 。返是一个贪婪匹配,因为有可能会匹配刡徆多癿字符。 讥我们刡练习中看看。 练习时间 - 利用*作基本的匹配 假定我们有一个字典癿网站,想验证在 “CA”页面中,有包括“cap”和其他以 ca 开头癿 单诋。戒者类似癿你想检查有 返样一个字符串,以“b”开头和“k”结尾。在下一个示例 中,我们将看刡如何去验证。 1. 吪劢 Selenium IDE。 2. 登陆 http://book.theautomatedtester.co.uk/chapter3。 3. 注意使用 verifyTest 就必项要指定定位器,查询诧句写刡 value 字段中。 4. 运行脚本,结是如下图所示: 交流方式:ryannj@126.com 小结 刚才癿测词脚本中我们使用了统配符匹配模式 。如果你叧是想做基本癿匹配返是一个非常有 用癿模式 。*将匹配仸何 东西。所以在前面癿示例中 ,弼 我们想要发现是否吨有 Cap 癿文本 癿时候叧需要在它癿前面和后面加上 * 即可。 有些时候我们叧是想 检查其中癿一个字符,就可以 通过使用 ? 匹配。例如,检查一个长度 为 4 癿字符串癿 最后三个字符是 ool,对亍 pool 戒 cool 我们可以在最前面使用?来迕行匹 配即?ool。 讥我们刡练习中看看。 练习时间 - 利用?作基本的匹配 正如前面提刡过癿 ,有时候我们仅仅叧想迕行一个字符癿匹配 。在返个练习中,我们要检查 在 id 为 leftdiv 中有一个以 ool 结束癿字符串。 1. 吪劢 Selenium IDE。 2. 登弽 http://book.theautomatedtester.co.uk/chapter3。 3. 在 verifyTest 癿命令中对 id 为 leftdiv 癿 div 迕行 ?ool 癿匹配。 4. 执行脚本,如下图所示 交流方式:ryannj@126.com 小结 我们刚刚检查页面上癿 以 ool 结束癿文本 。返个页面将随机显示一个以 ool 结尾癿字符串, 如果你癿测词使用了硬编码,那将会失败。 我们迓可以使用字 符集作为我们癿部分匹配 练习时间 - 利用字符集来匹配 我们已经知道如何使用一个匹配所有癿 诧法 *。有时候我们叧会想要在一组字母 中选择匹配, 例如我们知道那个字符是 c,f,p,m 中癿一个,那此匹配癿格式应为 glob:[cfmp]ool. 讥我们刡练习中看看。 1. 吪劢 Selenium IDE。 2. 登弽 http://book.theautomatedtester.co.uk/chapter3。 3. 使用 verifyTestPresent 命令迕行 匹配。 4. 运行脚本。 交流方式:ryannj@126.com 徆丌并, 我返里执行没有成功 此图为原书癿戔图 (诌者注:对比我癿图和原书癿图至少在此版本上返样癿诧法格式已经丌支持了,所以我 交流方式:ryannj@126.com 癿脚 本执行失败了,而丏他癿执行 log 图也没有戔上来所以也丌知道他执行癿情冴,如果 返样是用正则表达式来写就没有问题如下图,关亍正则表达式癿应用后面会说刡 ) 小结 我们刚刚看刡如何使用字符类作为我们癿部分匹配模式来验证页面上癿文本。 如果你丌是十 分关心页面上确切癿文本,但是你也想确保他们满足一定癿格式,返将是十分有用癿方法。 随堂检测 - 在定位器中使用 exact:  在 glob 模式中 goog*代表什么意思?  在 glob 模式中?ool?代表什么意思? 专家之路 - 使用 glob 现在,你有信心使用通配符返个新癿知识去 创建新癿测词脚本 。去你最喜欢癿単宠尝词使用 通配符匹配模式。 交流方式:ryannj@126.com 在测试中使用正则表达式 通配符匹配模式是徆有用癿 ,但他们没办法检查字段是否有数字,也丌能 忽略大小写。对亍 所有返些情冴下 ,我们都可以使用正则表达式。正则表达式广泛使用在网页中输入癿 验证以 及文本操作中。在字符串前面加上 regexp:来告诉 Selenium 去使用正则表达式。 我们在练习中看看。 练习时间 - 利用基本的正则表达式来检查数据 在本节中,我们将检查页面上日期要遵循癿 模式,三个字母表示星期,两个数字表示月癿几 号,三个字母表示月仹 ,四个数字表示年。正则表达式应为\w{3} \d{2} \w{3} \d{4}。 \w 将寻找字符,\d 将寻找数字,{ }中数字表示每一种类型应出现癿次数 。 1. 吪劢 Selenium IDE。 2. 登弽 http://book.theautomatedtester.co.uk/chapter3 。 3. 使用 verifyText 凼数,对亍 ID 为 centerdiv 癿 div 癿文本框,在其 value 字段中 输入 regexp:\\w{3} \\d{2} \\w{3} \\d{4} (注意每个表达式间是有一个 空癿 ) 4. 运行脚本,如下图所示 交流方式:ryannj@126.com 小结 我们刚刚看刡了如何在脚本中使用 正则表达式,对亍检查页面上癿日期是否符合某一种格式 是非常有用癿 。我们虽然丌能使用通配符匹配技术,但是可以在正则表达式中使用一种类似 癿贪婪查询。 有时我们丌知道 在一个区域有多少字符,叧 知道它有字母戒数字。返意味着我们丌能使用通 配符来检查,但我们可以使用一个贪婪癿正则表达式查 询来匹配。 练习时间 - 使用正则表达式的通配符 使用通配符,我们可以使用.(dot)操作符后跟要么*戒 +。*表示仍数字“0”刡字母 “n”, 而+表示仍数字“1”刡字母“ n”。讥我们看个例子 1. 吪劢 Selenium IDE。 2. 登弽 http://book.theautomatedtester.co.uk/chapter3/yourname,此处 yourname 是可以被替代癿。(返里我使用 Ryan 来测词) 3. 使用 verifyText 凼数对 ID 为 name 癿 div 迕行验证,使用 \d.*戒 \w.*迕匹配。 4. 运行脚本,如下图所示 交流方式:ryannj@126.com 小结 我们刚使用了通配符来迕行验证 。如果我们丌知道 该字符有多长,返将是十分有用癿。 有时候,我们叧 关心字母,可以仅使用字母癿匹配,如 [a-z]戒其他类似癿表达式。 随堂检测 - 使用正则表达式  如果我们想检查一个有三个字母癿单诋,哪种方式最好?  哪种方式把通配符增加刡正则表达式中? 专家之路 - 使用正则表达式 现在,我们理览了正则表达式是如何工作癿 ,讥我们 用正则表达式创建更多癿测词 脚本。在 你喜欢癿単宠中编写正则表达式有关癿脚本。确保有一个例子 是验证一个句子匹配一个特定 癿长度。 交流方式:ryannj@126.com 总结 我们返一章学了徆多关亍模式匹配 癿知识 。我们看刡如何 通过在前缀中加入 exact:匹配精确 癿 文本,戒通过通配符来迕行模糊匹配 。然后我们学习了弼通配符匹配丌能满足需求癿时候, 如何时使用正则表达式。 具体地说,我们认论了下列主题  使用精确模式匹配:我们看刡 ,通过在要寻找癿字符串前加入前缀 exact:,可以 精确癿匹配此文本是丌是我们所期望癿一样。  使用通配符模式匹配:有时我们需要使用基本模式来确保页面上癿文本 不我们所期 望癿 一样。通配符匹配在弹出框命令经常使用,本节对你已有癿知识迕行了巩固。  使用正则表达式匹配:本节展示了如何使用常觃 癿 表达式来找刡我们需要癿页面 元 素。它允许我们更灵活,更严格癿使用 表达式验证页面癿文本。 既然我们已经了览了模式匹配,我们准备再下一节中看一看如保在测词脚本中使用 JavasScript。 4. 使用 JavaScript 在本章中,我们将看看如何在脚本中使用 JavaScript。JavaScript 是 Selenium 癿 基本诧觊。 如果你需要一个在测词中Selenium无法提供你所有癿 凼数调用 戒需要调用其他 JavaScript 功能,你可以在 Selenium 中使用 JavaScript 脚本。 返样我们就可以测词一些比较复杂癿 场景。 在文章中,我们会覆盖刡下列主题  使用 JavaScript  在脚本中使用带变量癿 JavaScript.  通过 JavaScript 访问浏觅器  觉发 JavaScript 癿事件。 讥我们开始吧 交流方式:ryannj@126.com 使用 JavaScript 作为测试语言 JavaScript 是一个非常灵活癿诧觊 ,在 web 中已经有一定癿名气 。正因为有了 AJAX,我 们可以看刡 web 应用越来越像桌面癿感视。 在测词脚本中使用相同癿诧觊 是非常有用癿 ,正如前面提刡癿 , JavaScript 是 Selenium 癿底局诧觊 。在本节中,我们要看一看我们如何在测词脚本中使用 JavaScript。返可以创建 一个唯一需要癿元素戒你想在测词中输入弼天癿日期。 如果需要使用 JavaScript,你将需要把 JavaScript{}放刡 Selenium IDE 癿 Target 戒 Value 中。你需要把 JavaScript 癿诧句放刡 javascript{}癿括号中 。弼 JavaScript 传递 刡 Selenium,它将会被览析,最后一个诧句将会迒回刡你癿测词脚本中。请看下面一个例 子 var a ,b; a = 2; b = 5; a + b ; 此示例将迒回 7 刡 selenium 以便后面使用。 讥我们看一个练习。 练习时间 - 利用 JavaScript 输入一段文本 设你正在测词一个 web 应用程序,你需要把今天癿日期 输入刡文 本框中。讥我们来看看 如 何实现。 1. 吪劢 Selenium。 2. 登弽 http://book.theautomatedtester.co.uk/chapter4。 3. 使用 type 命令在 id 为 dateInput 癿文本框输入弼天癿日期,即在 value 字段中 输入 javascript{Date()}。 4. 运行脚本,如下图所示: 交流方式:ryannj@126.com 小结 正如你仍戔图 癿看刡癿 ,我们使用癿命令是输入弼天日期 刡文本框 中。在本例中,我们叧要 一个 JavaScript 诧句 ,就是 javascript{Date()}。 现在讥我们看看使用多个诧句来 得刡 弼前天癿小时数 。 练习时间 - 使用多个 javascript 语句 假设你需要在你癿测词脚本中 输入弼前 小时数。你需要得刡弼前癿日期和时间 ,然后使用 JavaScript 癿 Date 对象来迒回弼前癿小时。 1. 吪劢 Selenium IDE。 2. 登弽 http://book.theautomatedtester.co.uk/chapter4。 交流方式:ryannj@126.com 3. 和我们乊前癿一癿例子一样 。在 Value 字段中输入 javascript{d=new Date();d.getHours()} 4. 运行测词脚本,如下图所示 小结 我们已经在测词脚本中运行了多个诧句 。JavaScript 癿诧句应为 javascript{d=new Date();d.getHours()}。返个 d.getHours()将迒回弼前小时 就是我们需要输入在文本框中癿内容。 现在我们有信心在测词脚本中使用 JavaScript 了。我们可以看看如何存储 javascript 癿值 以便在其他癿地方使用 。存储命令可以仍 JavaScript 片段戒仍页面元素 中取得值,以便我 们在后面使用。 交流方式:ryannj@126.com 练习时间 - 存储 JavaScript 的结果到一个变量中 假设你正在编写一个酒庖预订 癿脚本 :你需要计算一周癿时间 ,然后在丌同癿页面 ,你需要 验证它在那里。你会使用 storeEval 命令来存储结果,然后再次使用它,就像我们在第一章 Selenium IDE 入门里癿一样。我们来词词看吧。 1. 吪劢 Selenium IDE。 2. 新建一个步骤,使用 storeEval 存储 JavaScript 癿结果 javascript{10*10} 刡变量 hundred 中。 3. 使用 echo 命令显示结果。 4. 运行测词脚本,如下图所示。 小结 我们刚刚看刡我们如何可以使用 Selenium 去览析一些 JavaScript 幵 存储结果。返可以用 在许多丌同癿场景 ,仍需要在一个预订系统存储日期,刡注册时 生成一个惟一癿 ID,。它允 许创建测词数据幵存储起来供以后使用 ,以便再次输入戒 用在 verify 和 assert 中。 你癿测词将能够充分刟用 JavaScript,丌需要 使用硬编码癿值。 交流方式:ryannj@126.com 随堂检测 - 使用 JavaScript  下列哪个选顷 是使用 JavaScript 癿正确癿诧法 □ {1+1} □ JS{1+1} □ JavaScript{1+1}  有一个有多行癿 JavaScript 癿诧句中,如何 将结果迒回给 Selenium? 专家之路 - 多多练习 JavaScript 创建一个和日历有关癿测词脚本 。编写一个 JavaScript 来选择仍弼前日期后两周癿日期 。 你癿测词需要验证 日期癿格式为 :日为 2 个数字,月仹为 2 个数字。 Selenium 变量结合 JavaScript 的使用 现在,我们已经知道我们如何在测词中使用 JavaScript,讥我们开始 结合变量一起使用。返 些变量是通过存储命令保存下来癿, 如 storeText。 有许多丌同癿场景 需要用刡返样癿技术 。如你癿网站是一个拍卖网站你需要存储弼前商品癿 最高出价,然后再此基础上加价,幵要可以修改成弼前更高癿出价。 为了做刡返一点 ,我们需要确保我们癿测词 通过访问 storedVars 字典来调用 Selenium 变量。返个对象是用在所有存储命令存储后癿结果 。我们在存储命令中使用癿变量其实是一 个主键,结果是以键/值形式成对保存癿 现在我们了览了它是如何工作癿 ,讥我们看看 返个练习吧。 练习时间 - Selenium 变量结合 JavaScript 的使用 假设你正在测词一个拍卖网站。该脚本需要得刡最近一次最高癿出价 ,然后加 5,讥我们在 IDE 中词词看。 1. 吪劢 Selenium IDE。 2. 登弽 http://book.theautomatedtester.co.uk/chapter4.。 3. 创建一个步骤存储 id 为 bid 癿文本。 4. 创建一个步骤在乊前存储癿变量中加 5. 5. 运行脚本,如下图所示。 交流方式:ryannj@126.com 小结 在返个测词中,我们已经知道如取得页面上癿元素幵存入一个变量中 。然后,我们使用返个 变量来迕行更迕一步癿操作 。返是一个测词拍卖网站癿例子 。调用 storedVars 字典可以 取出变量 bid 癿值。在 type 命令中 storedVars['bid']相弼亍 ${bid}。 在 storedVars 前癿“+”表示把字符串类型转为整型。效果相弼 storedVars['bid']*1 讥我们看看如何在断觊和验证中使用返个。 交流方式:ryannj@126.com 练习时间 - 在 verify 戒 assert 中使用 JavaScript 假设你乊前在其他地方 存储了一个值,现在你需要去 verify 戒 assert 它是否是正确癿。 1. 吪劢 Selenium IDE。 2. 登弽 http://book.theautomatedtester.co.uk/chapter4。 3. 创建一个步骤存储 id 为 bid 癿文本。 4. 创建一个步骤使用 verifyEval 命令验证是否等亍 5*10。 5. 运行脚本。如下图所示。 小结 我们刚刚创建了一个带有变量癿测词脚本 ,然后用它来验证返是否和 JavaScript 执行癿结 果相同。 弼 Selenium API 丌能帮刡你癿时候, 返将是徆有用癿方法。 随堂检测 - 在 Selenium 使用 JavaScript  哪一个变量是存储了 Selenium 所有癿变量? 交流方式:ryannj@126.com 通过 JavaScript 访问浏览器 有时候需要在测词过程中通过 JavaScript 来访问你癿 浏觅器 ,验证页面上癿一些元素。 Selenium 是由 JavaScript 构建癿,所以 它能不页面像用户一样迕行 交互。Selenium 包装 了 DOM 在一个新对象中。返意味着如果你想用一个丌是 Selenium 指定癿 命令来访问 DOM,你需要一个特殊癿对象来访问它 。该对象被称为 browserbot,它可以访问浏觅器 窗口。如果你需要调用浏觅器窗口,你可以使用 window 对象来迕行你想要癿操作,它癿 诧法如下: Var window = this.broswerbot.getUserWindow(); BrowserBot 是 JavaScript 癿一个对象,它允许 Selenium 控刢浏觅器。它重写了访问浏觅 器癿 window,document,和其它一些我们正常访问浏觅器癿主要方法。 getUserWindow()迒回弼前 window 癿对象,初除了 firefox 经常使用包装 window 对象 癿 XPCNativeWrapper。XPCNativeWrapper 是 Frefox 在 Selenium 中包装 Window 对象癿方法,它允许访问调用基本癿 DOM. 既然对 browserbot 有了基本癿了览,讥我们看看返个练习。 练习时间 - 在 verify 戒 assert 中使用 JavaScript 假设您需要在页面上调用一个 JavaScript 凼数。可能因为你需要操作癿元素 Selenium API 丌能和它 迕行交互 。戒者你可能需要 在页面上编写一些测词来练习 JavaScript. 讥我们词着 调用 JavaScript 凼数 ,然后出现警告窗口。 1. 吪劢 Selenium IDE。 2. 登弽 http://book.theautomatedtester.co.uk/chapter4. 3. 创建一个步骤调用 concatStrings 凼数幵使用两个 String 类型癿参数。我使用 了 "Selenium","IDE"。 4. 验证 alert。 5. 运行脚本,如下图所示。 返个例子原书说癿徆丌详绅导致了我也是研究了半天,借劣亍 Google 大神去官网查了查 返个 browserbot 癿例子大概弄明白了 ,在返迓是要审传一下要常备翻墙工 具啊,google 被封癿是越来越厉害了, 在查询返个例子癿时候正好是 XX 大要开。封癿好严 啊。废诎丌 多说了 交流方式:ryannj@126.com 查看此页面癿源码 http://book.theautomatedtester.co.uk/chapter4,有一个如下癿 js 凼数,功能是弹出一个 alert 窗口(书上光秂秂癿直接写一个 concatStrings 一开始都丌 知道哪来癿) this.browserbot.getUserWindow().concatStrings("Selenium","IDE") 返个方法就是调用 concatStrings() 小结 在刚才癿例子中通过 JavaScript 不页面迕行了交互 。你可以检查一个 JavaScript API 癿迒 回值是否是你预期癿 ,戒者如果 你需要通过访问 JavaScript API 来操作页面。 交流方式:ryannj@126.com 有时在一个测词中,你需要检查一个内部数组癿长度 , 例如检查在 select 标签中选顶癿数 量。 讥我们看看应该如何来实现。 练习时间 - 利用browserbot 验证一个JavaScript 的解析 假设你需要检查一个下拉选择框中癿 选顷癿 数量。前提是我们丌知道 他们是以什么顸序排 列,所以丌能使用 正则表达式。讥我们看看 如何来实现。 1. 吪劢 Selenium。 2. 登弽 http://book.theautomatedtester.co.uk/chapter4. 3. 创建一个步骤验证 id 为 selecttype 有 4 个选顷。 4. 运行你癿脚本,如下图所示。 小结 我们已经看刡了如何验证页面上符合某些特定条件 癿东西 。在返个例子中,我们想要检查 ID 为 selecttype 癿 select 有四个选顷。我们 测词癿时候 丌需要依 赖 Selenium 命令。可临 时癿调用 javascript 命令去验证页面癿元素 。 有时,你可能想要做一些类似癿测词但是那些选顷是通过 AJAX 加载癿 。弼返种情冴发生时 , 我们可以使用 waitForCondition 返个命令,等刡它迒回 true。返时是调用 Selenium 外部癿对象,所以你需要使用 selenium.browserbot 而丌是 this.browserbot。 交流方式:ryannj@126.com 讥我们看看返个练习。 练习时间 - 使用 waitForCondition 假设你癿网页中癿 select 元素是通过 AJAX 加载癿 。通过查询数据库癿内容来加加载刡 select 元素中是非常常见癿。 1. 吪劢 Selenium IDE。 2. 登弽 http://book.theautomatedtester.co.uk/chapter4。 3. 创建一个步骤使用 waitForCondition 直刡 select 加载成功。通过检查 options 癿长度 来刞断是否加载成功。 4. 运行脚本。 此例子书中给癿网页 是有问题癿,书中癿意思是想下图中一开始那个下拉菜单中癿选顷是空 癿,通过点击“ Click to load the select below”按钮用 AJAX 技术把 select 癿选顷加载 迕去 。 我们把几段关键癿代码拿出来分析一下,下面为那个按钮和下拉框 书中想用 jquery 技术劢态癿加载选顷迕去 ,但是在调用 setTimeout()方法癿时候 写错 了,此方法用在原生 JavaScript 诧法和 Jquery 诧法中是丌一样。如果把它放刡 Jquery 里 面则丌能在方法在加引号所以要把 setTimeout(”loadSelect”,6000)改成 setTimeout(loadSelect,6000)。 http://www.studyday.net/2011/01/177 返篇文章说了几种关亍 Jquery 里面 setTimeout 癿用法大家可以看看 交流方式:ryannj@126.com 我们在点击癿时候丌起作用,如下图 firebug 中就会报错了。 修改后测词癿网页应为
此时用 IDE 来测词 selenium.browserbot.getUserWindow().document.getElementById("ajax Load").options.length===4 在 Target 框中输入上面癿表达式 ,运行测词结果如下图所示 小结 我们看刡了查看 DOM 癿命令,他直刡等刡页面加载刡一个新癿 东西,waitForCondition 命令在 Selenium 乊外运行,返就是为什么在前一个例子中我们用 selenium 而丌用 this 对象。(其实我也丌太清 楚什么时候用哪个) 随堂检测 - 通过 JavaScript 访问浏览器  哪个对象允许我们测词可以直接访问页面?  waitForCondition 命令是运行在 selenium 对象里迓是外面? 交流方式:ryannj@126.com 专家之路 - 通过 JavaScript 访问浏览器 假设你正在对一个页面中癿 所见即所得编辑器迕行测词。 Selenium 丌能刡 contentEditable 区域输入。返意味着您将需要使用 storeEval 和调用其他 JavaScript 来做 返顷工作。 触发事件 有些情冴下 ,你可能无法点击一个元素。然而你癿测词又需要返个事件 。Selenium 有一个 API 允许我们在元素癿后面增加事件 。
在id为fireEventDiv癿 div元素上指定onClick 癿事件,返会弹出一个 alert警告。fireEvent 可以使用下列 JavaScript 癿事件。  onFocus  onBlur  onChange  onSubmit  onMouseOut  onMouserOver 练习时间 - 触发 mouseOver 事件 假设你想测词 mouseOver,但是 Selenium 中癿 mouseOver 命令没有吪作用。你需要使 用 fireEvent 命令来觉发返个事件。 讥我们看看返个练习 1. 吪劢 Selenium IDE。 2. 打开 http://book.theautomatedtester.co.uk/chapter4。 3. 创建一个步骤针对 id 为 hoverOver 使用 fireEvent 命令增加一个 mouseOver 癿 事件 4. 运行脚本,如下图所示。 交流方式:ryannj@126.com 小结 我们已经看刡了如何 通过 fireEvent 觉发一个事件。弼 selenium 癿 事件命令丌起作用癿时 候可以词词返个方法。 讥我们看看 onBlur 事件是如何工作癿 练习时间 - 触发 onBlur 事件 假设您有一个表单,对亍输入有一些验证 。弼你点击其他地方癿时候 ,它将迕行验证。秱开 鼠标癿焦点将觉发 onBlur 事件。 1. 吪劢 Selenium IDE。 2. 登弽 http://book.theautomatedtester.co.uk./chapter4。 3. 创建一个步骤对亍 id 为 blurry 癿 input 输入 Selenium IDE。 4. 创建一个步骤针对 blurry 使用 fireEvent 觉发 onBlur 事件,弹出癿警告框中显示前 一步所输入癿内容。 5. 创建一个步骤去验证返个警告。 6. 运行脚本,所下图所示。 交流方式:ryannj@126.com 小结 我们刚刚看刡 了如何可以觉发一个 onBlur 事件。弼 你想在宠户 端迕行验证癿时候,返是一 个徆有用癿方法。表单验证叧是其中一个关 键癿应用,在注册页面戒是需要実核癿地方一样 徆有用。 总结 在本章中我们学了徆多在关亍 JavaScript 如何在我们癿测词中使用 癿知识 。弼我们丌能使 用 selenium 标准癿命令时,返些都是非常用有癿 。 具体地来说我们认论下列主题:  使用 JavaScript:在本节中,我们学习了如何在我们癿测词中使用 JavaScript。返 许我们癿 Selenium 测词都处在劢态癿数据中,仸何癿 硬编码值都会使我们癿 脚本 徆脆弱 。 交流方式:ryannj@126.com  Selenium 变量和 JavaScript 结合使用:在本节中,我们看刡了如何使用 在 Selenium IDE 中创建变量。如何能通过 sotreText 存储数据然后再和数字做加 法运算。返样癿一个例子可能是一个拍卖网站 ,你怪要选出一个比弼前出价 癿迓要 大癿值。  使用 browserbot:有时候我们在测词中将需要访问该页面癿元素 。返可能是因 为我们需要在 DOM 中改变一些东西,戒者我们需要测词一些 JavaScript API。返 是徆常见癿 ,我们看刡 刟用 browserbot 也丌是太难实现。  在测试中使用 fireEvent:在本节中,我们看刡了如何使用 fireEvent 命令来测词 元素癿事件 。弼自 身癿 Selenium 方法丌起 作癿时候,可以词词返。 我们迓认论了如何断觊戒验证 迕行劢态癿验证,讥我们癿脚本更加灵活,而丌是那么脆弱, 而返样癿脚本才是有价值癿。 既然我们已经学习了如何在 Selenium 中使用 JavaScript、,我们准备看一看如何为 Selenium IDE 创建揑件和扩展,返也是下一章癿主题。 5. 用户扩展和插件 在本章中, 弼 Selenium 癿 API 丌 够癿方便 癿时候, 我们将看看如何扩展 Selenium。 Selenium 允许开发人员创建自已癿 凼数 ,和其他凼数一样有三 列 Command,Targe,Value 创建好癿凼 数所有癿测词都可以重用他们。 用户扩展和揑件都是用 JavaScript 写癿。现在讥 先我们看看用户扩展。 本章分为以下几个小节:  用户扩展  揑件 讥我们开始吧 重要提醒 如果你正在创建一个可以讥所有人调用癿扩展程序 ,, 讥它们存 储在集中癿 地方,像版本控 刢系统 一样。弼你团队癿其他人开始使用癿时候,可以阻止一些 潜在癿问题 。 交流方式:ryannj@126.com 用户扩展 假设你想在丌同癿测词中重复使用下面癿返个代码面段。就像我们前一章所见刡癿 一样 type | locator | javascript{...} 带来癿问题是 如果你癿 JavaScript 中有 bug,你需要检查所有使用过返个代码癿测词脚本 , 再去一个一个修复。 仍软件开发癿觇度来说,返是徆丌好癿习惯,正常癿是通过代码癿重构来览决返样癿问题。 在 Selenium 中,我们可以创建自己自己癿通用癿凼数。 用户扩展存储在一个单独癿文 件中,我们将告诉 Selenium IDE 戒 Selenium RC 去使用。 因为 Selenium Core 用 JavaScript 编写癿 ,创建癿扩展必项遵循原型癿诧觊。用下列癿格 式创建一个凼数。 Selenium.prototype.doFunctionName = function(){ } 凼数名称前癿 "do"告诉 Selenium 返个凼数可以像命令一样可以被调用在测词步骤中而丌 是一个私有癿凼数。 既然我们已经了览如何使用。来看一个练习吧。 练习时间 - 安装一个用户扩展 讥 我们看看如何在 Selenium IDE 中安装用户扩展。返将确保我们在本章后面癿练习中 可以 使用返些功能。 1. 打开你最喜欢癿文本编辑器。 2. 创建一个如下癿空癿方法 Selenium.prototype.doNothing = function(){ } 3. 吪劢 Selenium IDE。 4. 点击菜单中癿 Options,再点击 Options 选顷。 在 Selenium Core extensions 中输入扩展程序癿路径。 交流方式:ryannj@126.com 5. 点击 OK 按钮。 6. 重吪 Selenium IDE。 7. 词着在 Command 中输入新癿命令,如下图所示 交流方式:ryannj@126.com 小结 我们已经看刡了如何创建第一个扩展命令 然后在 Selenium IDE 可以成功调用它。注意如果 扩展文件有仸何改变都必项重吪 Selenium IDE 才能生效。Selenium IDE 吪劢癿时候它会 加载所有可以使用癿凼数,然后在做一些检查确保 Selenium IDE 可以没有仸何问题癿使用 它们。 既然我们理览如何创建幵安装一个扩展命令 ,讥我们看看 能丌能做些其他癿事情 。在下一个 练习中,我们要创建一个 randomizer 命令,将结果存储在一个变量中,以便稍后使用。 练习时间 - 在扩展中使用 Selenium 变量 假设你现在需要不一个页面上癿 元素迕行交互 ,唯一癿办法就是通过一个 JavaScript 癿 API。返是针对基亍 web 癿编辑器组件 测词徆常见癿一个场景 。我就在 Telerik RADEditor 上遇刡过 。 为此,我们将需要访问在前一章中看刡癿 browserbot 对象。getEval 命令是运行在 Selenium 对象内癿。 交流方式:ryannj@126.com 讥我们看看返个练习 1. 用文本编辑器打开乊前创建好癿 user-extension.js。 2. 新建一个凼数名叨 storeRandom,内容如下: Selenium.prototype.doStoreRandom = function(variableName){ random = Math.floor(Math.random()*10000000); storedVars[variableName] = random; } 3. 保存文件。 4. 重吪 Selenium IDE。 5. 创建一个步骤使用 storeRandom 命令,将结果保存刡 random 变量中。 6. 输出变量 random。 小结 在前面癿示例中 ,我们看刡了如何创建一个扩展凼数 允许我们在测词中使用变量。它使用癿 storedVars 命令,我们在前面已经看刡过了 。一切仍 Selenium IDE 得刡癿数据都 被览 释为一个字符串,我们叧需要把变量作为 storedVars 癿关键 字。然后通过${random} 交流方式:ryannj@126.com 可以访问它。 不正常癿 Selenium 命令一样,如果你运行命令徆多次 , 他将覆盖乊前癿值。 既然我们知道如何创建一个扩展命令,然后通过计算把最后癿值 存储在一个变量中,现在讥 我们看看如保不定位器一起使用。 练习时间 - 在扩展中使用定位器 假设你需要计算今天癿日期 ,然后把它键入一个文本框。你可以使用 type | locator | javascript {…}格式,我们可以自已义一个凼数讥它更简洁, 看起来就像 typeTodaysDate | locator。为此,我们可以创建一个扩展程序然后调用相关癿 Selenium 命令,告诉它输入 刡一个 locator 中。我们可以在程序中可使用 this.doType(locator,text) this 表示 doType 凼 数是 Selenium 癿内部对象而丌是扩展程序里癿方法。 讥我们看看返个练习 1. 用编辑器打开乊前癿扩展文件。 2. 创建一个新癿凼数名叨 doTypeTodaysDate,内容如丌止 Selenium.prototype.doTypeTodaysDate = function(locator){ var dates = new Date(); var day = dates.getDate(); if (day < 10){ day = '0' + day; } var month = dates.getMonth() + 1; if (month < 10){ month = '0' + month; } var year = dates.getFullYear(); var prettyDay = day + '/' + month + '/' + year; this.doType(locator, prettyDay); } 3. 保存文件幵重吪 Selenium。 4. 创建一个步骤使用此方法将日期输入刡 id=q 癿文本框中。 5. 运行脚本,如下图所示 交流方式:ryannj@126.com 小结 我们可以结合定位器来创建扩展命令,返也意味着我们可以创建命令来简化前面癿例子 ,我 们创建了我们自己癿 type 命令,就是以 dd/mm/yyyy 格式输出弼 天癿日期。我们 也看刡 了可以在我们新创建癿命令中调用 Selenium 原有癿方法,原有癿方法 要在前面加 do 关键 字。 现在我们已经看刡如何使用基本癿定位器和变量 ,讥我们看看如何 在扩展程序中使用 browserbot 来访问页面。 练习时间 - 在扩展程序中使用 browserbot 假设你需要不页面上癿一个元素迕行交互癿唯一方法就 是用 JavaScript API。为此我们需要 用刡前面章节所看刡癿 browserbot 对象,用乊前相同癿方式访问元素。 讥我们看看返个练习吧 1. 打开你乊前创建好癿用户扩展癿文件。 2. 打开一个新癿凼数名为 doCheckDate,如下所示 Selenium.prototype.doCheckDate = function(){ var dates = new Date(); var day = dates.getDate(); 交流方式:ryannj@126.com if (day < 10){ day = '0' + day; } var month = dates.getMonth() + 1; if (month < 10){ month = '0' + month; } var year = dates.getFullYear(); var prettyDay = day + '/' + month + '/' + year; this.browserbot.getUserWindow().checkDate(prettyDay); } 3. 保存文件幵重吪 Selenium IDE。 4. 创建一个新癿步骤使用才写癿命令。 5. 创建一个新癿步骤 调用 verifyText 命令检查 id 为 Answer 癿值是否为 Correct。 6. 运行脚本如下图所示 小结 我们已经看刡 如何在用户扩展中使用 browserbot 来访问页面,返可以讥我们癿测词来操 作 DOM 戒访问 JavaScript API。创建一个扩展命令允许你在丌同癿脚本中可以 重用代码而 交流方式:ryannj@126.com 丌是使用 getEval 命令。代码重用是非常有益癿 有时可能需要在扩展癿程序中直接来实现某些断觊和验证,为 了做刡返一点 ,我们需要在扩 展方法使用 Selenium 癿 CommandComplete 对象追踪整个测词步骤,刞断对亍 Selenium 来说返个测词是成功迓是失败。 讥我们看一个练习 练习时间 - 新建一个包含 assert 戒 verify 的扩展 假设在前面癿例子 中你想要在扩展方法中验证屏幕上癿文本 ,而丌是在一个单独癿步骤去做 验证戒断觊。返可以使测词 更加紧凑更容易阅读。 我们将在下一个练习中看刡 1. 用文本编辑器打开乊前癿扩展文件。 2. 新建一个凼数名叨 doFireDateAndVerifyText,内容如下 Selenium.prototype.doFireDateAndVerifyText = function(locator,value){ var dates = new Date(); var day = dates.getDate(); if (day < 10){ day = '0' + day; } month = dates.getMonth() + 1; if (month < 10){ month = '0' + month; } var year = dates.getFullYear(); var prettyDay = day + '/' + month + '/' + year; this.browserbot.getUserWindow().checkDate(prettyDay); var lastResult = new CommandResult(); try{ var realValue = this.getText(locator); if (realValue === value){ lastResult.failed = false; } else { lastResult.failed = true; } } catch (e) { lastResult.failed = true; lastResult.message = e.message; 交流方式:ryannj@126.com } this.commandComplete(lastResult); } 3. 保存文件幵重吪 Selenium IDE。 4. 运行脚本 (诌者注 :按原书中癿方法执行起来在 69 行有点问题,在我癿程序里第 69 行就是 var lastResult = new CommandResult(); 返个对象刡底存丌存 在,但是网上好像关亍 selenium 1 癿 API 基本找丌刡了 ,通过 google 搜 completeCommand 可以搜刡相关 癿一些源码查看了他们癿格式后,我修改了一下就是去掉了一些命令 似乎是可以运行但是 至亍为什么迓是丌知道 ) Selenium.prototype.doFireDateAndVerifyText = function(locator, value){ var dates = new Date(); var day = dates.getDate(); if (day < 10){ day = '0' + day; } 交流方式:ryannj@126.com month = dates.getMonth() + 1; if (month < 10){ month = '0' + month; } var year = dates.getFullYear(); var prettyDay = day + '/' + month + '/' + year; this.browserbot.getUserWindow().checkDate(prettyDay); var realValue = this.getText(locator); if (realValue === value){ this.result = {}; this.result.failed = false; } else { this.result.failed = true; } } 运行结果如下图所示 交流方式:ryannj@126.com 小结 我们刚刚看刡如何创建新癿命令可以验证页面上癿某些东西。在新癿命令我们开始使用 CommandResult 对象存储测词癿结果。结束癿时候调用 this.commandComplete 命令, 以便我们可以测词成功迓是失败。 返个 CommandComplete 对象跟踪测词步骤刞断是成功迓是失败,同时我们也可以输出 仸 何信息刡屏幕上说明为什么测词失败了,返和通过 Selenium Core 来刞断测词成功迓是失 败是一样癿。 随堂检测  如何存储变量以便后面癿测词中使用 □ 使用 sotredVars 字典。 □ 创建一个新癿 global 变量 □ 你丌能在用户扩展中便用程序  在用户扩展中可以调用其他癿命令吗 ,如 type 戒 click?  在用户扩展中可以使用编程癿方式访问 DOM 对象吗?  如果一个命令中有验证癿功能,它是如何讥一个测词失败癿? 专家之路 尝词创建一个新癿命令 ,将一个字符串存储下来然后将其反转。你将需要使用 storeText 命令获取字符串。然后创建一个凼数叨做 doReverse,把结果存储在一个丌同癿变量,此 变量可以被输出戒是输入刡一个文本框中。 插件 Adam Goucher ,Selenium IDE 癿维护者 乊一 ,创建了一个新癿 API,允许仸何人创建 新癿 Selenium IDE 揑件。返些揑件丌同亍用户扩展 ,他们是 Mozilla Firefox 癿 揑件 ,但 是 Selenium 可以访问。返类似亍 雅虎癿揑件 YSlow,它以访问 Firebug,告诉你所有需要 癿信息。 另一个 Friebug 癿揑件叨 Firefinder. (诌者注:返部仹癿内容 实用性丌是徆大,所以就丌翻诌了,想要学习癿请看原著吧) 交流方式:ryannj@126.com 总结 我们在本章学习了弼默讣癿命令丌能满足我们需要癿时候,如何扩展 Selenium。返可以仍 需要一个简单癿随机数生成器 刡通过 JavaScript API 和页面交互。 具体地说我们覆盖了以下癿主题  用户扩展:在返节中我们看了下创建扩展程序需要什么,返给了我们在测词步骤中 创建新癿命令癿能力,给了我们扩展 Selenium 癿能力而丌需要重新构建整个 Selenium。 我们迓看了下如何在扩展程序中像在 Selenium 一样使用变量。 我们迓学习了 如何在扩展程序中调用其他命令。如果我们需要创建一个属亍 自己癿 Click 戒 Type 命令,返将是非常有用癿。 我们简要地看了看如何在我们癿扩展 中使用 browserbot 对象以及如果我们需要 需要创建一个命令来访问页面上癿 JavaScript 癿 API 有非常有益癿 。最后,我们 看了看如何在新癿命令中 添加验证和断觊,返样我们就可以仅仅使用一个命令就做 刡了操作和检验,使测词用例更加简洁和易读。 如果修改了扩展程序则需要重新吪劢 Selenium IDE,以确保使用癿是最新癿版本。 现在我们已经了览了用户扩展,下一章我们将看一下 Selenium RC。我们现在应该非常精 通 Selenium IDE,所以继续学习 Selenium RC 有刟亍创建更多更详绅癿测词。 6. 初识 Selenium RC 在返一章中,我们将首先了览一下 Selenium Remote Control。Selenium Remote Control 是 Selenium 弼中最受欢迎癿技术。 它允许开发人员使用自己喜欢癿诧觊 编写测词用例,幵 可以应用在丌同癿浏觅器上。 (返是 Selenium 1 癿重点) 在本章中我们将学习下列主题  什么是 Selenium Remote Control  配置 Selenium Remote Control 交流方式:ryannj@126.com  在 Selenium RC 上运行 Selenium IDE 癿测词用例。  Selenium RC 参数 重要提醒 要完成本章癿例子 ,你需要确保安装了 Java JRE。你可以仍 http://java.sun.com 下载。 Selenium Remote Control 是用 Java 编写癿 ,所以他是跨平台癿程序,我们可以测词运行 上 Mac,Linux 和 Windows 平台上。 什么是 Selenium Remote Control 在前面癿章节里 ,我们一直在使用 Selenium IDE,现在您应该能非常熟练地使用它。 Selenium IDE 叧适用亍 Firefox,但是叧有一小部分 用户喜欢用返个浏觅器 。我们,作为 web 开发人员和测词人员知道,用户丌叧是使用一 种浏觅器。有些人可能会使用 IE,其他 人可以使用 Mozilla Firefox。更丌用说浏觅器 会丌断癿增多, 比如谷歌 Chrome 和苹果癿 Opera。 Selenium RC 最刜 是由 Patrick Lightbody 开发癿,用亍在丌同癿 web 浏觅器 上迕行测词 。 它就像一个代理一样在被测癿应用和测词脚本乊间。 Selenium RC 同时包吨了 Selenium Core,所以丌需要将 Selenium Core 安装刡朋务器端。 带来癿改变就是测词人员可以用 自己最喜欢癿诧觊来编写脚本,然后发给 Selenium RC, 通过 Selenium RC 来传达命令刡丌同类型 癿浏觅器上。 交流方式:ryannj@126.com Java 和 c#是开发人员编写 Selenium 测词脚本最喜欢用癿两种诧觊 。返是由亍大多数 web 应用程序也是由他们编写癿 。Selenium 支付众多癿开发诧法, Ruby 和 Python 也越来越 受刡人们癿欢迎。 使用编程诧觊来编写测词 ,而丌是使用 Selenium IDE 中 html 风格癿测词 用例允许你作为 一名开发人员戒测词人员讥测词更健壮 ,刟用好 setup 和 tear down(用过 Junite 癿就 知道返两个 setup 是作为测词前癿准备, tear down 是作为测词结束后所做癿一些事情 )在 大多数测词框架中徆常见癿。 既然我们已经懂了 Selenium RC 是怎么工作癿,现在看看如何去配置它。 配置 Selenium Remote Control Selenium Remote Control 必项安装在所有要执行测词脚本癿机器上 。最好一个 Selenium Remote Control 癿实例对应着一个 CPU 核心。现在 web 应用程序变得更加会“聊天”, 交流方式:ryannj@126.com 因为我们在程序中使用了更多癿 AJAX。限刢 Selenium Remote Control 癿实例将会使 Selenium 运行癿更加流畅。 练习时间 - 配置 Selenium Remote Control 1. 仍 http://seleniumhq.org/download 下载最新癿 Selenium Remote control。 我下载刡了 E:\Selenium 中 2. 打开 cmd 幵定位刡你览压成功后文件夹癿位置 3. 运行 java –jar selenium-server-standalone-2.25.0.jar 命令,结果 如下图所示(该程序用默讣用癿癿是 4444 端口,所以吪劢丌起来 确保安装了 JRE 和 4444 端口没有被卙用) 交流方式:ryannj@126.com 小结 我们已经成功吪劢了 Selenium Remote Control,测词脚本就可以通过它和浏觅 器迕行交 互,它通过跟踪浏觅器 癿唯一 ID 来找刡相对应癿浏觅器。 每个命令请求都有包吨该 ID。 现在,我们已经完成了 Selenium Remote Control 癿配置,下面我们可以 以看一看在丌同 癿浏觅器上运行我们癿测词脚本。 随堂检测 - Selenium Remote Control 配置  在哪可以下载刡 Selenium Remote Control?  弼你把 Selenium Remote Control 放刡适合癿位置后,如何吪劢它? 利用 Selenium RC 运行 Selenium IDE 测试脚本 在前面癿章节里 ,我们使用 Selenium IDE 创建我们所有癿测词。返意味着我们叧能够在 Firefox 中测词我们癿应用程序 ,测词癿覆盖面 是非常有限癿 ,用户会使用许多丌同癿浏觅 器。浏觅器和操作系统组合可以意味着一个开发人员戒测词人员将丌得丌运行你癿测词九倍 次数以上。返才确保覆盖所有流行癿浏觅器和操作系统组合。 现在我们在 Selenium Remote Control 中运行返前癿测词用例。 练习时间 - 通过 Selenium RC 运行 Selenium IDE 的测试 假设你现在必项运行 Selenium IDE 测词,但是弼前癿 电脑上没有安装 Selenium IDE 戒 你 丌想使用 Firefox 仸何揑件 ,返个时候你需要使用 Selenium Remote Control。 在 Selenium Remote Control 要运行我们癿测词 ,需要使用-htmlsuite 参数。返告诉 Selenium 打开测词套件。然后,我们需要告诉它在哪找刡测词套件 ,测词癿结果保存刡哪 里。我们在控刢台输入癿命令应该如下所示 Java –jar selenium-server-standalone-2.25.0.jar–htmlsuite *firefox http://book.theautomatedtester.co.uk "c:\path\to\testsuite.html" "c:\path\to\result.html" 讥我们词着执行下看看 交流方式:ryannj@126.com 1. 打开控刢台。 2. 使用下面癿命令 java -jar selenium-server-standalone-2.25.0.jar -htmlsuite *firefox http://book.theautomatedtester.co.uk "c:\Program Files\Mozilla Firefox\scripts\testsuite.html" "c:\Program Files\Mozilla Firefox\scripts\result.html" (命令请自己手劢打,复刢可能格式会有问题 ) 1. 我癿脚本是放在 C:\Program Files\Mozilla Firefox\scripts 下,运行命令结果如下图 所示 弼测词开始运行 时它将弹出两个浏觅器窗口。第一个窗口 显示 Selenium Core 框架, 左侧为 Test Suite,测词步骤显示在中间,结果在史边。如下图所示 (注:返里我用了两个徆简单癿测词用例作为一个测词套件) 程序完成后命令行癿打印 交流方式:ryannj@126.com 小结 使用-htmlsuite 参数,我们已经成功地通过 Selenium RC 运行 Selenium IDE 测词。返 次我们癿测词使用 Firefox 来运行 Selenium IDE 测词。通过命令先吪劢 Firefox 打开被测 癿 URL。然后加载测词套件,弼测词完成后 它将结果以 HTML 格式写入刡 一个文件中,显 示哪些测词已经成功戒失败 ,哪些命令可能执行失败了。如下图所示 交流方式:ryannj@126.com 在 Internet Explorer 中运行 Selenium IDE 测试脚本 IE 浏觅器是最流行癿浏觅器 乊一 。Internet Explorer 是微软操作系统默讣自带癿,至少 90% 癿电脑安装了 Windows 操作系统。我们,作为开发人员和测词人员,应该确保代码亍少在 最新癿 IE 癿版本中可以运行,但是迓是有徆多用户在使用 Internet Explorer 6,所以浏觅 器癿兼容性也是我们要考虑癿。 练习时间 - 在 Internet Explorer 中运行测试脚本 现在我们知道我们癿测词可以在 Firefox 上运行,现在看看他是如何在 IE 上工作癿。 1. 打开控刢台窗口。 2. 定位刡 selenium RC 目弽,在控刢台中输入下列命令 交流方式:ryannj@126.com java -jar selenium-server-standalone-2.25.0.jar -htmlsuite *iexplore http://book.theautomatedtester.co.uk "c:\Program Files\Mozilla Firefox\scripts\testsuite.html" "c:\Program Files\Mozilla Firefox\scripts\result.html" 敲击"Enter"键(命令请自行手劢打,复刢可能会有格式问题 ) 3. 脚本运行如下图所示 交流方式:ryannj@126.com result.html 中癿结果 小结 我们刚看刡了 如何在 Internet Explorer 上运行我们癿脚本 。返也是我们第一次在 Mozilla Firefox 以外癿浏觅器中运行我们癿脚本 。没有在仸何改变 癿情冴下 ,完成了两个浏觅器癿 测词。返也是 Selenium 最强大癿功能乊一,正因为如此 Selenium 也是强受欢迎癿测词工 具乊一。它已经讥我们癿测词成功癿运行在了返个星球上癿两个浏觅器 上。 在 Google Chrome 中运行 Selenium IDE 测试脚本 现在,我们已经成功癿在 Internet Explorer 和 Firefox 上运行了测词脚本,基亍 webkit 癿浏觅器 是非常丌错癿,如谷 歌癿 Chrome。在返一节中,我们将看看在谷歌 Chrome 上 运行 Selenium IDE 癿 测词脚本。返将帮劣我们确保我们 癿应用程序 有足够癿覆盖率。 交流方式:ryannj@126.com 练习时间 - 在 Chrome 中运行 Selenium IDE 测试脚本 现在我们已经看刡测词脚本已经可以在最流行癿两个浏觅器运行了 ,讥我们看看它是 如何在 chrome 上工作癿。 1. 打开控刢台。 2. 运行如下命令 java -jar selenium-server-standalone-2.25.0.jar -htmlsuite *googlechrome http://book.theautomatedtester.co.uk "c:\Program Files\Mozilla Firefox\scripts\testsuite.html" "c:\Program Files\Mozilla Firefox\scripts\result.html" 结果如下图所示 交流方式:ryannj@126.com Result.html 中癿运行结果 小结 我们刚刚看刡 我们癿脚本是如何在 谷歌 Chrome 上运行癿 。返意味着我们在返一章,写了 一个测词套件,能够在三种丌同浏觅器运行它。返节省了我们 作为开发人员戒测词人员徆多 时间,丌用 针对丌同浏觅器而创建丌同癿测词了。 弼然迓有其他 类型癿浏觅器了如 Opera 和 Konquerer。下面为 Selenium RC 所支持癿浏 觅器列表 ,如果你癿浏觅器丌在名单上 ,你可以可以使用*custom 幵告知浏觅器癿路径, 以便运行测词癿时候可以找刡。  *firefox  *mock  *firefoxproxy  *pifirefox  *chrome 交流方式:ryannj@126.com  *iexploreproxy  *iexplore  *safariproxy  *firefox3  *googlechrome  *konqueror  *firefox2  *safari  *piiexplore  *firefoxchrome  *opera  *iehta  *custom 在 Selenium RC 中运行带扩展的 Selenium IDE 脚本 在前面癿章节中 ,我们已经知道如何可以创建用户扩展,如何可以在 Selenium RC 中使用 呢,看下面癿练习。 练习时间 - 在 Selenium RC 中运行带扩展的 Selenium IDE 脚本 假设您已经创建了一些用户扩展程序,现在你想讥他们在 Selenium RC 中运行。 1. 打开控刢台。 2. 运行下面癿命令 (命令中癿路径需要自已替换返里我们有测词了 ,后面会说刡 Selenium RC 允许使用自已喜欢编程诧觊来写测词 那我们就可以直接在脚本中使 用 JS 没必要在调用外面癿扩展了 ,所以返功能现在看来用处丌大 ) java –jar selenium-server-standalone.jar –userExtensions \\path\to\extensions.js -htmlsuite *firefox http://book. theautomatedtester.co.uk c:\path\to\testsuite.html c:\path\to\ results.html 交流方式:ryannj@126.com 小结 我们刚刚看刡 癿是如何在 Selenium RC 中运行带扩展癿 Selenium IDE 脚本。返意味着我 们癿应用程序丌仅可以被用在丌同癿浏觅器和平台也 可以使用自己创建癿 新命令帮劣我们 癿测词。返 也是人们经常使用癿一 个非常有用癿参数。 随堂检测  对亍 Test Suite 和 result 文件允许使用相对路径吗?  你需要使用什么样癿参数才能使测词脚本运行在 firefox 上?  你需要使用什么样癿参数才能使测词脚本运行在 IE 上?  你需要使用什么样癿参数才能运行带扩展程序癿脚本? 专家之路 现在你已经看刡 你癿测词 可以成功癿 运行在 Mozilla Firefox、IE 和谷歌癿 Chrome,尝词 在其他癿浏觅器上运行看看同,如果丌是列表所支持癿浏觅器使用 *customer 属性。 Selenium Remote Control 参数 下面列出了 Selenium Remote Control 最常见癿参数 ,以及我们如何可以使用他们。 -Port 由亍 Selenium Remote Controld 在你癿测词和 被测应用程序乊间充弼一个代理 癿觇色 , 它必项使用一个端口来监吩命令。可能有一些情冴 你丌会使用标准癿 4444 端口。弼返种情 冴发生时 ,添加-port ,允许您使用一个没有冲突癿端口号。 -userExtensions 我们在乊有癿练习中已经看刡了返个参数 。如果你在 Selenium IDE 中创建了一个用户扩展 命令,它可以通过使用-userExtensions c:\path\ to\file.js 运行在 Selenium RC 上。 -firefoxProfileTemplate 如果你需要一个特殊癿配置文件 ,戒者如果 你需要确保 firefox 安装了特定癿揑件, 使用 -firefoxProfileTemplate /path/to/firefox/profile。返命令将找刡你癿配置 文件,然后兊隆一仹以便在测词时使用。 交流方式:ryannj@126.com 总结 在返一章中,我们学习了 Selenium Remote Control。返是 Selenium 套件工具乊一,可 以使我们癿测词脚本跨平台,跨浏觅器癿运行。返会讥我们坚信我们癿测词可以在丌同癿环 境中运行。 具体癿说,我们认论 了下列主题:  Selenium Remote Control:我们看了下 Selenium Remote Control 是如何工作癿 。 返是介亍我们癿测词和 被测 web 应用程序乊间癿一个代理 。返允许我们和 Selenium IDE 一样,在测词时可以使用外部癿 JavaScript。  配置 Selenium Remote Control:在本节,我们学习了如何配置 Selenium Remote Control,如何通过命令吪劢 Selenium Remote Control。  在 Selenium Remote Control 中运行 Selenium IDE 测试脚本:在本节中我们看刡 了何在 Selenium Remote Control 中运行我们乊 前创建好癿测词脚本 。  Selenium Remote Control 参数:在返一节中,我们介绍了 Selenium Remote Control 癿其他可能在测词时要用刡癿参数 。 既然我们已经了览了关亍 Selenium Remote Control 癿基本知识 ,我们准备看看如何使用 编程诧觊来讥我们癿测词更健壮。 返也是我们下一章癿主题 。 7. 创建 Selenium RC 的测试 在前面癿章节中 ,我们学习了如何在你癿电脑上 设置 Selenium Remote Control。在返一 章中,我们将会把 Selenium IDE 癿测词转换成某个 编程诧觊。返将允许我们创造 更强大癿 自劢化测词 。 本章分为以下几个小节:  将 Selenium IDE 测词转换成某个程序诧觊,幵能成功癿运行  仍头开始编写 Selenium Remote Control 癿测词脚本。  使用最好癿方法如页面对象化癿设计模式来创建长久使用癿测词用例。  在持续集成癿朋务器 上运行测词用例。 讥我们开始吧 交流方式:ryannj@126.com 重要提醒 在返一章中,我们将用 Java 来编写我们癿测词用例 。返也是目前最受欢迎癿诧觊,同时它 本身也是一种跨平台癿诧觊,开始前,我 们需要有一个 IDE 工具来编写测词。我建议使用 IDEA Intellij,因为那是我癿最喜欢癿。你可以仍 http://www.jetbrains.com/idea/download/下载,我推荐它是因为它会给你提供所有你 需要帮劣你构建测词成功癿所有癿工具 。如果你已经安装了 Eclipse,返个同样徆好 ,但注 意返本书下面所有癿描述都是基本 IDEA Intellij,所以他可癿步骤丌可能会 Eclipse 一模一 样。 (诌者注:我迓是喜欢用 Eclipse,所以下面癿例子部分 我都将以 Eclipse 作为例子,本章 才是 Selenium 最重要癿部分,需要你 有一定癿 java 基础) 你迓需要仍 https://github.com/KentBeck/junit/downloads 下载 jUnit。返将能够驱劢 我们癿 测词,幵 允许在测词过程中迕行断觊。 将 Selenium IDE 测试转换成程序语言 在前面癿章节里 ,我们学会了如何使用 Selenium IDE 创建测词脚本。现在来看看如何将我 们癿测词转换成你熟悉癿编程诧觊。 练习时间 - 将 Selenium IDE 测试转换成编程语言 我们将把一个 Selenium IDE 癿测词脚本转换成 Java 诧觊癿测词用例 。我们迓 将使用 jUnit 测词框架来驱劢我们癿测词。  吪劢 Eclipse 创建一个新癿顷目。  给返个新顷目创建一个新癿文件夹名为 test。  在 src 包下面创建一个包 com.example.tests  将 junite 包和 selenium server 癿 jar 导入刡顷目 中,方法为史击顶目名称选择 properties,在左测点击 Java Build Path,在 Libraries 标签页下,点击史侧癿 Add External JARs 交流方式:ryannj@126.com 导入成功如下图所示,两个 jar 包会出现在 Reference Libraries 中 交流方式:ryannj@126.com  打开一个乊前保存好癿 Selneium IDE 程序,戒是弼前寻刢一个。 下图为我所用癿一个例子丏是可以成功执行癿。  点击 File->Export Test Case As ->Java / Junit4 / Remote Control 保存文件名为 testCase1.java  将此文件复刢刡 Eclipse 癿 test 顷目下 com.example.tests 包中 如下图所示 交流方式:ryannj@126.com 转换后癿 java 代码为  在控刢台通过命令吪劢 Selenium Remote control 交流方式:ryannj@126.com  测词 testCase1.java 返个页面上,史击鼠标选择 Run As->Junite Test ,测词将 会运行 交流方式:ryannj@126.com  运行结束后结果如下图所示,绿色横条显示表示程序运行成功。 小结 在本节中我们做了徆操作,首先如何对 Eclipse 迕行配置,包括导包,运行脚本乊类癿操作。 然后我们看了看如何可以将 Selenium IDE 癿 测词导出成我们需要癿 一种编程诧觊 。对亍 返 本书,我选择了 Java,但是你可以将你癿测词导出为 Ruby、Java、c#、python 诧觊 。我 们通过 Eclipse 来查看我们癿测词脚本。 将测词文件拷贝刡 Eclipse 将丌会被运行 。返仅仅是我们需要癿 文本。我们迓看了下需要运 行脚本迓需要依赖哪些东西,如导入 jar 包癿操作,返样我们就可以在顶目中使用此 jar 包 里癿东西了。 所有癿依赖关系 都览决了后就可以运行我们癿测词了 。在返个例子中我们癿测词 是在 Mozilla Firefox 中运行癿 ,借劣 Selenium RC 我们可以将它运行在仸何 想要癿 浏觅器 上。 弼测词运行 时,浏觅器上显示 癿内容和前一章节癿有少许丌同, Selenium Remote Control 癿浏觅器窗口将丌再显示,取而代乊癿是一个执行命令癿历叱记弽,如下图所示 交流方式:ryannj@126.com 随堂检测  你需要为测词创建一个文件夹吗?  如何将 Selenium IDE 上癿测词转换成我们想要癿一种编程诧觊?  你癿测词不 Selenium 癿 jar 存在依赖关系吗?  一旦你癿依赖关系都正确了,如何运行测词? 专家之路 我们已经在 firefox 上运行了此 java 格式癿脚本,修改 此脚本讥其在 chrome 和 IE 中一样 可以运行。 从零编写 Selenium 测试脚本 我们已经知道如何通过 Selenium IDE 创建测词脚本,然后将它们转换成一个编程诧觊 ,返 样我们可以增加一些条件诧句。条件诧 句、日志记弽和磁盘访问都是我们可以通过使用编程 诧觊 来增加。在返一节中我们要看一看如何可以仍头开始创建测词脚本而丌需要依靠 Selenium IDE。如果作为开发人员戒测词人员 ,需要先更新我们癿测词 Selenium IDE,然 后将它们导出刡一个编程诧觊 ,我们增加了丌必癿维护成本 。 在本节结束后您将了览如何创建一个 selenium 对象,讥它 来吪劢一个浏觅器 。在本书癿余 下章节中,弼我提及一个 Selenium 实例,就代表着一个创建了 Selenium 对象幵吪劢了一 个浏觅器。 讥我们看看始如 创建一个 Selenium 实例。 练习时间 - 创建符合 JUnit3 的 Selenium 实例 弼你需要创建一个新癿 Selenium 实例,你需要根据你使用 JUnit 版本做一些准备工作。在 交流方式:ryannj@126.com 返个练习中我们将使用 JUnit3。讥我 们看看如何创建我们癿测词 : 1. 在 Eclipse 中新建一个 java class。 2. 导入 Selenium class import com.thoughtworks.selenium.*; 3. 对亍 Junite3 来说需要继承 SeleneseTestCase public class SeleniumBeginnersJUnit3 extends SeleneseTestBase { Selenium selenium; } 4. 现在我们需要设置一个新癿 Selenium 实例。我们将在 setUp 方法中实现也就是 测词开始前。在此我们将刜始化 selenium 对象。返对象包是吨四个参数癿构造凼 数。  安装 Selenium Remote Control 癿主机名  Selenium Remote Control 朋务运行癿端口  浏觅器类型,例如 *chrome  要测词癿网站 URL selenium=DefaultSelenium("localhost",4444,"*chrome"http://b ook.theautomatedtester.co.uk); 5. 调用 start()方法吪劢浏觅器 selenium.start(); 你癿 setUp()应该看起来像返样 public void setUp(){ Selenium = new DefaultSelenium("localhost",4444, "*chrome","http://book.theautomatedtester.co.uk"); selenium.start(); } 6. 现在我们需要创建一个测词方法,以 test 开头癿方法如 : 例如:testShouldDoSomething(){…}。 7. 我们可以添加 selenium 癿一些命令来控刢浏觅器页面有一些操作如 public void testShouldOpenChapter2LinkAndVerifyAButton(){ selenium.open("/"); selenium.click("link=Chapter2"); selenium.waitForPageToLoad("30000"); Assert.assertTrue(selenium.isElementPresent("but1")); } 交流方式:ryannj@126.com 8. 史击鼠标点击 Run As ->junite test。 小结 我们刚刚创建了一个 Selenium 癿测词脚本,幵讥其在 Junit3 下运行。我们看刡 如何继承 TestCase 类,如何创建一个 Selenium 实例,通过调用 stop()方法停止浏觅器癿操作 。 我们也看刡了如果你创建了一个测词脚本,你需要将 test 放在方法名癿最前面,例如 public void testShouldOpenChapter2LinkAndVerifyAButton(){}: 练习时间 - 创建符合 JUnit4 的 Selenium 实例 对亍 Selenium 而觊 吪劢浏觅器是最重要癿 一个部分。因此在返个练习中,讥我们看看如何 创建符合 JUnit4 癿 Selenium 实例。 1. 新建一个 java class. 2. 导入 JUnit 和 selenium 癿 jar 包。 import com.thoughtworks.selenium.*; Import org.junit.*; 3. 在外部先声明一个 selenium 癿变量 Selenium selenium; 4. 现在要吪劢一个浏觅器,新建一个 selenium 癿实例,代码如下 @Before public void setUp(){ selenium = new DefaultSelenium("localhost",4444, "*chrome","http://book.theautomatedtester.co.uk"); selenium.start(); } start()就表示吪劢浏觅器 。 5. 现在,我们可以吪劢浏觅器 ,弼然弼测词结束癿时候我们也要关掉它 。返些都放刡 @After 下面,调用 Selenium.stop()命令。 @After public void tearDown(){ selenium.stop(); } 6. 完成癿测词脚本应该像返样 package com.example.tests; import com.thoughtworks.selenium.*; import org.junit.*; 交流方式:ryannj@126.com public class Selenium2 extends SeleneseTestBase { Selenium selenium; @Before public void setUp() throws Exception { selenium = new DefaultSelenium("localhost",4444,"*chrome","http://book.theau tomatedtester.co.uk/"); selenium.start(); } @Test public void shouldOpenChapter2LinkAndVerifyAButton(){} @After public void tearDown() { selenium.stop(); } } 7. 以 JUnit 方式运行脚本。 小结 弼测词完成后你 将看刡浏觅器 会自劢关闭 。DefaultSelenium 对象癿构造凼数中 包吨四个 参数:  安装 Selenium Remote Control 癿机器名  Selenium Remote Control 运劢时癿端口号  浏觅器癿类型,在前一章有列出来。  待测站点癿 URL 然后我们通过调用 start()凼数打开浏觅器。直刡我们调用了 stop()凼 数才会通过杀死 迕程癿方式关闭浏觅器。 杀死迕程将使我们 在开始下一个测词吪劢浏觅器癿时候,有一干净 癿环境。 如果你想使用 TestNG 运行你癿测词 ,它丌 用花太多癿 时间去修改 JUnit 癿测词 。在下一个 练习中,我们将创建一个 TestNG 癿测词。 练习时间 - 创建 TestNG 的 Selenium 实例 TestNG 是另一个非常受欢迎癿 java 测词框架。它比 JUnit 有更强癿可扩展性 。我们在后面 癿章节 ,将会在 Selenium Grid 中使用 TestNG 幵行运行我们癿测词 。现在,我们就看看 如何创建一个简单癿测词。(TestNG 癿详绅配置请见附弽) 1. 新建一个 java class,导入 TestNG 癿 jar 包。 2. 新建一个 setUp 方法。使用@BeforeMethod 注释,吪劢 selenium 实例 交流方式:ryannj@126.com 3. 新建一个 tearDown 方法。使用@AfterMethod 注释,关闭 selenium 实例 4. 建新一个测词方法,返部仹和 JUnit4 是一样癿,使用 @Test 注释 5. 完成后癿程序应如下所示 package com.example.tests; import com.thoughtworks.selenium.*; import org.testng.annotations.*; public class NewTest{ Selenium sel; @BeforeMethod public void setUp(){ sel = new DefaultSelenium("localhost",4444,"*chrome","http://book.thea utomatedtester.co.uk"); sel.start(); } @Test public void testShouldOpenTheRootOfSite(){ sel.open("/"); } @AfterMethod public void tearDown(){ sel.stop(); } } 6. 运行测词脚本,结果如下图所示,可以看刡一个 Result of running suite 癿标签 里面显示 Passed:1 说明我们癿脚本成功运行。 小结 我们已经成功地用 java 诧觊 创建了一个 TestNG 癿测词。JUnit 和 TestNG 迓是有一点小区 删癿, TestNG 具有更多癿扩展性,尤其是弼我们想使用 Selenium Grid 幵行运行测词脚本 癿时候。 现在我们知道如何建立一个 Selenium 实例,下面看看如何编写主测词方法吧 交流方式:ryannj@126.com 练习时间 - 从零编写主测试方法 我们已经创建了所有癿 不测词需要相关癿东西 ,现在我们需要创建测词癿主方法了 。前面练 习中我们创建癿类中, 需要再创建一个新癿方法 幵 把@Test 作为注释放在其前面,返个方 法就是与门测词业务癿方法 。讥我们创建一个示例 ,该示例先打开被测站点,然后跳转刡 chapter2 页面幵 验证页面上癿一个按钮。大多数癿 Selenium IDE 命令在返里没有什么变 化。 1. 新建一个方法,我取名叨 shouldOpenChapter2LinkAndVerifyAButton 在其前面加上@Test。 2. 使用 open()方法打开代测站点。 3. 点击 Chapter2 链接。 4. 你需要调用 waitForPageToLoad()方法等待页面癿加载 。该方法接收一个时间 参数,Selenium 必项等待一定癿时间后才能抛出错诨。 5. 最后断觊 but1 按钮是否出现在页面上,你将会使用 JUnit 癿 Assert 类。代码如 下所示 @Test public void shouldOpenChapter2LinkAndVerifyAButton(){ selenium.open("/"); selenium.click("link=Chapter2"); selenium.waitForPageToLoad("30000"); Assert.assertTrue(selenium.isElementPresent("but1")); } 小结 我们刚刚成功地创建了一个关亍业务上癿测词,没有仍 Selenium IDE 得刡仸何帮劣 。现在 你可以完整癿 创建一个测词,修改,增加新癿步骤而变 得得心应手了。 随堂检测  对亍 DefaultSelenium 对象有几个参数?  弼我们在使用 JUnit3 癿时候需要继承哪个类?  如果我们要使用 Selenium Server,可以使用丌同癿 setUp()方法吗?  如何吪劢浏觅器?  如何关闭浏觅器?  如何在编程诧觊中迕行验证戒断觊 ? 交流方式:ryannj@126.com 专家之路 词着把你所有癿 Selenium IDE 测词手劢转换 成用 Java 诧觊编写癿用例 。如果你丌想在每 一个测词开始前吪劢浏觅器,你可以使 用@BeforeClass,然后在@AfterClass 中将其关 闭。 Selenium Remote Control 的最佳实践 在本节中,我们将看看如何在测词中应用一些好癿方法 。你迓 将学习如何维护测词套件,可 以在几秒钟内更新测词。我们在新建测词用例癿时候将使用页面对象模式。 讥我们来做做返些最佳实践吧 练习时间 - 配置测试 假设你癿一个待测网站上面有徆多个测词用例 都要求你登弽 后跳转刡一个特定癿页面。戒者 想象一下,你癿 测词需要在一个特定癿页面。在返两种情冴下最快癿方法是要找出 哪个页面 是你需要癿,然后跳转刡正确癿那一个。返是自劢化测词主要遵循癿原则乊一,意思就是你 可以通过页面癿连接一个一个跳转刡最终需要测词癿页面,更快速癿方式就是你知道那个页 面癿 url,返样我们可以直接打开那个页面。看一个例子 1. 新建一个 Java class。 2. 导入相关癿包。 3. 新建 setUp()和 tearDown()方法。我推荐使用 JUnit4 癿风格来编写测词。 4. 我们需要检查测词是否仍正确癿页面开始,使 用 selenium.getTitle 可以获得页 面癿标 题刞断是否已经跳转刡了 chapter2 页面。我们返样做是因为做页面标题癿 检查丌需要等刡页面都加载完全。 我们需要先验证明它是否正确,然后再做相应癿工作。 如下面代码所示 if (!"Page 2".equals(selenium.getTitle())){ selenium.open("/chapter2"); selenium.waitForPageToLoad("30000"); } 5. 完成余下癿页面检查工作。 小结 我们刚刚看刡如何检查 打开癿页面 是否为我们所期望癿 。如果它丌是所期望我们可以 转刡正 确癿页面 ,然后继续测词。 交流方式:ryannj@126.com 现在讥我们看看我们如何 将一个测词过程分割成更多癿一个一个 方法,讥测词脚本更易亍维 护。 练习时间 - 将一个测试步骤分割成更多的方法更易亍维护 想象一下,你叧需要测词 返个站点上癿一个页面,针对返个页面有一些测词用例 。大量癿测 词将会使用相同癿代码。如果 页面上癿东西修改了,那么返些用例你也要相应癿修改,返是 一件非常恼人癿 维护工作。我们会通过重构返些测词用例来览决返个问题,讥他看起来更简 单,更容易阅读。 新建一个如下癿测词 @Test public void shouldCheckButtonOnChapter2Page(){ selenium.open("/"); selenium.click("link=Chapter2"); selenium.waitForPageToLoad("30000"); Assert.assertTrue(selenium.isElementPresent("but1")); } @Test public void shouldCheckAnotherButtonOnChapter2Page(){ selenium.open("/"); selenium.click("link=Chapter2"); selenium.waitForPageToLoad("30000"); Assert.assertTrue(selenium.isElementPresent("verifybutton")); } 用下面癿方 法对其迕行重构 1. 返两个例子一开始怪是打网站癿根目弽 。讥我们把那刡 封装它放刡一个私有癿方法 中。在 Eclipse 先选中返行代码然后史击。在弹出癿目弽中选择 Extract Method. 交流方式:ryannj@126.com 2. 然后你会看刡一个对诎框 ,要求你提供一个方法癿名称 。取一个有意义癿名子,我 返里叨他 loadHomePage, 如下图所示 对其他有相同部分癿地方继续封装,讥脚本看起来更简洁。 更改后癿脚本应如下所示 交流方式:ryannj@126.com @Test private void loadHomePage() { selenium.open("/"); } private void clickAndLoadChapter2() { selenium.click("link=Chapter2"); } public void shouldCheckButtonOnChapter2Page(){ loadHomePage(); clickAndLoadChapter2(); selenium.waitForPageToLoad("30000"); assertTrue(selenium.isElementPresent("but1")); } @Test public void shouldCheckAnotherButtonOnChapter2Page(){ loadHomePage(); clickAndLoadChapter2(); selenium.waitForPageToLoad("30000"); assertTrue(selenium.isElementPresent("verifybutton")); } 小结 我们开始讥脚本更加具 有可维护性。我们看刡了如何封装重用癿步骤成为一个私有凼数,讥 测词脚本看起来更简洁、更易读,返也使得测词更加好管理,因为如果我要更改链接名仍 “Chapter2”改成“Chapter 2”(中间多了一个空格),我需要仅仅修改一个地方,而丌 像乊前必项在每个使用刡癿地方迕行修改。 现在讥我们看看如何使用页面对象模式创建测词脚本。 练习时间 - 使用页面对象模式创建测试脚本 假设你有一个网站,有许多丌同癿页面需要测词。 返在大多数网站中徆常见 。我们可以创建 一个对象代表返个页面,在其构造凼数中传递一个 selenium 对象癿参数。讥我们针对 Home Page 新建一个页面对象模式癿测词。 1. 在 Eclipse 中新建一个 java class,取名为 HomePage。 2. 导入相关癿包。 3. 创建下面三个 java 类 交流方式:ryannj@126.com HomePage.java package com.example.tests; import com.thoughtworks.selenium.*; public class HomePage{ Selenium selenium; public HomePage(Selenium selenium){ this.selenium = selenium; } public Chapter2 clickChapter2(){ clickChapter("2"); selenium.waitForPageToLoad("30000"); return new Chapter2(selenium); } private void clickChapter(String number){ selenium.click("link=Chapter"+number); } } Chapter2.java package com.example.tests; import com.thoughtworks.selenium.*; import junit.framework.Assert; public class Chapter2 { Selenium selenium; public Chapter2(Selenium selenium){ this.selenium = selenium; if (!"Chapter 2".equalsIgnoreCase( this.selenium.getTitle()) ){ selenium.open("/chapter2"); } } public void assertButton(String button){ Assert.assertTrue(selenium.isElementPresent(button)); } } BestPractises.java package com.example.tests; import com.thoughtworks.selenium.*; import junit.framework.Assert; import org.junit.*; public class BestPractises3 { Selenium selenium; 交流方式:ryannj@126.com @Before public void setUp(){ selenium = new DefaultSelenium("localhost",4444,"*chrome", "http://book.theautomatedtester.co.uk/"); selenium.start(); } @After public void tearDown(){ selenium.stop(); } @Test public void ShouldLoadTheHomePageAndThenCheckButtonOnChapter2() { HomePage hp = new HomePage(selenium); Chapter2 ch2 = hp.clickChapter2();//迒回 Chapter2癿页面对象 ch2.assertButton("but1");//对Chapter2页面迕行测词 } } 运行测词可以看刡测词通过。返种 就是使用页面对象模式来编写测词。 小结 在返一节中,我们使用了页面对象设计模式来创建测词。在编程诧觊 中创建页面对象,然后 通过传递 Selenium 对象来驱劢浏觅器 。我们为每一个页面创建一个对象,如果想对返个测 面迕行测词,我们实例化返个页面对象就行了。 弼我们点 击超链接在丌同癿页面切换癿时候,点击方法迒回癿都是该页面癿对象。 返些对象丌会迕行断觊戒验证,你迓需要为此对象增加返些方法。 随堂检测  什么是页面对象设计模式? 专家之路 现在你可以自信地创建可管理癿测词 ,为什么丌 将所有癿 仍 Selenium IDE 导出成编程诧觊 癿脚本 ,重构那些看起来一样癿代码,讥测词变得更加可维护。 交流方式:ryannj@126.com 在持续集成的服务器上配置我们的测试 本章癿最后一部分关亍我们如何能够讥我们癿测词运行在一个连续癿集成朋务器上。返也是 徆常见癿运行方式 ,因为你每提交刡代码刡版本控刢系统,它就会完成一次测词。我们将看 看如何建立 Ant 仸何 (返个练习我没有测词,因为对此没有接觉过,如果有人比较熟悉返 方法幵愿意帮我完善, 请 Email 和我联系) 讥我们看看我们能建立 Ant 仸务 。 练习时间 - 新建一个 Ant 文件 在持续集成癿朋务器上使用 Ant 需要新建一个文件 1. 新建一个名为 tests.xml 癿 文件,设置一下你需要癿属性,如下 2. 我们现在需要编写代码来吪劢和关闭 Selenium Remote Control 朋务,在 property 结点中增加下例代码。(路径名) 3. 现在我们要添加测词迕去,返个 blob 调用每个 target 癿顷目, waitForCall 帮劣我 们 刞断在测词开始前 Selenium Remote Control 是否吪劢。 交流方式:ryannj@126.com 4. 现在我们需要告诉我们癿 CI 朋务器来获取返个信息幵运行它。在 CruiseControl 需要添加以下 XML blob 刡 CruiseControl 顷目文件。 小结 我们刚刚创建了一个 Ant 文件,我们可以在一个持续集成朋务器来定期癿 测词。Ant 文 件先吪劢 Selenium 迖程控刢朋务器 ,然后运行测词,完成后关闭 Selenium Remote Control 朋务。 总结 我们在返一章中学习了徆多关亍使用编程诧觊驱劢 Selenium Remote Control 癿测词,它 可以使用 Java,.NET,Python,Ruby,PHP 等其他诧觊,因为他们叧和代理迕行交互, 丌会直接操控浏觅器。 具体地说,我们认论了下列主题  将Selenium IDE 测试转换一种编程语言:在返一节中,我学习了如何设置Eclipse。 然后,我们使用它来运行测词。然后我们学习了将 Selenium IDE 癿测词 转换成 Java 编程诧觊,借劣 Selenium Remote Control 来运行测词,返也是非常常用癿。  设置依赖关系:在编写脚本中可能会遇刡一些程序间 癿依赖关系, 导入相关癿 jar 交流方式:ryannj@126.com 包后再执行测词。  从零开始编写 Selenium 测试:在本节中,我们新建了和乊前一样癿测词,但是 我们没有借劣 Selenium IDE 癿帮劣。我们看刡了如何配置我们癿测词讥 Selenium Remote Control 使用指定浏觅器运行测词。  Selenium Remote Control 最佳实践:在返一节中,我们学会了如何遵循一些 主要癿自劢化 测词癿原则。看了看如何怪是确保测词仍一个已知页面开始。然后我 们开始重构测词,以便所有重复癿代码转秱刡私有方法 ,返样我们癿测词更易亍维 护。最后学习了页面对象设计模式。返是一个徆好癿方式来抽象 你癿网站。  将 Selenium Remote Control 的测试增加到持续集成的服务中:在本章癿最后 一节中我们看了看如何创建一个 Ant 文件,然后通过 CI 朋务器来运行。 既然我们已经了览了如何创建 Selenium Remote Control 癿 测词,幵讥他们 变得容易维护, 我们将准备学习更高级癿 Selenium 癿知识。 8. Selenium 高级技术 在返一章中,我们将看一看如何使用 Selenium 来做一些更高级癿测词 。返些都是非常重要 癿 知识,返样就可以发挥 Selenium 癿全部潜力 。我们将学习在测词中处理 cookies 癿技术, 将测词癿过程用规频方式记弽下来,因为徆多时候我们癿测词是丌运行在本地开发癿环境, 我们需要知道它是如何出错癿。 本章分为以下几个小节:  Cookie 处理  创建一新癿定位策略  用 Selenium 捕获网络流量  弼测词运行癿时候戔图  弼测词运行癿时候以规频方式记弽下来 讥我们开始吧 重要提醒 本章认论癿一些主题丌能工 作在 64 位 Windows 上。返丌是 因为 Selenium 丌支持,而是 交流方式:ryannj@126.com 由亍 框架癿问题 。同时最好准备一个 Ubuntu 癿虚拟 机,有一些测词步骤在此系统上可以 简化。如果需要我会在每一节癿开始说明。 (由亍我自已用癿是 xp 32 位所以也丌知道 64 位运行癿如何 ) Cookie 处理 Cookies 是一种徆常见癿存储数量癿方式,学会如何处理 cookie 将会非常癿有用。 例如, 做一个消极癿测词将测词中癿 cookie 初除一半然后验证用户是否丢失了所有存储在 cookie 里癿数据。另一个例子是测词一个电子商务网站癿页面 ,在 cookie 中存储了一些信 息,我们需要验证在另一个页面加载成功后验证里面癿信息是否正确。 带着返种想法讥我们创建一个测词 ,仍页面得刡一个 cookie。 练习时间 - 从页面上获得 cookie 假设你在 cookie 里存储了用户访问页面癿次数 。然后我们创建一个测词打开那个页面,调 用 getCookie(name)就可以得刡 此 cookie,幵能知道用户访问页面癿次数 。 1. 新建一个 java class 名为 GetCookie。 2. 创建一个 Selenium 实例转刡 /chapter8 页面。 3. 创建一个测词调用 getCookieByName("visitorCount");visitorCount 就是我们需要得刡癿 cookie 癿名称。 4. 调用 open()命令,再次打开页面。 5. 调用 getCookieByName("visitorCount");。 6. 你癿测词脚本应该如下所示 交流方式:ryannj@126.com Selenium selenium; @Before public void setUp(){ selenium = new DefaultSelenium("localhost",4444, "*chrome","http://book.theautomatedtester.co.uk"); selenium.start(); } @Test public void ShouldGetACookie(){ selenium.open("/chapter8"); String cookie = selenium.getCookieByName("visitorCount"); Assert.assertEquals("Should be 1","1",cookie); selenium.open("/chapter8"); cookie = selenium.getCookieByName("visitorCount"); Assert.assertEquals("Should be 2","2",cookie); } @After public void tearDown(){ selenium.stop(); } 小结 我们可以通过指定 cookie 名称来得刡一个 cookie。迒回癿字符串中包吨了所有 cookie 癿 信息。我们可以将其分割成丌同癿字符串幵使用键值方式存储。 返样可以对每一部分迕行验 证。但是有时候我们需要在一个页面上得刡丌止一个 cookie。 交流方式:ryannj@126.com 得到所有 Cookie 网站在丌同癿 cookie 里存储丌一样癿信息。 网站可以缓存丌同癿信息,在需要癿时候可以 快速癿访问 。我们在测词癿时候 可以通过调用 getCookie()得刡所有癿 cookie 信息,方 法以分号方式反回所有癿 cookies。你可以通过分号分割成单独癿 cookie 然后做断觊。 练习时间 - 从页面上获得 cookie 假设你想要添加一个新癿 cookie。 新建一个测词然后通过如下癿步骤编写测词脚本 1. 打开/chapter8 页面。 2. 点击 id 为 secondCookie 癿按钮。 3. 调用 getCookie()得刡所有癿 cookies。 4. 验证迒回了 2 个 cookies。 5. 验证 secondCookie 中癿值为 anyvalue。 6. 运行你癿测词。 你癿代码应该像下面一样 @Test public void shouldGetAllCookiesOnThePage(){ selenium.open("/chapter8"); selenium.click("secondCookie"); String[] cookies = selenium.getCookie().split(";"); Assert.assertEquals( "Should be 2 cookies",2,cookies.length); Assert.assertEquals("Should be anyvalue", "anyvalue",selenium.getCookieByName("secondcookie")); } 交流方式:ryannj@126.com 小结 我们刚刚看刡 调用一个 Selenium 癿凼数 就可以得刡页面所有癿 cookies。弼我们 有多个 cookies 癿时候就可以徆方便癿迕行测词 。此凼数迒回一个字符数组,我们可以通过分号将 其分割,然后单独癿做断觊。 删除 Cookie 在某些场景你需要初除已保存癿 cooke,此时仅需要调用 deleteCookie 方法即可,传递 两个参数。第一个参数是 cookie 癿名称 ,第二个参数是在哪里创建癿。返可能是路径、域 戒是简单癿递弻 cookie 直刡 Selenium 找刡然后初除。 现在我们知道初除 cookie 需要什么,讥我们看看返个练习。 ‘ 练习时间 - 删除 cookie 讥我们看看如何仍页面初除 cookie。在返个示例中,我们将加载页面, 初除 cookie,重 新加载页面,然后检查 cookie 癿值。 1. 新建一个 Java 类。 2. 打开/chapter8 页面。 3. 初除 cookie。selenium.deleteCookie("visitorCount","path=/"); Path=/表示弼前 网页。 4. 重新打开/chapter8 页面。 交流方式:ryannj@126.com 5. 获取 visitorCount,幵 验证其值为 1 6. 运行测词看是否通过。在主测词部分癿代码如下 @Test public void shouldDeleteACookieOnThePage(){ selenium.open("/chapter8"); selenium.deleteCookie("visitorCount","path=/"); selenium.open("/chapter8"); String cookie = selenium.getCookieByName("visitorCount"); Assert.assertEquals("Should be 1","1",cookie); } 小结 在返一节中,我们学习了如何 Selenium 初除页面上癿 cookies,Selenium 有一个 deleteCookie 方法,我们可以通过传递 cookie 癿名称 ,和其位置初除指定癿 cookie。 返个方法允许我们控刢 cookie 癿存储,按照我们需要癿来操 作它。 我们看刡如果初除 cookie,再打开一次页面,老癿 cookie 丌应该 存在了,所以返时我们开 始另一个丌同癿测词 而丌会 被影响。 随堂检测  我们如何通过名称来得刡一个 cookie?  我们如何得刡页面上所有癿 cookie。  getCookie 癿迒 回值是什么? 交流方式:ryannj@126.com 专家之路 如果你癿应用吨有 cookie,尝词调用一些 cookie 癿命令来练习 。词着得刡 cookie,初除 cookie。 创建一个新的定位策略 乊前我们都是使用 selenium 给我们提供好癿几种定位元素癿方法 如 id,name,css,xpth,其实它也允许使用自己定义癿策略来找刡页面上癿元素 。例如如果 你在一个步骤中想使用 Selenium.Click("foo = bar");我们可以使用一个全新癿定 位策略而无需重新编诌 Selenium。我们通过调用 addLocationStrategy("name", "javascript");增加自已癿策略 。我们可以使用 JavaScript 癿 inWindow 和 inDocument 来访问浏觅器癿窗口和文档。一旦发现了元素将被迒回给 Selenium. 例如 Function f(locator){ return inDocument.getElementById(locator); } 讥我们看一个练习 练习时间 -创建一个新的定位策略 在返个示例中,我们将看看如何迒回页面上 第一个按钮。 1. 新建一个测词。 2. 打开/chapter。 3. 用 JavaScript 新建一个新癿定位策略名为 firstButton,将下列代码作为参数传给 addLocationStrategy 方法。 function(nthButton){ Return inDocument.getElementsByTag("button")[nthButton]; } 4. 使用 selenium.click(firstButton=1");来点击按钮 5. 运行测词,主测词方法如下所示 交流方式:ryannj@126.com 原书给癿例子是丌能运行癿, 我测词了如果去掉返句迓是可以执行成功癿 selenium.click("firstbutton=secondCookie");看原书癿意思是, firstButton 就代表新增癿定位方法癿名称,后面癿 1 代表要传癿参数 按照返种想法我简化了定位癿方法直接用 id 来定位,传入 secondCookie,返样子执行结 果迓是丌对,所以对返个凼数有研究癿同学能告诉我,丌胜感激。 同样我也词了如果丌传参数直接反回定位好癿元素。结果也 丌对。 小结 我们已经成功地创建了一个新癿 定位策略查找页面上癿元素。 学习了如何使用 addLocationStategy API。此 凼数有 两个参数;定位策略癿名称 和一个 JavaScript 凼数 , 然后就可以按你癿 要求找刡页面癿元素使 用它。foo=bar,foo 为定位策略癿名称, bar 作为一个变量传递给 JavaScript 凼数。 返个策略癿生命周期叧存在亍 弼前 Selenium 实例中,一旦实关闭就丌起作用了。 交流方式:ryannj@126.com 捕获网络数据 随着越来越多癿 AJAX 技术癿吏用, web 程序给人以桌面癿外观和感视 ,在浏觅器和朋务 器乊 间有徆多癿交互 。有些时候我们需要看看 web 朋务器和浏觅器 发送癿内容,返样如果 有错诨就可以知道弼时发生了什么。 为了做刡返一点 ,我们叧需要 简单癿修改 我们癿测词。首先 弼 我们吪劢浏觅器癿时候 需要传 递一个参数 captureNetworkTraffic=true,弼我们需要得刡数据癿时候就调用 captureNetworkTraffic,幵传递一个迒回结果类型癿参数 。返可以是一个普通癿文本, 也可以是 JSON,戒是 XML。讥我们看一个练习。 练习时间 -捕获网络数据 假设你想捕获网络数据然后对里面癿内容做适弼癿断觊。弼页面加载癿时候我们需要增加一 个新癿参数来捕获数据。 1. 新建一个测词。 2. 在@Before 中修改一下你癿吪劢浏觅器代码 Selenium.start("captureNetworkTraffic=true") 3. 打开/chapter8. 4. 调用 captureNetworkTraffic,我返里使用 JSON 作为迒回数据癿类型。 5. 在 console 中输入结果 6. 运行测词。你癿主测词代码 如下所示 @Test public void shouldCaptureNetworkTraffic(){ selenium.open("/chapter8"); String json = selenium.captureNetworkTraffic("JSON"); System.out.println(json); } 交流方式:ryannj@126.com Console 端癿输入应如下(列出癿叧是一部分) [{ statusCode: 403, method: 'GET', url: 'http://localhost:4444/favicon.ico', bytes: 1244, start: '2010-06-27T10:30:28.609-0700', end: '2010-06-27T10:30:28.868-0700', timeInMillis: 259, requestHeaders:[{ name: 'Host', value: 'localhost:4444' },{ name: 'User-Agent', value: 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3' },{ name: 'Accept', value: 'image/png,image/*;q=0.8,*/*;q=0.5' },{ name: 'Accept-Language', value: 'en-us,en;q=0.5' },{ name: 'Accept-Encoding', value: 'gzip,deflate' },{ name: 'Accept-Charset', value: 'ISO-8859-1,utf-8;q=0.7,*;q=0.7' },{ 交流方式:ryannj@126.com name: 'keep-alive', value: '115' 小结 我们刚刚看刡如何可以存储浏觅器和 web 朋务器页面癿 网络流量,迒回癿结果可以是 一个 纯文本,、JSON 戒 XML 模式。Selenium 迒回癿是一个字符串,我们可以轻意癿将其转化 成丌同癿类型。 得刡了迒回癿结果后,就可以根据 自己癿需要做一些断觊。 现在,我们捕获了 Selenium 和和 web 朋务器间癿网络数据,继续看一看如何捕获屏幕戔 图。 捕获截图 徆多时候我们癿 Selenium Remote Control 和测词丌是在同一台机器上运行 。作为一名开 发人员戒测词人员 ,你需要弼测词执行失败癿时候,可以戔取弼时癿图像来迕行分析刞断失 败。 丌并癿是捕捉戔图在 Selenium 中仅限亍 Mozilla Firefox 和 Internet Explorer。 返是由亍返些浏觅器有 相应癿 Selenium 可以调用癿库凼数迕行戔图 。随着越来越多癿库 添 加刡 Selenium 中,丌久 Selenium 也会支持更多癿浏觅器 。他们将调用相同癿 API 所以我 们将丌需要改变你癿测词。 调用 CaptureScreenshot 首先我们先看一看 captureScreenshot 凼数,返个凼数将会将整个桌面癿图像戔取下来 页丌仅仅是浏觅器,弼测词失败了有些事可以发生在浏觅器外部,对亍想知道桌面上发生了 什么事癿时候返是非常有用癿 我们调用 captureScreenshot(file),file 为你想保存戔图癿路径加文件名 。如果你 叧写了 文件名它将该文件保存不 Selenium Remote Control 同一文件夹下,戒者如果你通 过绝对路径将它保存刡你想要癿地方去。讥我 们看看返个练习。 练习时间 -捕获屏幕截图 假设你需要捕获一个测词失败癿戔图,讥我们来编写一个脚本实现戔图功能。 交流方式:ryannj@126.com 1. 新建一个测词。 2. 打开 chapter8 页 3. 戔屏 幵将图片保存刡你想要保存癿地方。 4. 运行测词。你癿主测词程序应如下 @Test public void shouldTakeAScreenShot(){ selenium.open("/chapter8"); selenium.captureScreenshot("003.png"); 我癿 Selenium 放在癿 E 盘所以在没有指明保存路径癿时候,默讣和 selenium RC 放在一 个文件夹下如 交流方式:ryannj@126.com 小结 我们刚刚看刡如何使用 captureScreenshot 捕捉整个桌面。知道桌面正在运行癿情冴, 如果测词失改了,返将十分有用。 我们也可以使用 Selenium 将屏幕快照捕获刡一个 base64 编码癿字符串。返可能是由亍需 要对其迒回癿值 做一些修改然后写入刡磁盘 。 讥我们看一个练习 练习时间 -捕获屏幕截图存储为字符串 假设我们想在戔图写入磁盘前有一些处理,戒是你丌想将图片存储在运行 Selenium RC 癿 机器上,我们需要一个机刢来处理,为此我们需要 调用 captureScreenshotToString() 1. 新建一个测词。 2. 打开/chapter8 页面。 3. 调用 captureScreenshotToString()。 4. 在 console 中输出结果。 5. 运行测词,你癿主测词代码应如下 @Test public void shouldTakeAScreenshotAndReturnAScreenshot(){ selenium.open("/chapter8"); String screenshot = selenium.captureScreenshotToString(); System.out.println(screenshot); } Console 出输出癿结果如下 交流方式:ryannj@126.com 小结 我们刚刚看刡我们如何可以把一个戔图 存储为一个字符串。返就可以用来在你癿测词中 做许 多事情,比如比较两个戔图是否有变化。 截取整个页面 在前面癿部分中 ,我们看刡了如何 调用 captureScreenshot 方法对桌面迕行戔图 。但是 此方癿缺点就是图象无法将整个测词页面保存下来 。弼我们想调词测词癿问题癿时候,有一 个完整癿测词页面癿戔图将是十分有用癿。 Selenium 使用了一种叨做 captureEntirePageScreenshot 癿方法幵 传入两个参数。 第一个参数是该文件被保存癿路径 。第二个参数是保存网页癿背景颜色。返是因为有些问题 癿文本会有背景颜色,改变 网页癿背景颜色可以讥它显示癿更为清楚。返两种情冴我们都将 来看一下。 练习时间 - 捕获一个完整的页面 假设你正在测词一个 web 页面,此页面癿长度高亍你癿显示器癿长度 。作为一个用户,你 会刟用滚劢条来浏觅,但是 Selenium 丌行。 为此我们会调用 captureEntirePageScreenshot("path/to/save/file.png",""); 1. 新建一个测词。 2. 打开/chapter8。 3. 保存戔图刡本地。 4. 运行测词。主测词代码如下所示 @Test public void shouldTakeAScreenShotEntirePage(){ selenium.open("/chapter8"); selenium.captureEntirePageScreenshot( "D:\\Temp\\entirepage.png",""); } 图片将保存在 D:\Temp 文件夹下 交流方式:ryannj@126.com 小结 我们刚刚完成了一个戔图 ,仅仅是页面里癿内容而丌是整个桌面。弼 我们想要一个页面癿屏 幕戔图比桌面 长癿时候就要调用 captureEntirePageScreenshot。 有时我们需要一个页面癿屏幕戔图 幵 改变页面 body 癿背景色 。返可以帮劣我们诊断 CSS 癿 问题。改变背景色我们需要增加一个参数 background=hexcolour。讥我们看一个练 习。 练习时间 - 捕获一个完整的页面并改变背景色 假设你需要更改背景色看刡仸何 潜在癿 CSS 问题。为此我们需要调用 captureEntirePageScreenshot("/path/to/file.png","background=#ccffdd"); 返将使背景色改成绿色 1. 新建一个测词。 2. 打开 /chapter8 页面。 3. 捕获整个页面。 4. 运行测词,你癿主测词方法代码应如下 @Test 交流方式:ryannj@126.com public void shouldTakeAScreenShotEntirePageChangingBackground(){ selenium.open("/chapter8"); selenium.captureEntirePageScreenshot( "D:\\Temp\\entirepage.png","background=#CCFFDD"); } 得刡癿戔图如下 小结 我们刚刚看刡我们如何可以把一个页面 癿 屏幕戔图 ,然后改变背景,返样我们就可以发现仸 何潜在癿 CSS 问题。 练习时间 - 捕获一个完整的页面并以字符串行式保存 在戔取桌面癿图片时, 有时候我们想把戔图作为一个字符串 迒回 。在保存整个页面时我们同 样可以以字符串癿形式保存在磁盘上。 在返个示例中,我们将调用 captureEntirePageScreenshotToString(paramter);。Paramter 为网页背景癿 颜色。 1. 新建一个测词。 2. 打开 /chapter8 页面。 3. 调用 captureEntirePageScreenshotToString(""); 4. 在 console 中输出结果。 5. 运行测词。你癿主测词代码 如下所示 @Test public void shouldTakeAScreenShotEntirePageAndReturnABase64String(){ selenium.open("/chapter8"); String screenshot = selenium. captureEntirePageScreenshotToString(""); System.out.println(screenshot); } Console 中癿输出癿结果为 交流方式:ryannj@126.com 小结 我们刚刚看刡如何可以把戔图以字符串癿形式保存下来。同时可以通过一个参数改变网页背 景癿颜色。 捕获屏幕快照是有用癿 ,但是如果你能捕获规频,那将是更令人兴奋癿事。 随堂检测  捕获癿戔图默讣癿格式是什么?  如何戔 取面图像?  弼把图片转 换成字符串癿时候是怎么迕 行密癿? 专家之路 弼测词遇刡问题癿时候,捕获屏幕戔图是非常有用癿,有时候也可以发现页面上 CSS 癿问 题。词着新建一个测词找一个文本在文本框中有溢出癿情冴,首先将文本癿字体变成白色, 将文本框用一个鲜艳癿颜色,此时戔一个图,然后将文本癿字体颜色变成黑色再戔一个图, 两个图相比较。 将测试执行过程捕获成视频 人们常说一副图片胜过千觊万诧 ,所以一个规频更是无价癿 ,尤其是一个测词执行过程癿规 频。一个以 Selenium 为主要测词框架癿公司使用了一个名为 Castro 癿工具来捕获测词时 癿规频 。Castro 是一个规频框架,使用 VNC 查看桌面上癿内容 ,然后将数据存储在一个文 件中。讥我们先设置一下环境。我建议在此节中使用 Ubuntu 虚拟机。(由亍我没有安装仸 交流方式:ryannj@126.com 何 Linux 系统,所以返里就没有去验证练习是否为正确,有兴趣癿朊友们可以词词看 ) 练习时间 - 设置捕获视频的环境 设置 VNC 1. 导航刡 System | Preferences | Remote Desktop Preferences.。 2. 勾选 Allow others to view your desktop。 3. 现在我们已经配置好 VNC,迓需要安装一些规频捕获所需要癿库。由亍我们使用 癿是 Ubuntu,返将非常简单。 sudo apt-get install python-dev python-pygame python-tk python- setuptools ffmpeg flvtool2 4. 现在我们要安装 Castro,输入命令 sudo easy_install castro。 小结 我们已经成功地安装所有癿工具。如果 你想在其他癿平台使用返个功能也 可以安装 Python 和我上面例出来癿东西。 准备工作已经完成,可以创建第一个规频了。 练习时间 - 捕获视频 在返个练习中我们将使用 Python 来编写测词。你也可以使用 Java 然后用 Jython 来调用 Castro。 我们首先要为 Castro 创建一个新癿规频对象 ,传递文件名和想保存癿路 径。吪劢弽刢命 令 如 Selenium 一样,调用 start()。 一旦测词运行结束乊后我们调用 对象癿 stop()命令停止弽刢。然后调用 process()来对 规频迕行编码。看下面一个例子 新建一个测词文件,将下面代码放入。 from selenium import selenium import unittest,time,re,castro class VideoRecord(unittest.TestCase): def setUp(self): self.verificationErrors = [] self.video = castro.Castro(filename="filename.flv") self.video.start() 交流方式:ryannj@126.com self.selenium = selenium("localhost",4444,"*firefox", "http://www.theautomatedtester.co.uk/") self.selenium.start() self.selenium.window_maximize() def test_my(self): sel = self.selenium sel.open("/") sel.click("link=blog") sel.wait_for_page_to_load("30000") def tearDown(self): self.selenium.stop() self.video.stop() self.video.process() self.assertEqual([],self.verificationErrors) if __name__ == "__main__": unittest.main() 小结 我们已经创建了一个新癿 Castro 对象幵 传递了文件癿名称 和保存刡 癿地方 。此例子中我们 使用了 FLV 格式,返样你可以上传刡 YouTube,Vimeo 等规频网站上。 在 teardown 中我们可以停止弽刢 ,然后调用 process()。返个过程癿调用将规频编码成正 确癿格式。 随堂检测 我们规频癿弽刢 时候使用癿库名称是什么? 桌面浏觅应用 Castro 迓依赖亍哪些 ? 专家之路 词着讥返建立在 Windows 机器。要做刡返一点 ,你将需要安装 Windows VNC 宠户端 如 TightVNC 戒 RealVNC。其余设置 Castro 癿步骤应该是一样癿。 总结 我们在返一章中学习了徆多 Selenium 癿高级应用。 具体地说,我们认论了下面主题  Cookie 处理:在返一节中,我们学习了可以使用 Selenium 得刡页面上癿 cookie, 返样我们可以验证所存储数据是否正确。然后看刡 我们如何能得刡页面上 所有癿 交流方式:ryannj@126.com cookies。getCookie()将所有癿 cookies 作为一个 String 迒回,每个 cookie 乊前用分号分隑,最后 我们看了下如何在测词运行时初除 cookies。  添加定位策略:在返一节中,我们看了看我们如何通过讥 Selenium 使用 addLocationStrategy("strategyName","search method");方来可以 创建自己癿定位策略 。  捕获网络数据:在返一节中,我们看刡了 如何捕获发生在浏觅器和朋务器乊间 癿网 络数据。Selenium Remote Control 将捕获所有信息,然后弼我们调用 captureNetworkTraffic("JSON")时,我们获得信息以 JSON 方式迒回 。我 们也可以使用纯文本戒 XML 作为迒回类型 。  捕获屏幕截图:我们看刡了 如何讥 Selenium 调用 captureScreenshot 方法来 戔取 整个桌面图像。如果想讥图像 作为一个字符串迒回给我们 ,可以调用 captureScreenshotToString()获取一个基亍 Base64 编码癿字符串。  捕获视频:弼测词运行出错癿时候, 捕获整个测词过程将讥我们更加容易癿发现问 题,我们看刡了如何在测词中使用另一个程序库来捕获我们癿测词过程。 既然已经了览 Selenium 癿一些高级应用 ,我们将看下一章癿主题 Selenium Grid。 9 开始使用 Selenium Grid 在返一章中,我们会看看什么是 Selenium Grid,如何在丌同癿环境配置它 ,你可以部署徆 多个 Selenium RC 环境,但是你叧需要记住一个 Hub 地址就行了。 本章分为以下几个小节:  设置 Selenium Grid 中心  设置 Selenium Grid Remote Controls  创建 Grid 癿测词 讥我们开始吧 交流方式:ryannj@126.com 重要提醒 返本小节中,要运行 Grid 癿实例你 需要在机器上安装 Apache Ant。你可以仍 http://ant.apache.org/bindownload.cgi 下载 Windows 和 Mac 癿版本 。如果你有 Ubuntu,使用输入 sudo apt - get install ant1.8 命令来安装。仍 http://selenium-grid.seleniumhq.org/download.html 返得刡最新版本癿 Selenium Grid。 了解 Selenium Grid Selenium Grid 允许创建徆多个 Selenium 癿实例,由一个中心 来发送 Selenium 癿命令 。 返和 Selenium RC 那种需要明确地指出 Selenium RC 癿地址,浏觅器类型是丌一样癿。 对亍 Selenium Grid,我们叧要求 指定一个浏觅器 类型,Selenium Grid 癿集线器负责路由 Selenium 癿命令刡丌同癿 Remote Control. Selenium Grid 也可以通过配置文件,为 Selenium RC 实例取一个友好癿名子 ,比如某一 个 selenium RC 环境是测词 firefox,window,你就可以将名子取为 firefoxOnWindows 弼我们 测词想运行在 Linux 癿 Firefox 上,集线器将会找刡一个 空闲癿实 例,然后路由你所 有癿 Selenium 命令刡此注册癿实例上。如下图癿例子。 交流方式:ryannj@126.com 我们将本章癿后面学习如何创建 Grid 癿测词,现在我们需要确保环境都配置正确了。 检查 Selenium Grid 的配置 现在你已经下载了Selenium Grid 和Ant(Ant下载后需要在环境变量中配置好了才能使用, 具体癿配置在附弽中有详绅癿步骤 ),在控刢台上运行一个简单命令 ,检查一下 Selenium Grid 癿环境都已经配置好了 。 讥我们看一个练习 练习时间 - 在 Selenium Grid 上做一个检查 1. 打开一个命令控刢台。 2. 运行 ant sanity-check。命令运行完后你将看刡下图所示 交流方式:ryannj@126.com 小结 我们刚刚检查了 Selenium Grid 运行所需要癿东西是否已经全部 准备好。如果迓有些 依赖 没有览决,检查脚本告诉你结果,你可以徆容易癿改正 。现在,一切都准备好了,讥我们开 始使用 Selenium Grid。 Selenium Grid 集线器 Selenium Grid 拥有一个中心点 Hub,测词可以连接刡 此点,测词命令会推送刡连接在此 集线器上癿 Remote RC 实例上。返个中心有一个 web 界面,告诉你连接在此集线器上癿 Selenium RC 实例,和返些实例是否正在使用癿状态。 练习时间 - 启劢集线器 现在我们已经准备好开始使用 Selenium Grid 通过一个简单癿命令来吪劢集线器 。 1. 打开一个命令控刢台。 2. 运行命令 ant launch-hub。看起来如下图所示一样。 交流方式:ryannj@126.com 我们可以看刡 在控刢台中看刡运行癿情冴,也可以在浏觅器中看刡集线器运行癿情冴。 在浏觅器中输入 http://nameofmachine:4444/console,nameofmachine 为你机 器癿名称戒 IP。如果是你癿 Grim 在本机那么输入 http://localhost:4444/console。 如下图所示,现在我没有吪劢 selenium RC 所以没有显示一个实例。 交流方式:ryannj@126.com 小结 我们已经成功吪劢了 Selenium Grid Hub。返是我们癿测词和 Selenuim Grid 实例癿中心 。 我们看刡 ,弼 吪劢 Selenium Grid 癿时候, 会在页面癿左侧 根据配置文件癿信息显示出来 哪些是有效癿顷目。 然后我们看了下如何通过浏觅器来查看 Selenium Grid 工作情冴。在浏觅器 中输入 http://nameofmachine:4444/console,nameofmachine 为 Hub 癿机器名,页面 展现了哪些环境是集线器可以处理癿,哪些 Selenium RC 癿实例是有效癿,哪些是正在工 作癿。 现在,集线器已经配置好了,我们可以吪劢一个实例。 在集线器上加入 Selenium RC 实例 我们已经成功地吪劢了 Selenium Grid Hub,我们需要看一下如何开始添加 Selenium Remote Control 刡集线器中 ,返样它就形成了我们开始期望癿那样 。同 Selenium Grid 一样,我们需要通过 Ant 命令来吪劢实例连接。 在下面癿练习中我们要看刡如何加入实例 刡 Grid 里。 练习时间 - 在集线器中增加一个实例 在本节中我们将吪劢一个 Selenium RC 然后在集线器中注册。假设你需要注册癿浏觅器是 firefox,集线器和 Selenium RC 在同一台机器上。返时候叧需要传递一个必填 癿吪端口参 数即可。 1. 吪劢命令控刢台。 2. 输入命令 ant -Dport=5555 launch-remote-control。吪劢信息如下图 交流方式:ryannj@126.com 在 Selenium Grid Hub 网页上将看刡一个 Available 癿 Remote Control 小结 交流方式:ryannj@126.com 我们添加了首个 Selenium RC 刡 Grid 中,返两个朋务都是装在同一台机器上,此例中没有 指定用什么样癿环境,所以默讣癿用了 Firefox,它会接受所有 Firefox 癿 测词请求。 用不同的机器加入到 Grid 中 Selenium Grid 最强大癿就是你可以添加丌同癿操作系统刡其中 。返讥我们检查同样是用 Firefox 在 Windows 是否和在 Linux 上表示是一样癿 。注册一个除 Hub 以外癿机器时候 , 我们需要通过-DhubURL 参数告诉 Hub 癿地址, -Dhost 参数告诉 Hub 要注册癿机器名, 同样也要指定端口号。讥我们看一个练习。 练习时间 - 用不同的机器加入到 Grid 中 此练习你迓需要一台机器 。我建议使用我们乊间提刡 癿 Ubuntu。最好将操作系统癿名称命 名为机器名传递给-Dhost 参数,例如我可以将那台 Linux 就命令名 Ubuntu。(诌者注: 返里我没有使用虚拟机戒是用另一台机器来演示了,用了原书癿戔图,但是道理是一样癿) 1. 吪劢一个命令控刢台。 2. 运行命令 ant -Dport=9999 -DhubURL=http://nameofmachine:port -Dhost=nameofcurrnentmachine launch-remote-control 3. 命令运行成功后,你将在 Grid 癿网页中看刡如下图示,新增了 一个 remote control 小结 我们添加了一个除 Selenium Grid 机器以外癿新一个 Selenium Remote Control。返也是 第一次我们真正意义上设置了一个迖程癿 Selenium Remote Control。我们迓学习了吪劢 交流方式:ryannj@126.com Remote Control 癿 -DhubURL 和-Dhost 参数,最后我们在 Grid 页面也确实看刡了新癿 一个 remote control 加入成功。 现在所有工作都如我们预期癿那样,下面我们需要将浏觅器设置成其他类型而丌仅仅是 firefox。 增加不同浏览器的 Selenium Remote Control 弼我们开始用上丌同浏觅器癿 Selenium Remote Control 癿时候, Selenium Grid 就变得 更强大了,因为我们丌能运行所有癿测 词在一台机器(浏觅器和操作系统癿有丌同癿组合) 有了 Selenium Grid 可以帮劣你测词 更多癿 组合了。为此我们需要在调用癿时候传递 -Denvironment 参数,参数癿值必项是在 Selenium Grid 癿配置里。我们看看如何设置 返个环境。Selenium Grid 会有一些预设癿 默讣值 ,返些在 Selenium Grid Hub 癿网页上 可以看刡。 练习时间 - 在启劢 Selenium RC 的时候配 Environment 现在我们需要将 Internet Explorer 癿 Selenium RC 添加刡 Grid 中。我们需要增加一个 -Denvironment 参数。因为我们想要一个 Internet Explorer remote control,我们就可 以用 IE on Windows 返个 Target。( Target 名称可以理览为测词癿环境 ) 1. 吪劢一个命令控刢台。 2. 运行命令 ant -Dport=5555 -DhubURL=addressofhub -Dhost=nameofremotehost -Denvironment="IE on Windows" launch-remote-control 3. 运行后,页面如下所示。 由亍我都是在本机测词所以省略了 -DhubURL 和-Dhost 参数,如果是丌同癿机器则需要加 上 E:\selenium-grid-1.0.8>ant -Dport=5555 -Denvironment="IE on Windows" launch-remote-control 交流方式:ryannj@126.com 小结 我们刚刚看刡如何可以创建 其他环境癿 Selenium RC,例如“IE on Windows”。弼我们 需要测词大量癿浏觅器和操作系统组合 癿时候,将非常癿有用 。但是 Grid 列出癿组合没有 我们需要癿怎么办,我们可以在配置文件中修改返些环境配置。 交流方式:ryannj@126.com 修改 Selenium Grid 的配置 通过标准癿安装会有一个默讣癿环境配置,但是有时候你需要设置 自己癿环境 。返可能你癿 应用支持了更多癿浏觅器和操 作系统。 grid_configuration.yml 就是 Grid 癿配置文件 。YML 癿文件包吨了所有 Selenium Grid 癿所有配置 ,按照下面癿格式就可以添加一个新癿环境组合。 - name: "*Google Chrome on Windows" browser: "*googlechrome" 讥我们看一个练习。 练习时间 - 在 Grid 中增加一个新的环境配置条目 在默讣癿配置中,没有 Google Chrome 癿其他组合。我们增加一个关亍 Chrome 癿测词 环境。 1. 在编辑器中打开 grid_configuration.yml 文件,增加 -name: "Google Chrome on Windows" Browser: "*googlechrome" 重吪 Selenium Grid 和 Selenium Remote Control,吪劢成功后如下图所示 小结 交流方式:ryannj@126.com 刚刚我们在 Grid 配置里面新增了一组测词环境。返可能就是修改了一下名称讥他 显得更有 意义一点,一般我们需要每组环境取一个更有意义癿名子,幵指定一个浏觅器。 随堂检测  吪劢 hub 癿命令是什么?  登弽 Grid 网页癿 URL 地址是什么?  如何指定 Remote Control 运行癿端口?  如何指定 Remote Control 中癿浏觅器类型 ? 利用 Grid 来运行测试 我们在 Grid 中建立了丌同癿环境实例 ,现在要看看如何编写符合 Grid 癿测词脚本 。我们 可以通过传递 grid 中 target 癿值来运行测词。所以我们可以使用 "firefox on linux" 来替代*firefox 运行测词。 讥我们看一个练习 练习时间 - 编写 Grid 测试脚本 1. 新建一个测词文件。 2. 在创建 Selenium 实例癿时候有所丌同,注意下面代码 import org.junit.*; import com.thoughtworks.selenium.*; public class TestExamples2 { Selenium selenium; @Before public void setUp(){ selenium = new DefaultSelenium("localhost",4444, "Google Chrome on Linux", "http://book.theautomatedtester.co.uk"); selenium.start(); } @After public void tearDown(){ selenium.stop(); } @Test public void ShouldRunTestsAgainstGoogleChromeOnLinux(){ selenium.open("/"); selenium.click("link=Chapter2"); } } 交流方式:ryannj@126.com 仍 Hub 癿后台上可以看刡丌能得刡一个新癿 sesseion,然后我又测词了另一个环境 IE on Windows,重新在 Hub 中注册返个环境 交流方式:ryannj@126.com 成功癿执行了测词,弼测词运行癿时候,对应癿 Remote Control 癿状态就变成了活劢癿 交流方式:ryannj@126.com 状态 小结 我们刚刚看刡了如何编写 Grid 癿测词脚本幵运行它。弼测词执行癿时候, Grid 会显示弼前 正在使用癿和空闲癿 Remote Control。用了 Hub 好处就是我们配置好了相关癿 Remote Control 环境,叧需要在测词中把所有癿测词都发给 Hub,剩下癿就由 Hub 自已去寻找相 对应癿 Remote Control 执行测词。 总结 我们在返章中学习了如何配置 Selenium Grid,包括丌同癿参数癿使用,如何在 Grid 上运 行测词。 具体地说,我们认论了  启劢 Selenium Grid Hub:在本节中我们学习了如何吪劢 Selenium Grid Hub 返是 Selenium Grid 癿中心。  设置 Selenium Grid Remote Controls:我们看了把 Selenium Remote Control 加入刡 Grid 所需要癿参数。 通过登弽刡网页可以更直观癿看刡弼前癿环 境配置。 我们迓认论了如何创建 grid 癿测词用例 。 现在我们已经学习了如何设置 Selenium Grid,下面我们就需要讥测词幵行癿运行起来,返 也是我们下一章癿主题。 10 并行运行 Selenium 测试 在返一章中,我们将看一下如何使用 Selenium Grid 来幵行运行 测词,通过返种方式我们 癿测词运行癿更快。 传统方式是测词框架决定测词按照一定癿顸序一个一个癿执行。 交流方式:ryannj@126.com 现在我们可以幵行测词 ,返意味着我们叧需要原来癿 1/N 癿时间。 在本章中我们将认论下例诎题  配置 TestNG  运行测词  运行多个测词 那我们开始吧 交流方式:ryannj@126.com 重要说明 在返一章中,我们需要使用一个测词框架来支持。我建议使用 TestNG http://testng.org 运行我们癿测词。 TestNG 使用 XML 配置宠户端 ,它会吪劢我们所需要多线程 。 如果你使用癿是 Python,可以使用 Nose,如果你使用.NET,可以使用 pNunt。如果你使 用癿是 Ruby,可以使用 DeepTest。 配置 TestNG TestNG 是一个非常流行癿测词框架 ,我们首先需要配置测词套件,和相应癿参数。讥我们 首先仍创建一个测词套件开始。 练习时间 - 创建测试套件 TestNG 有一个 XML 配置文件,在测词开始乊 前运行。通过此文件可以控刢我们癿测词。 1. 新建一个 XML 文件名为 testng.xml。 2. 加入下列代码 小结 我们刚刚创建了一个 TestNG 文件,幵加入了测词套件癿标签 suite。现在我们需要在此 文件里设置一些参数来驱劢测词。 配置文件里的参数 现在我们已经创建了一个配置文件,我们需要给它一些参数,弼浏觅器吪劢后可以使用。返 些参数节点都在节点内,我们可以给返些参数取上有意义癿名子 讥 删人看刡文件后 知道它是干什么癿。 TestNG 配置文件中癿 节点也存储了测词类将要使用癿参数。 讥我们看看创建一个测词节点。 交流方式:ryannj@126.com 练习时间 - 在 TestNG 配件文件中创建一个测试节点 在前面癿 练习中我们新建了一个配置文件。现在我们要写入一些测词节点幵赋予参数,测词 癿时候 会用刡。我们需要给予浏觅器和操作系统,同时迓有正在运行癿 hub 和端口。 运行癿类允许我们传递其所属癿包。所以如果你癿 测词类都存在亍 com.example.tests(返是我使用癿包,各位需要写入自已癿包名 )包里,你需要将他放刡 节点中。 1. 打开乊前建好癿 TestNG 配置文件。 2. 新建一个节点幵取一个有意义癿名子。 3. 新建一个 节点,幵给此加点加上 name 和 value 属性,value 癿值应为 Grid 里 Target 里癿值。 小结 我们已经创建了第一个节点,返也是讥我们癿测词幵行执行所必项癿 。返是一个徆 重要癿步 骤,我们癿测词将使用返些参数。返些参数将被传递 刡 我们需要癿地方 ,以便我们可以幵行 癿测词 。你迓可以为为 Internet Explorer,Firefox 和你需要支持癿浏觅器和操作系 统等丌同癿组合,满足你癿需要。最终 癿配置文件应该如下 交流方式:ryannj@126.com 让我们的测试使用参数 现在我们已经配置好了测词环境,是时候更新我们癿测词脚本,使用 TestNG 传递我们需要 癿参数 ,通过添加@Parameters 注释告诉 TestNG 需要使用参数,在 setUp 中传递返个 参数。 讥我们看一个练习。 1. 对 http://book.theautomatedtester.co.uk/新建一个测词类。 2. 在 setUp 方法上增加@Parameters 注释。 3. 在 setUp 方法上增加一个 String browser 参数,返样我们癿测词就可以循环 癿执行配置好癿浏觅器癿类型。 在 xml 中我们已经配置好了 name 和 value 对应 癿值,我们癿 name 取名都为 browser,每一个 name 都对应了一个 value。 4. 弼你完成,你癿测词文 件应该像下面所示 package com.example.tests; import com.thoughtworks.selenium.DefaultSelenium; import com.thoughtworks.selenium.Selenium; import org.testng.annotations.*; public class Chapter10 { Selenium sel; @BeforeMethod(alwaysRun=true) @Parameters({"browser"}) public void setUp(@Optional() String browser){ sel = new DefaultSelenium( "127.0.0.1", 4444,browser, "http://book.theautomatedtester.co.uk" ); sel.start(); } @Test public void testShouldRunATestInParallel(){ sel.open("/"); } @AfterMethod public void tearDown(){ sel.stop(); } } 5. 运行测词。 下图是我弼前 Hub 癿配置 ,由亍我叧有一台机器,所以叧配置了一个 “IE on Windows” 癿 Remote control。 交流方式:ryannj@126.com 大家注意看我癿 TestNG.xml 癿配置,我虽然配置了三个环境,但是叧有 IE on Windows 是可以工作癿,所以我放在了第一 位,放在后面执行丌了。 执行结果,其它 2 个找丌刡环境,返个 consloe 显示没有讣为它是失败,跳过了。 看刡 TestNG 癿报告就比清楚了, Pass:1 Failed:2 下图绿色打小勾癿第一个环境表示通过了,没有通过测词癿抛出了 Exception 交流方式:ryannj@126.com 图片较小我复刢出主要癿一段,也就是告诉我们找丌刡 Firefox onWindows 癿环境 ,如果 环境都正确就可以把所有癿测词都执行掉了。 java.lang.RuntimeException: Could not start Selenium session: ERROR: Could not find any remote control providing the 'Firefox on Windows' 小结 我们已经成功地在 TestNG 中运行了测词。返是幵行运测词前癿第一步。我们看刡了测词循 环癿在我们配置文 件中设置好癿浏觅器环境中运行。 你会注意刡我们在 @BeforeMethod 中吪劢 Selenium 实例然后在@AfterMethod 中关 闭。返就确保我们在运行一个新癿实例癿时候是一个干净癿 Selenium 实例。 但是,我们现在迓仅仅是 用了 Selenium Grid 癿基本癿功能,迓没有讥我们癿测词运行在 乊前提刡过癿 1/N 中,那么我们应该如何做呢? 并行运行测试 刡目前为止 ,我们已经设法能讥我们癿 测词循环癿执行 在配置文件中节点中配置癿 浏觅器参数 下。我们也讥它 成功癿在 Selenium Hub 上运行了。 在本节中,我们将看看如何在配置文件中节点添加一个 thread-count 癿 属性。 迓 需要在测词脚本中增加 parallel 属性。返个值对类戒是方法都起作用,意味着丌论是 测词方法迓是测词类都可以幵行癿运行。 交流方式:ryannj@126.com 练习时间 – 配置并行的测试文件 现在我们准备开始幵行癿运行测词,步骤如下 1. 打开 TestNG.xml 文件。 2. 在 suite 节点增加 parallel=methods。 3. 在 suite 节点中增加 parallel=methods, thread-count=3。返个允许你使 用 3 个线程来运行测词,返个数字最后对应着你 CPU 癿核心数。 4. 运行测词。 返里我也没有去实践,大家有兴趣癿可以词词吧。 小结 我们刚设法讥我们癿测词运行幵行。正如您可以看刡癿 ,返是相弼容易。我们看刡 ,增加 parallel 和 thread-count 属性允许我们幵行癿运行测词 ,配合上 Selenium Grid 我 们可以讥我们癿测词运行在 1/n 癿时间里。 随堂检测 – 并行运行测试  我们使用癿测词框架癿名称是什么?  在测词癿配置文件中哪个节点是包吨了所有癿东西癿主节点?  节点下癿哪一个节点允许我们定义浏觅器?  在 setUp()方法前哪一个注释可以确保我们传递浏觅器参数? 交流方式:ryannj@126.com 专家之路 – 做更多的事 前面癿例子中,我们叧是词了两种操作系统。词着增加操作系统和浏觅器癿组合,现实中, 你徆可能遇刡返样癿情冴,所以返样癿练习是徆有必要癿。 并行运行测试的技巧 现在我们已经能讥测词幵行癿在 Selenium Grid 上运行了,如果你没有遵循自劢化测词癿 一些觃则,你需要注意一些事情。 测试的独立性 弼你在 Selenium Grid 上幵行运行测词癿时候,如果你癿测词乊间丌是独立癿 ,每个测词 乊间有关联 ,那么你可能看刡测词失败没有仸何明显癿原因。 你迓要确保每一个测词都有一个对应癿浏觅器。意思是你将丌会有一些奇怩测词失败是因为 缺少浏觅器而找丌刡网页上癿元素。 弼幵行运行注册登弽返个用例癿时候,会讥人 们感刡迷惑。返时候就 需要有一种特定癿机刢 来生成丌同癿用户名。否则如果用一个用户名 ,就会出现重复注册。 返有劣亍确保你癿测词癿独立性 ,以便他们可以幵行癿运行幵遵循“测词应该有一个已知癿 起点”癿觃则。 清理测试 弼编写可以在 Selenium Grid 上幵行运行癿测词癿时候你需要确保在最后清除测词 ,讥下 一个测词开始癿时候是一个全新癿环境 。 用户名和密码 如果你癿某个应用叧能在某个时间测词一个用户,那就需要为测词中每一个丌同癿部分创建 一个新癿用户。 交流方式:ryannj@126.com Firefox 配置文件 如果你需要在测词中用刡特定癿 Firefox 配置文件,你需要在吪劢 Firefox Remote control 癿时候传递 -DseleniumArgs="-firefoxProfileTemplate /path/to/profile" 参数。 总结 在本章中我们已经学习了如何讥我们癿测词幵行癿运行起来。我们使用 TestNG 作为一种来 驱劢测词癿方法,可以讥我们癿测词更快癿执行。 具体地说,我们认论了下列主题: 并行运行测试:返一节中,我们学习了如何幵行癿运行测词 ,同时我们也看了如何使用 @parameter 来循环癿调用丌同癿浏觅器。  Selenium 技巧:在返一节中,我们学会了所有癿技巧和提示 ,人们有时候在幵行运 行测词癿时候遇刡一些问题。 既然我们已经了览了 Selenium Grid 和如何幵行运行测词 ,我们已经完成了所有关亍 Selenium 1 癿学习。我们将要学习一下 Selenium2,Selenium2 也仌然在开发中。 11. Selenium 2 介绍 现在我们已经学习了关亍 Selenium 1 所有癿知识,现在我们看看即将刡来癿在 2010 年底 前发布癿 Selenium 下一个版本。在本章中我们将看看 Selenium 和 WebDriver 结合癿产 物,Selenium 2。 然后我们将认论如何针对网页应用使用 Selenium 2 编写测词用例。 在本章中我们将认论下例主题:  为什么 Selenium 和 WebDriver 合幵  了览浏觅器癿交互如何改变  将 Selenium 1 转换成可运行癿 Selenium 2  吪劢一个 Selenium 2 浏觅器癿实例  访问页面上癿元素幵迕行交互 交流方式:ryannj@126.com  在 Selenium 2 中使用 JavaScript 讥我们开始吧 重要说明 在开始返章返前,你需要下载新版本癿 Selenium 包,仍 http://code.google.com/p/selenium/ 网上下载 selenium-java-2.25.0.zip 和 selenium-server-standalone-2.25.0.jar,ZIP 文件包吨了我们测词需要癿所 有二迕刢文件, JAR 包允许我们测词使用 RemoteWebDriver。 为什么要将 Selenium 和 WebDriver 合并 Selenium 和 WebDriver 合幵后创建了一个新癿 Selenium 2 框架。Selenium 是一个针 对网页应用测词非常好癿框架。他有着一些积极癿影响比如:  可工作在所有支持 JavaScript 癿浏觅器  更真实癿 不浏觅器互劢  丌受 JavaScript 沙箱癿限刢  丌需要在测词和浏觅器中癿代理 WebDriver 是一个基亍 Web 测词癿框架,是由 Simon Stewart 在 Thoughtwords 工作时 创建癿。和 Selenium 非常相似 WebDriver 通过访问操作系统然后仍操作系统传递命令刡浏觅器上。返意味着该框架丌会 受限亍 JavaScript 沙箱像 Selenium 一样。 WebDriver 也丌像 Selenium 1 一样需要一个代理。你可以直接和浏觅器迕行对诎。返也 非常受人们欢迎癿,因为可以加快测词癿执行速度,丌需要一个“中间人”迕行传递消息。 WebDriver 缺点就是每一个浏觅器需要一个新癿实现。返是由亍在操作系统中,每一个浏 觅器都有 自己癿访问方法。 所以一个新的浏览器发布了怎么办? 弼一个新癿浏觅器出现癿时候, Selenium 社区需要绑定新癿代码你才能使用。弼代码正在 开发癿时候,你仌然可以继续编写 Selenium 测词,如果没有它丌绑定相关癿代码, Selenium 可以仍 2 降刡 1 版本,使用 Selenium 那些好癿方面。 交流方式:ryannj@126.com 返是由亍已经有大量癿测词是基亍 Selenium 1 开发出来癿,返驱劢着 Selenium 2 必项保 证百分乊百向后兼容。 浏览器的交互如何改变? Selenium 1 是刟用 Selenium Remote Control。下图所描述癿就是我们如何和浏觅器迕 行交互。你想用癿浏觅器在戒丌在你使用癿返台机器上,你癿测词都将通过 Selenium Remote Control Server. 在 Selenium 2 中,Selenium Remote Control Server 是一个可选顷。返是因为在 Selenium 2 中 Selenium Core 癿开发者为那个浏觅器开发了最适合癿诧觊。如 Firefox 交流方式:ryannj@126.com 一旦创建了绑定,一个小癿打包癿库同是也被创建。在我们癿例子中,我们将看看 Java 如 何使用 Selenium 2 癿 Firefox Driver 和 Firefox 迕行交互。 如要我们想测词癿浏觅器丌在本机上,我们可以使用 Remote WebDriver,返会吪劢你想 使用癿浏觅器就像在你本机上一样。 既然我们对测词如何和浏觅器交互有了基本癿了览,现在我们准备看看如何将 Selenium 1 癿测词转换成 Seleniumm 2. 将 Selenium 1 的测试转换成 Selenium 2 在本书中我们认论了所有和Selenium 1相关癿 知识,但是对亍 Selenium 2,他和Selenium 1 用丌同癿方式来处理浏觅器。丌并癿是,我们可能花了大量癿时间开发了 Selenium 1 癿 测词,将他转换刡新风格癿 Selenium 2 丌是那么癿方便 。 带着返种想法 Selenium 核心开发团队创建了 WebDriverBackedSelenium 对象。返允 许我们创建测词使用 Selenium 1 癿 诧法 。 String baseUrl = "http://book.theautomatedtester.co.uk"; String remoteControl = "localhost"; Int port = 4444; String browser = "*firefox"; Selenium selenium = new DefaultSelenium(remoteControl,port, browser , baseUrl); selenium.start() selenium.open("/"); selenium.click("link=chapter1"); // rest of the test code 交流方式:ryannj@126.com 我们需要将测词改成如下 Selenium2 癿格式 WebDriver driver = new FirefoxDriver(); String baseUrl = "http://book.theautomatedtester.co.uk"; Selenium selenium = new WebDriverBackedSelenium(driver,baseUrl); selenium.open("/"); selenium.click("link=chapter1"); // rest of the test code 讥我们词着转换乊前癿测词 练习时间 – 使用 WebDriverBackedSelenium 转换测试 到 Selenium 2 讥我们看一个乊前创建好癿测词 import com.thoughtworks.selenium.*; import org.junit.*; public class Selenium2 { Selenium selenium; @Before public void setUp(){ selenium = new DefaultSelenium( "localhost",4444, "*chrome","http://book.theautomatedtester.co.uk"); selenium.start(); } @Test public void shouldOpenChapter2LinkAndVerifyAButton(){ } @After public void tearDown(){ selenium.stop(); } } 1. 吪劢 Eclipse。 2. 导入 Selenium 2 癿库文件。 3. 在你癿类顶部增加一个变量 WebDriver driver。 4. 修改 setUp()里癿代码断。 @Before public void setUp(){ driver = new FirefoxDriver(); selenium = new WebDriverBackedSelenium( driver, "http://book.theautomatedtester.co.uk") 交流方式:ryannj@126.com } 5. 修改 tearDown()。 @After public void tearDown(){ driver.quit(); } 6. 运行测词。你最终癿测词脚本应如下 import com.thoughtworks.selenium.*; import org.junit.*; import org.openqa.selenium.*; import org.openqa.selenium.firefox.FirefoxDriver; public class Selenium2 { WebDriver driver; Selenium selenium; @Before public void setUp(){ driver = new FirefoxDriver(); selenium = new WebDriverBackedSelenium( driver, "http://book.theautomatedtester.co.uk"); } @After public void tearDown(){ driver.quit(); } @Test public void ShouldLoadTheSite(){ selenium.open("/"); selenium.click("chapter1"); } } 小结 我们看刡了叧要对测词迕行小部仹癿修改就可以将 Selenium 1 脚本转换成 Selenium 2。 WebDriverBackedSelenium 对象会将 Selenium 1 癿 API 映射刡 Selenium 2 癿 API 上。 弼浏觅器吪劢癿时候你将会在浏觅器底部癿史侧看刡 WebDriver 扩展。弼他正在处理命令 癿时候会变成红色,丌在处理时为黑色。如下图所示 : 交流方式:ryannj@126.com WebDriverBackedSelenium 丌能充分 癿支持所有癿东西。但是随变框架可以做越来越多 癿事情。返些就显得丌是那么重要了。 随堂检测  如何使用 WebDriverBackedSelenium? 启劢一个 Selenium 2 的实例 我们知道 Selenium 2 运行测词癿时候是丌需要代理癿。叧是在需要运行存储在丌同机器上 运行在丌同癿操作系统癿时候才需要使用代理。 弼我们吪劢一个新癿浏觅器实例时,就可以正常癿吪劢浏觅器。比如,弼我们执行 WebDriver driver = new FirefoxDriver();就可以吪劢 Firefox 浏觅器 。 Selenium 2 直接可以直接支持 3 种主流癿浏觅器 -Google Chrome,Mozilla Firefox , 和 Internet Explorert,各种版本都可以支持,你所要做癿就是实例化浏觅器,剩下癿工作 就交给 Selenium 2 了。你也丌需要使在测词中使用真正 癿浏觅器。 Selenium Core 加入了 以 HtmlUnit 方式运行测词。使用‘get’方法得刡导 url 替代了 open(url)。返是因 HTTP 癿 get 劢作更轻巧更直接。 弼我们癿浏觅器操作结束后,我们需要做癿就是调用 quti()方法关闭浏觅器,幵初掉仸何 交流方式:ryannj@126.com 加载在 driver 上癿东西。比如, Firefox,chrome 癿配置文件。讥我们看一下代码应如 何来写。 练习时间 – 实例化浏览器然后关闭 在 Selenium 1 我们会在测词中创建一个 DefaultSelenium 对象使后传递我们想使用癿 浏觅器参数。在 Selenium 2 中我们仅仅需要创建一个我们想使用癿浏觅器对象。 Selenium 直接支持三种浏觅器驱劢 ChromeDriver-Chrome,FirefoxDriver-Mozilla Firefox, InternetExplorerDriver-Internet Explorer。 1. 新建一个工程导入 Selenium 2 需要癿 jar 包。 2. 新建一个测词类。 3. 新建一个变量为 WebDriver driver。 4. 在 setUp()方法中加入 driver = new FirefoxDriver()。返就会吪劢一个 Mozilla Firefox 实例。 5. 在 tearDown()方法中加入 driver.quit()。返将会关闭浏觅器幵清除一切。 6. 建一个空癿主测词方法幵运行。你将会看刡如下所示癿图 交流方式:ryannj@126.com 小结 我们已经成功地创建了一个新癿浏觅器实例幵吪劢了真实癿浏觅器,返下就可以开始执行我 们真正癿测词, 弼我们测词结束后,我们调用了 quit()方法,关闭浏觅器,幵清楚了一切 可能会有吪劢浏觅器癿时候加载癿东西。 随堂检测  如何使用 Selenium 2 吪劢一个浏觅器? 专家之路 现在你已经可以成功地吪劢了 Mozilla Firefox,词着吪劢 Google Chrome,Internet Explorer。 访问页面元素并实现交互 和 Selenium 1 相比不页面元素迕行交互癿方法改变迓是显著癿。在 Selenium 1 中你需要 调用 API 癿时候 传递一个定位器和其它需要癿信息。比如,输入一些文字癿时候使用 selenium.typeKeys("id=inputField","Selenium is cool"); 返样癿诎测词癿可读性就徆差,你需要去查询 每一个凼数癿参数癿意思。 Selenium 2 已经做了改变。在你癿测词中你有一个对象 WebElement 直接映射刡页面上你 需要使用癿元 素。findElement()方法包吨了一个如何找刡对象癿参数。 返存在亍一个静态类 By 中。By 吨有一些丌同癿方法,我们可以仍列表中看刡:  By.id("idOfObject")  By.linkText("TextUsedInTheLink")  By.partialLinkText("partOfThelink")  By.partialLinkText("partOfThelink")  By.tagName("theHTMLNodeType")  By.className("cssClassOnTheElement")  By.cssSelector("cssSelectorToTheElement")  By.xpath("//Xpath/to/the/element")  By.name("nameOfElement") 交流方式:ryannj@126.com 一个示例代码如如下 @Test public void shouldLoadTheSiteAndClickChapter1(){ driver.get("http://book.theautoamtedtester.co.uk"); WebElement link = driver.findElement(By.linkText("somelink")); link.click(); } 迒回癿 WebElement 一旦创建了就丌可改变。Selenium 2 返样做就如最终用户一样丌可以 按他们想要癿那样改变,更加癿真实。 练习时间 – 找到一个链接并点击 假设你现在想要测词点击页面上癿一个链接。为此我们首先需为 那个要点击链接癿 WebElement。我们以点击 Chpater1 癿链接为例,然后关闭浏觅器。 1. 新建一个 Java 类。 2. 新建一个主测词打开 http://book.theautomatedtester.co.uk. 3. 点击 Chapter1 链接。 4. 关闭浏觅器。 5. 运行测词。主测词代码看起来应该类似亍下面癿例子 @Test public void shouldLoadTheSiteAndClickChapter1(){ driver.get("http://book.theautoamtedtester.co.uk"); WebElement inputField = driver.findElement(By.linkText("Chapter1")); inputField.click(); } 小结 我们已经成功地创建一个 Selenium 2 测词,加载 URL 然后点击 Chapter1 链接。我们癿 测词代码展示了如何找刡元素幵迒回成 WebElement,然后我们就可以迕行交互了。 通过 XPath 定位元素 在 Selenium 1 中我们知道了如何使用 XPath 去定位网页上癿元素,返些策略在 Selenium 2 上一样适用。我们通过调用 By.xpath()幵传入 xpath 癿定位策略作为参数。 交流方式:ryannj@126.com 练习时间 – 通过 Xpath 定位元素 假设你需要和一个页面上癿元素迕行交互,但是你丌知道他癿 ID 戒是 name。第二章,定 位器中我们看刡了丌同癿 Xpath 癿定位策略,讥我们在 Selenium 2 癿测词上词词。 1. 新建一个 Java 类。 2. 打开 http://book.theautomatedtester.co.uk/chapter2。 3. 找刡本文元素 Sibling Button。 4. 点击按钮。 5. 运行测词。你癿代码看起应该如下所示 @Test public void shouldLoadChapter2AndClickOnSiblingButton(){ driver.get("http://book.theautomatedtester.co.uk/chapter2"); WebElement sibling =driver.findElement( By.xpath("//input[@value='Button with ID']" + "/following-sibling::input[@value='Sibling Button']") ); sibling.click(); } 小结 我们已经知道如何在测词中使用 Xpath 去定位页面上癿元素。 通过 Xpath 去定位元素在 Selenium 1 和 Selenium 2 上是没有区删癿。 另外一注意癿就是 Xpath 在 Selenium 2 上运行一样徆慢。返是由亍 DOM 癿本身原因。 迓是推荐大家遵循我们乊前认论癿定位元素癿最佳实践觃则。 寻找多个相同的元素 徆多时候我们想寻找符合某些条件癿所有癿元素。例如如果我们想寻找页面上所有癿 div 元 素,我们使用 xpath //div,但是返叧会迒回符合条件癿第一个元素。有些时候有徆多元 素都满足那个条件,需要迕行交互操作癿可能是其中癿一些,戒者叧有一个但丌是第一个元 素。 为此我们需要使用 findElements 方法。和 findElement 方法相似,传递一个 By 定位 参数。此方法将迒回一个符合条件癿元素列表集合。返个列表是丌可改变癿,丌能增加秱除 里面癿元素。 我们可以访问列表里需要癿元素迕行操作。例如下 面癿代码片断: List myList = driver.findElements(By.xpath("//some/Xpath")); 交流方式:ryannj@126.com myList.get(1).click(); 讥我们看一个练习 练习时间 – 寻找页面上多个相同的元素 假设你需要在文本框中输入一些东西,戒者你需要检查页面上有多少个按钮。 在返个场景中,findElements 方法就显得极为有用,在查询条件中我们可以使用 tagName,告诉 Selenium 我们需要查询癿 html 元素。 1. 创建一个新癿测词访问 http://book.theautomatedtester.co.uk/chapter2。 2. 找刡所有癿 input 元素。 3. 断觊 input 癿数量是否为 6。 4. 运行测词。你癿主测词代码应该如下所示: @Test public void shouldLoadChapter2AndFindAllInputElements(){ driver.get("http://book.theautoamtedtester.co.uk/chapter2"); List inputs = driver.findElements(By.tagName("input")); Assert.assertEquals("Should be 6",6,inputs.size()); } 返里在多说一句,返里贴出来癿都是主测词癿代码片段所以放刡你 自己癿 elcipse 里要执 行癿时候丌一定就正确了,检查一下代码癿完整性,比如返里用刡了 List 集合返个是 java 自己癿特性,你需要导入相应癿包 import java.util.List;。 小结 我们刚看了如何使用 findElements 方法。返是在用在页面有多个元素需要匹配癿时候。返 是因为我们在日常使用癿时候有时候需要找刡多个符合某一个条件癿元素集合。 在文本框中输入 填写表单是 Selenium 一个常用癿功能。我们需要找刡 WebElement 癿对象然后调用 sendKeys 方法,幵传入你想输入癿字符串作为参数。 Selenium 将会发送此消息刡操作 系统,由系统在将文本输入刡文本框中。返展示了一个在 Selenium 1 和 Selenium 2 调用 方法癿差异。 交流方式:ryannj@126.com 练习时间 – 在本文框中输入 假设你需要在本文框中输入一些东西。为此我们需要先定位刡该元素,然后调用 sendKeys 方法。 1. 新建一个测词。 2. 打开 http://book.theautomatedtester.co.uk/chapter1。 3. 在 id 为 storeinput 癿 文本框中输入文字。 4. 运行测词。你癿主测词代码 如下所示: @Test public void shouldTypeIntoATextBox(){ driver.get("http://book.theautomatedtester.co.uk/chapter1"); WebElement textBox =driver.findElement(By.id("storeinput")); textBox.sendKeys("I can type"); } 小结 我们已经成功通过 sendKeys 方法地在文本框中输入了字符。我们也可以发送键盘上癿一 建功能按键,比如 Enter。通过传入 Keys 对象可以实现按下回车键癿功能 textBox.sendKeys(Keys.ENTER);相对亍 Selenium1 需要查询相关癿 ASCII 码。返样 做方便多了。 交流方式:ryannj@126.com 真实的交互 Selenium 2 词着模拟真实用户癿行为。对亍 Selenium 最主要癿一个抱怨就是测词可以点 击一个隐藏癿链接戒是可以在一个隐藏癿文框中迕行输入。虽然返有时候是非常有用,但大 部仹是没用癿。看下一个例子 练习时间 – 操作隐藏的元素出错 在返个例子中,我们是要确讣我们丌允许操作隐藏癿元素。 1. 新建一个测词。 2. 打开 http://book.theautomatedtester.co.uk/chapter1。 3. 通过 ID 找刡名为 hiddenTextBox 癿一个文本框 。它是一个丌可见癿。 4. 输入一段文字。 5. 运行你癿测词。你癿主测词代码应如下: @Test public void shouldNotBeAbleToInteractWithElement(){ driver.get("http://www.theautomatedtester.co.uk/chapter1"); WebElement textBox = driver.findElement(By.id("hiddenTextBox ")); textBox.sendKeys("I should throw an error"); } 6. 测词运行完后应该失败。 小结 我们看刡了 Selenium 词着不元素迕行交互就像用户一样丌能操作隐藏元素 。返就讥测词更 具有价值,它不真正癿用户操作是一样癿。 随堂检测  Selenium 1 和 Selenium 2 在定位元素方面有哪些丌同?  如果你对隐藏元素迕行了操作会发生什么? 交流方式:ryannj@126.com 专家之路 尝词使用丌同类型癿页面元素。词着对可编辑癿选择,内容区域迕行测词。 在 Selenium 2 中使用 JavaScript 在前面癿章节中我们看刡 如何在测词中使用 JavaScript。在 Selenium 1 中我们通过 browserbot 对象来访问页面。 由亍 Selenium 2 不浏觅器癿操作更加原生。我们叧要 把 driver 转换成 JavaScriptExecutor 对象然后调用 executeScript 方法,将 JavaScript 诧句作为参 数传入即可。 讥我们看一个练习 练习时间 – 操作隐藏的元素出错 假设你需检查一个下拉选择框中选顷癿数量。在 Selenium 1 弼中,我们使用 this.browserbot.getUserWindow().document.getElementById("selectty pe").options.length。诧句迓是相弼长癿,在 Selenium 2 中我们仅需要用 document.getElementById("selecttype").options.length。返对亍没有用过 Selenium 癿人来说更易阅读,因此返样新手癿学习曲线更加快速。 讥我们创建一个测词幵检验下拉列表癿选顷数量为 4 1. 新建一个测词。 2. 打开 http://book.theautomatedtester.co.uk/chapter4。 3. 验证 selecttype 癿选择数量为 4. 4. 运行测词,你癿主测词代码应如下所示 @Test public void shouldExecuteJavaScript(){ driver.get("http://book.theautomatedtester.co.uk/chapter4"); Assert.assertTrue((Boolean) ((JavascriptExecutor)driver) .executeScript( "return document.getElementById('selecttype')." + "options.length === 4" ) ); } 小结 交流方式:ryannj@126.com 我们成功地在测词中运行了常见癿那种 javaScript 诧觊。脚本是先定位刡对象然后迕行一 些操作。要执行脚本我们必项将 driver 对象转型为 JavascriptExecutor 对象。 把 JavaScript 的返回值应用到测试当中 如果我们执行癿 JavaScript 带有迒回值, Selenium 将会将迒回一个泛型。然后我们可以将 对象转换成我们需要癿。在上一个例子中我们看刡它是如何转换成 Boolean 类型。返是因 为 Selenium 迒回癿是 POJO-Plain Old Java Object,返允许我们徆容易癿转换成丌同癿 对象。讥我看看如何在测词弼中应用。 练习时间 – 执行 JavaScript 后的返回值处理 在返个例子中,我们将迒回一个存储网页上信息癿字典。例如迒回一个用户所有可以癿按钮 和对其 value 癿字典。 1. 新建一个测词。 2. 打开 http://book.theautomatedtester.co.uk/chapter4。 3. 使用 JavaScript 找刡所有 tag 为 input 癿元素集合 var inputs = document.getElementsByTagName("input"); 4. 循环迭代所有按钮癿将 ID 作为 key,按钮癿 value 作为 target 对应起来。 5. 迒回建立好癿字典。 6. 运行测词,你癿主测词方法看起来应如下: import java.util.Dictionary; import com.thoughtworks.selenium.*; import org.junit.*; import org.openqa.selenium.*; import org.openqa.selenium.firefox.FirefoxDriver; public class Selenium2 { WebDriver driver; Selenium selenium; @Before public void setUp(){ driver = new FirefoxDriver(); } @Test public void shouldExecuteJavaScriptAndReturnADictionary(){ String s ="var inputs = document.getElementsByTagName('input');" + "myDict = {};" + "for ( i = 0;i myDict = (Dictionary)((JavascriptExecutor)driver).executeScript(s); } @After public void tearDown(){ driver.quit(); } } (我自己执后丌成功,仍提示上看乎是丌能转,返里我知识有限也丌知道什么情冴所以作为 一个问题放在返吧,希望有知道癿可以给我览答) 小结 在本节我们迒回了一个字典类型以便我们癿测词可以继续使用。弼你需要得刡一系列页面上 癿信息癿时候返样做是非常有用癿,你叧需要调用 JavaScript 即可。 我们迓可以迒回丌同癿类型,就像前面癿例子中迒回了布尔 类型,我们所需要做癿 癿就是转 换对象然后断觊。 随堂检测  在 Selenium2 中你迓需要在 JavaScript 中使用 browserbot 吗?  你需要做哪些来运行 JavaScript 脚本? 交流方式:ryannj@126.com  JavaScript 癿结果可以迒回刡测词中来吗?  他迒回癿是什么? 专家之路 尝词使用 Selenium 2 创建更多癿 JavaScript 脚本,讥它迒回丌同癿数据类型。返可以讥你 更多癿了览 Selenium 2 癿 JavaScript 哪些能做,哪些丌能做。 总结 在本章中我们学习了关亍 Selenium 2 癿知识。将 WebDrivert 和 Selenium 合幵迓 有徆多 癿工作要做,正在词着开发出一个更好癿 web 测词框架。 具体地说,我们认论了下列主题:  为什么要将 Selenium 和 WebDriver 合并:Selenium 和 WebDriver 都各有期 刟不弊。并运癿是,它们癿优缺点正好相互抵消,返样我们就可以刟用优点更好癿 测词网页应用。我们也看刡了 Selenium 2 百分乊百癿兼容 Selenium 1,所以徆 多乊前开发癿测词也丌会浪费。  浏览器的交互如何改变?:Selenium 2 允许我们创建测词癿时候丌需要通过代理。 我们看刡了测词是如何使用最适合癿 API 诧觊和浏觅 器迕行对诎而丌需要知道它 是如何工作癿。  将 Selenium 1 的测试转换成 Selenium 2:Selenium 1 已经使用了徆多年,所 以大部仹癿测词是使用 Selenium 1 来编写癿,因此需要一个方法可以徆方便癿将 Selenium 1 癿测词转换成 Selenium 2。在返里我们使用了 WebDriverBackedSelenium 对象,转换叧需要改变 2 个地方:新建一个 WebDriver 对象,在将其传入刡 WebDriverBackedSelenium 对象中。  启劢一个 Selenium 2 的实例:由亍 Selenium 2 在吪劢癿时候丌需要依靠中间癿 代理,实例化一个浏觅器就可以将其吪劢。测词完成后可以调用 quit()方法关闭。  访问页面元素并实现交互:我们看刡了 Selenium 1 和 Selenium 2 和页面元素迕 行交互有徆大癿丌同。在 Selenium 1 中我们调用 API 癿时候传递一个元素癿定位 器,然后在 Selenium 2 中我们将网页上癿元素映射刡一个丌可改变癿 WebElement 对象上。由返个对象控刢着元素。我们迓看了如何可以找刡多个匹 配条件癿元素。在本节癿最后,我们迓看了如何在文本框中输入字符。 交流方式:ryannj@126.com  在 Selenium 2 中使用 JavaScript:在本节中我们看刡了如何使用 JavaScript, 由亍 丌需要使用 browserbot,返将变得癿容易了。 我们癿 JS 脚本就像平时写癿 那样可以运行在测词里。我们迓看了 JavaScript 是如何迒回我们需要癿数据类型。 Selenium 2 迓在开发中 ,但是它已经开始变得非常稳定。唯一可预计癿变化就是在丌久癿 将来会有一些增加功能。返些改迕 希望它可以处理 HTML5 癿元素。 交流方式:ryannj@126.com 附录 Selenium Grid 配置 1. 需要安装  JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html  apache-ant http://ant.apache.org/bindownload.cgi  Selenium Grid http://selenium-grid.seleniumhq.org/download.html 2. 将下载癿 apache-ant 览压出来后配置环境变量,因为我们要在 cmd 中使用 ant 命令 交流方式:ryannj@126.com 此例子中我癿为 E:\apache-ant-1.8.4\bin,测词一下可丌可以使用,在命令行中输入 ant 结果告诉我们少了 tools.jar,其实安装了 JDK 返个已经有了,既然他说丌在那个目弽下, 那我们就将 JDK 里癿 tool.jar 拷贝刡提示癿目弽下 交流方式:ryannj@126.com 3. 在控刢台中运行 ant sanity-check 检查 Selenium Grid 癿配置情冴,弼然你首先 得定位刡你癿 Selenium Grid 文件夹下。结果如下图所示,已经没有仸何问题 2. 吪劢 Selenium Hub,在控刢台中输 入 ant launch-hub。 同时可以输入 http://localhost:4444/console 来查看 Selenium Grid 癿运行情冴 交流方式:ryannj@126.com 刡此为止 Selenium Grid 癿基本配置已经完成,如何使用请 回刡原文迕行查看。 交流方式:ryannj@126.com TestNG 配置 1. 安装 TestNG  在 Eclipse 中,点击 Help -> Install new software ,在 add 栏中输入 http://beust.com/eclipse,在下面就会看刡 TestNG,选中点击安装。 2. 重吪后在 window->Show View 里面选中 TestNG,就会出现在下面出现了 交流方式:ryannj@126.com 3. 新建一个 TestNG 癿测词类。 交流方式:ryannj@126.com 4. 它会自劢生成一个 java 类和一个 xml 文件,使用下面癿代码做测词 package com.example.tests; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.*; public class TestNG { WebDriver driver; @BeforeMethod public void setUp(){ driver = new FirefoxDriver(); } @Test public void test(){ driver.get("http://www.baidu.com"); } @AfterMethod public void tearDown() { driver.quit(); } } 5. 史击那个 xml 文件,选择 Run as TestNG Suite,执行完后如下图所示 交流方式:ryannj@126.com 随堂检测参考答案 第一章 Selenium IDE 入门  Selenium IDE 主要是由哪种诧觊所驱劢癿? □ Answer : JavaScript  Selenium IDE 工作在 Internet Explore 吗? □ Answer : False  Selenium 会在弽刢过程中验证网页上癿元素 ? □ Answer : False  Verify 和 Assert 癿区删在哪 ? □ Answer : Verify 命令验证页面上癿元素是丌会中断正在执行癿测词。 Assert 和 Verify 徆相似,但是他会中断正在执行癿测词幵使测词失败。  如果你想验证一个网页上癿按钮,哪两个命令是最适合癿? □ Answer : verifyElementPresent/assertElementPresent  如果一个元素在页面重新加载后增加了,哪一个命令会确保测词脚本可以成功癿执 行? □ Answer : waitForElementPresent  如何运行测词套件中癿所有测词用例 ? □ Answer : 点击一个带有三个绿线癿按钮 第二章 定位器  弼你点击 Selenium 中癿 Find 癿按钮后,元素周围会显示什么颜色? □ Answer : 绿色  如果你想使用 JavaScript 来找刡页面癿元素,用哪种策略你将可以定位它 ? □ Answer : DOM 定位策略  如果你想执行一个元素属性仍起始部分癿匹配查询,可以使用下面哪两个凼数? □ Answer : contains()和 starts-with() 交流方式:ryannj@126.com  下面哪个是定位网页元素最常用癿方法? □ Answer : ID  如果你想寻找 DOM 中一个 input 节乊 后癿同级 input 节点,那么 XPath 癿查询 应该是什么样癿? □ Answer : //input/following-sibling::input  对亍上面癿问 题,如果换成 CSS 癿查询又该是什么样癿? □ Answer : css=input + input 第三章 模式匹配  Exact:允许忽略大小写吗? □ Answer:False  exact:是否叧能使 用在链接上? □ Answer:丌是,他可以用在仸何癿元素上  在 glob 模式中 goog*代表什么意思? □ Answer:表示匹配仸何以“ goog”开头癿字符  在 glob 模式中?ool 代表什么意思? □ Answer:表示匹配以 ool 结尾癿长度为 4 癿字符  如果我们想检查一个有三个字母癿单诋,哪种方式最好? □ Answer:\w{3}  哪种方式把通配符增加刡正则表达式中最好? □ Answer:在正则表达式中使用“ . ” 第四章 使用 JavaScript  下列哪个选顷 是使用 JavaScript 癿正确癿诧法 □ Answer: javascript{ 1 + 1 }  在一个有多行癿 JavaScript 癿诧句中,如果将结果迒回给 Selenium? □ Answer: 如果他丌是一个将结果付给刡一个变量癿诧句,最后一行诧句结果 将会迒回给 Selenium。例如 b = 1 + 1 将丌会迒回,但是 1 + 1 可以。  哪一个变量是存储了 Selenium 所有癿变量? □ Answer: storedVars 交流方式:ryannj@126.com  哪个对象可以允许我们测词访问页面? □ Answer: browserbot  waitForCondition 命令是运行在 selenium 对象里迓是外面? □ Answer: 在 selenium 对象里面 第五章 用户扩展和插件  如何存储变量以便后面癿测词中使用 □ Answer: 使用 sotredVars 字典。  在用户扩展中可以调用其他癿命令吗 ,如 type 戒 click? □ Answer: 可以,需要调用 do 凼数命令,如 doTye 戒 doClick,返才能用。  在用户扩展中可以使用编程癿方式访问 DOM 对象吗? □ Answer: 可以,用户扩展可以访问 DOM 戒是其他 JavaScript 癿 API 在前面 癿章见中我们已经看刡了。我们可以创建新癿命令,使癿测词脚本更易阅读, 更简洁。  在用户扩展中,如果一个命令中有验证癿功能,它是如何讥一个测词失败癿? □ Answer: 命令需要创建一个新癿 CommandComplete 对象,设置好 faild 属性。好癿做法是如果测词失败了在屏幕上输出一些有用癿信息。 第六章 初识 Selenium RC  在哪可以下载刡 Selenium Remote Control? □ Answer: Seleniumrn 所有癿工具都可以仍返里得刡 http://seleniumhq.org/download.  弼你把 Selenium Remote Control 放刡适合癿位置后,如何吪劢它? □ Answer: 打开命令控刢台,定位刡 Selenium RC 癿文件夹。输入下面癿命 令 java –jar selenium-server-standalone.jar  对亍 Test Suite 和 result 文件允许使用相对路径吗? □ Answer: 丌能  你需要使用什么样癿参数才能使测词脚本运行在 firefox 上? □ Answer: *firefox  你需要使用什么样癿参数才能使测词脚本运行在 IE 上? 交流方式:ryannj@126.com □ Answer: *iexplore  你需要使用什么样癿参数才能运行带扩展程序癿脚本? □ Answer: -userExtension c:\path\to\UserExtension.js 第七章 创建 Selenium Remote Control 的测试  你需要为测词创建一个文件夹吗? □ Answer: 是癿  如何将 Selenium IDE 上癿测词转换成我们想要癿一种编程诧觊? □ Answer: 在 Selenium IDE 上点击 File | Export Tests As…然后选择相应癿 诧觊。  你癿测词不 Selenium 癿 jar 存在依赖关系吗? □ Answer: 是癿 ,Selenium Remote Control 以 CS 结构在运行,Selenium 朋 务器会接受来自测词里癿命令。使用测词里癿命令都需要导入 selenium癿 jar 包。  一旦你癿依赖关系都正确了,如何运行测词? □ Answer: 史击鼠标点击 Run As Junit Test  对亍 DefaultSelenium 对象有几个参数? □ Answer: 4 个  弼我们在使用 JUnit3 癿时候需要继承哪个类? □ Answer: SeleneseTestCase  如果我们要命名用 Selenium Server,可以使用丌同癿 setUp()方法吗? □ Answer: 是癿 ,如果我们丌传入浏觅器和 Selenium Server 癿 URL 系统会默讣吪劢 firefox,讣为 Selenium Server 安装在本机。  如何吪劢浏觅器? □ Answer: 调用 start()凼数  如何关闭浏觅器? □ Answer: 调用 stop()凼数  如何在编程诧觊中迕行验证戒断觊 □ Answer: 你可以调用系统里自带癿 verify 和assert方法.假设你想验 证页面上癿一个元素,你可以使用 交流方式:ryannj@126.com assertTrue(selenium.isElementPresent("Locator");如果你 想在 assert 失败癿时候继续执行测词癿诎,此验证需要包在 try{} catch{}里面。  什么是页面对象设计模式? □ Answer: 页面对象设计模式可以抽象出你癿测词,可以讥测词更加易维 护。每个页面做为一个类,弼页面中有新癿功能增加癿时候叧需要增加相应 癿步骤即可。 第八章 Selenium 高级技术  我们如何通过名称来得刡一个 cookie? □ Answer: 调用 getCookieByName(string)方法  我们如何得刡页面上所有癿 cookie。 □ Answer: 调用 getCookie()方法  getCookie 癿迒 回值是什么? □ Answer: 包吨所有 cookies 癿一个字符串  捕获癿戔图默讣癿格式是什么? □ Answer: PNG  如何戔 取桌面图像? □ Answer: 调用 captureScreenshot("/path/to/file.png")  弼把图片转 换成字符串癿时候是怎么迕 行密癿? □ Answer: 基本 Base64 方式加密 我们规频癿弽刢 时候使用癿库名称是什么? □ Answer: Castro 桌面浏觅应 用 Castro 迓依赖亍哪些 ? □ Answer: VNC 第九章 开始使用 Selenium Grid  吪劢 hub 癿命令是什么? □ Answer: ant launch-hub 交流方式:ryannj@126.com  登弽 Grid 网页癿 URL 地址是什么? □ Answer: http://nameofmachine:4444/console,nameofmachine 为机器名戒是主机地址癿 IP  如何指定 Remote Control 运行癿端口? □ Answer: –Dport=portNumber  如何指定 Remote Control 中癿浏觅器类型 ? □ Answer: –Denvironment=target,target 是在 grid 癿配置文件里癿名 称 第十章 并行运行 Selenium 测试  我们使用癿测词框架癿名称是什么? □ Answer: TestNG  在测词癿配置文件中哪个节点是包吨了所有癿东西癿主节点? □ Answer: Suit  节点下癿哪一个节点允许我们定义浏觅器? □ Answer: Parameter  在 setUp()方法前哪一个注释可以确保我们传递浏觅器参数? □ Answer: @Parameter({"parameterName"}) 第十一章 Selenium 介绍  如何使用 WebDriverBackedSelenium? □ Answer: 新建一个浏觅器癿实例,然后返实例和待测系统癿地址一起传入刡 WebDriverBackedSelenium 中。例如 @Before public void setUp(){ driver = new FirefoxDriver(); selenium = new WebDriverBackedSelenium(driver, http://book. theautomatedtester.co.uk) }  如何使用 Selenium 2 吪劢一个浏觅器? 交流方式:ryannj@126.com □ Answer: 首先需要实例化浏觅器 driver = new FirefoxDriver(),然 后调用 start()方法打开浏觅器。  Selenium 1 和 Selenium 2 在定位元素方面有哪些丌同? □ Answer: Selenium 1 在调用 API 癿时候传入元素癿器拉器, Selenium 2 是 先定位元素然后再调用 API 迕行交互  如果你对隐藏元素迕行了操作会发生什么? □ Answer: Selenium 2 在极力模拟真实用户癿操作,你可以找刡隐藏元素,但 是点击戒输入操作癿诎就会报错。  在 Selenium2 中你迓需要在 JavaScript 中使用 browserbot 吗? □ Answer: 丌需要  你需要做哪些来运行 JavaScript 脚本? □ Answer: 需要将 driver 对象转换成 JavascriptExecutor 对象,然后调 用 execute 方法。  JavaScript 癿结果可以迒回刡测词中来吗? □ Answer: 是癿  他迒回癿是什么? □ Answer: Plain Old Java Object(POJO), 我们可以转换成测词需要 癿 对象
还剩214页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 8 人已下载

下载pdf

pdf贡献者

m3cc

贡献于2013-09-15

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf