Selenium用户指南 - 第三章 Selenium IDE[5]

 

匹配文本模式

如同定位器,模式是Selenese命令经常需要的参数类型。需要模式的命令例子,如verifyTextPresent,verifyTitle,verifyAlert,assertConfirmation,verifyText和verifyPrompt。正如上面所提及的,link定位器就是利用一个模式。模式允许你,通过特殊字符的使用,预期的文本来描述,而非精确地指定文本。

有三种类型的模式:通配符(globbing),正则表达式,以及精确(exact)

通配符模式

大部分人熟悉通配符,因为它被使用在DOS的文件扩展名或Unix/Linux的命令行,如ls *.c。在这个示例中,通配符用于显示所有存在于当前目录下的以.c扩展名结束的文件。通配符是相当有限的。只有两个特殊的字符被Selenium的实现所支持。

* 解释为“匹配任何字符”,例如,无,单个字符或多个字符

[] (字元类别)解释为“匹配任何在方括号中发现的任何一个单一的字符”。一个连字符可以用于指定一个字符范围(在ASCII字符集中连续的)的简写方式。几个示例让字元类别的功能变得清楚:

[aeiou] 匹配任何的小写元音字符

[0-9] 匹配任何数字

[a-zA-Z0-9] 匹配任和字母数字字符

在大多数其他应用的上下文中,通配符包含第三个特殊的字符?。然而,Selenium通配符模式只支持*和字元类别。

要为Selenese命令指定一个通配符模式参数,你可以给这个模式带有glob:前缀标签。然而,因为通配符模式是默认的,可以忽略这个标签仅仅指定模式。

下面是两个使用通配符模式的命令示例。在页面上实际被测试的链接的文本是“Film/Television Department”;通过使用模式而不是精确的文本,click命令将工作,即使链接的文本变成了“Film & Television Department” 或 “Film and Television Department”。通配符模式的*将匹配“任何或无”字符在单词 “Film” 和“Television”之间。

CommandTarget Value
click link=glob:Film*Television Department
verifyTitleglob:*Film*Television*

由点击超级链接到达的页面的实际标题是“De Anza Film And Television Department - Menu”。通过使用模式匹配而非精确的文本,只要单词“Film”和“Television”出现(以这个顺序)在页面标题任何地方,verifyTitle将通过。例如,页面的所有者可能缩写页面标题为 “Film & Television Department” ,这个测试仍然将通过。在链接以及其他简单测试(诸如verifyTitle )中使用模式,可以极大地减少此类测试的维护工作量。

正则表达式模式

正则表达式模式是三种Selenese支持的模式类型中最强大的模式。正则表达式也被大多数高级的编程语言支持,许多文本编辑器,许多工具,包括Linux/Unix命令行实用工具grep,sed,以及awk。在Selenese,正则表达式模式允许用户执行许多那些多其他的方法来说非常困难的任务。例如,假定你的测试需要确保一个特定的表的单元格只能包含数字。regexp: [0-9]+是一个匹配任何长度的数字的简单模式。

Selenese通配符模式仅仅支持*和[](字元类别)特征,而Selenese正则表达式模式则提供了与在Javascript中同样广泛的特殊字符。下面是这些特殊字符的一个子集:

PATTERN MATCH

. 任何单个字符

[ ] 字符类别:任何出现的括弧中的单个字符

* 数量:0或多个前面的字符(或组)

+ 数量:1或多个前面的字符(或组)

? 数量:0或1个前面的字符(或组)

{1,5} 数量:1到5个前面的字符(或组)

| 可选:在左边或右边的字符/组

( ) 分组:常用于可选和/或数量

在Selenese中,正则表达式模式需要带有regexp: 或regexpi: 前缀。前者是大小写敏感的,后者是不敏感的。

几个示例将有助于澄清正则表达式可以如何被使用在Selenese命令中。第一个使用可能是最常用的正则表达式 - “.*”。这两个字符序列可以被解释作“0次或多次出现的任何字符”或更简单地,“有或没有”。这等价于通配符模式的*(一个单一的星号)。

CommandTarget Value
clicklink=regexp:Film.*Television Department
verifyTitleregexp:.*Film.*Television.*

上面的事例在功能上与较早的、使用通配符的测试示例相同。唯一的差别是前缀(regexp: 替代了 glob:)和这“有或无”模式(.* 替代了单一的*)。

下面更复杂的示例测试Yahoo! Weather(天气)页面的Anchorage, Alaska(阿拉斯加的安克雷奇)包含的有关日出的信息。

Command Target Value
open http://weather.yahoo.com/forecast/USAK0012.html
verifyTextPresent regexp:Sunrise: *[0-9]{1,2}:[0-9]{2} [ap]m

让我们逐步地检视一下上面的正则表达式:

Sunrise: * 字符串Sunrise:跟着0或多个空格

[0-9]{1,2} 1个或2个数字(每天的小时)

:字符:(没有特殊字符涉及)

[0-9]{2} 2个数字(分钟)跟着一个空格

[ap]m “a”或“p”跟着“m”

精确匹配

Selenium的精确模式具有边际用途。它根本不使用特殊的字符。如此,如果你需要查找一个实际的*号(对通配符和正则表达式模式是特殊字符),精确模式是完成它的一种方法。例如,如果你希望从下拉列表中选择一个带标签“Real *”的选项,下面的代码可能工作也可能不工作。星号在glob:Real *模式中,会匹配任何字符或无字符。这样,如果有一个更靠前的带有标签“Real Numbers”的选择项将被选择,而不是 “Real *” 选项。


select //selectglob:Real *

为了确保 “Real *” 项被选择,exact:前缀可以使用于创建一个精确匹配模式,如下所示:

select//selectexact:Real *

当然,可以通过在正则表达式中转义*达成相同的效果:

select //select regexp:Real \*

对大多数的测试者不太可能需要查找一个*号或一对方括号(通配符中的字元类别)。因此,通配符模式和正则表达式模式对我们大多数人来说是足够的。

“AndWait”命令

一个命令和它的AndWait替代之间的区别是,规则的命令(例如click)将执行一个动作,然后尽可能快地继续到下一个命令,然而AndWait替代(例如clickAndWait)会告诉Selenium在动作完成后,等待页面被装载。

AndWait替代通常被使用在,当一个动作引起浏览器导航到另外一个页面或重新装载当前的页面的时候。

需要注意的是,如果你使用一个不会触发导航/刷新的动作的AndWait命令时,你的测试会失败。这会发生,因为Selenium会到达AndWait的超时而没有看到任何导航或刷新做出,从而引起Selenium引发一个超时异常。

在AJAX应用程序中的waitFor命令

在AJAX驱动的Web应用程序中,数据从服务器端获取,但不会刷新页面。使用andWait命令将不会工作,因为页面没有实际的刷新。暂停测试的执行一段时间也不是一个好的方法,因为Web元素可能依赖于系统的响应能力,装载或其他不可控制的因素,而出现在规定的期限的前或后,从而导致测试的失败。最好的方法是在一个动态的期限内等待需要的元素,然后一旦这个元素被发现就继续执行。

这可以完成使用一个waitFor命令,如waitForElementPresent或waitForVisible,动态地等待,每间隔一秒检查要求的条件,一旦条件满足则继续脚本中下一条命令的执行。

计算和流控制序列

当运行一个脚本时,它会简单地按顺序运行,一个命令跟着一个。

Selenese本身不支持条件语句(如if-else)或迭代(如for,while)。许多有用的测试可以无需流控制而执行。然而,对于一个动态内容的功能性测试,可能涉及到多页,编程的逻辑时常是需要的。

当流控制需要时,有三个选项:

运行脚本使用Selenium-RC和一个客户端库,诸如Java或PHP,利用编程语言的流控制功能。

在测试脚本中使用storeEval命令运行一小段Javascript代码段

安装goto_sel_ide.js扩展

大多数的测试者,使用Selenium RC API,导出测试脚本到一个编程语言文件(见Selenium IDE章节)。然而,一些组织,只要可能,更愿意直接运行从Selenium IDE他们的测试脚本(例如,当他们有许多低级别的开发人员为他们运行测试的时候,或者编程技能不足的时候)。如果这是你的情况,考虑使用Javascript代码段或goto_sel_ide.js扩展。

存储命令和Selenium变量

你可以,在脚本的开始,使用Selenium变量去存储常量。同样,当与一个数据驱动的测试设计结合时(在后面部分讨论),Selenium变量可以用于存储,从命令行、其他程序或文件,传递给你的测试程序的值。

普通的store命令是许多存储命令的基础,可以使用于存储简单的常量值在Selenium变量中。它带有两个参数,被存储的文本值以及一个Selenium变量。当选择一个你的变量的名称时,使用标准的、仅使用字母数字字符的变量命名约定。

CommandTargetValue
storepaul@mysite.orguserName

稍后在你的脚本中,你会想要使用这个存储的变量值。去存取这个变量值,将变量装入大括弧({})中,并且前置一个美元符号,像下面这个。

CommandTargetValue
verifyText//div/p${userName}

经常使用变量于存储输入域的输入。

CommandTargetValue
typeid=login${userName}

Selenium变量可以被使用于第一个和第二个参数,Selenium会先于命令执行的任何其他操作,解释变量。Selenium变量也可以用于定位器表达式中。

每一个verify和assert命令都存在一个对等的store命令。这里是几个经常使用的存储命令。

storeElementPresent

对应于verifyElementPresent。仅仅存储一个布尔值“true”或“false”,依赖于是否UI元素被发现。

storeText

对应于verifyText。使用一个定位器识别特定的页面文本。文本如果发现就存储在变量中。它可以用于从页面中抽取文本。

storeEval

该命令带有一个脚本作为第一个参数。在Selenese中嵌入Javascript在下一节讨论。这个命令允许测试存储运行脚本的结果在一个变量中。

Javascript和Selenese参数

Javascript可以应用于两种类型的Selenese参数:脚本和非脚本(通常是表达式)。在大多数的情况下,你会想要,在被使用作一个Selenese参数的Javascript代码段中,存取和/或操纵一个测试案例的变量。所有的在你的测试案例中创建的变量,都存储在一个Javascript关联数组中。关联数组具有字符串索引,而非顺序的数字索引。包含你的测试案例的关联数组被命名为storedVars。当你希望在Javascript代码段中存取或操作变量的时候,你必须引用它做storedVars[‘你的变量名’]。

Javascript的脚本参数用法

有几个Selenese命令可以指定脚本参数,包括assertEval,verifyEval,storeEval,和等待waitForEval。这些参数无需特殊的语法。Selenium IDE的用户只需简单地将一个Javascript的代码段放入到适当的域中,通常是目标(Target)域(因为一个脚本参数通常是第一个或唯一的一个参数)。

下面的示例演示一个Javascript代码段是如何应用于执行一个简单的数值计算:

Command Target Value
store 10 hits
storeXpathCount //blockquote blockquotes
storeEval storedVars[‘hits’]-storedVars[‘blockquotes’] paragraphs

下面的示例演示一个Javascript代码段可以包含对函数的调用,在这个示例中,是对String对象的toUpperCase和toLowerCase方法的调用。

Command Target Value
store Edith Wharton name
storeEval storedVars[‘name’].toUpperCase() uc
storeEval storedVars[‘name’].toLowerCase() lc

Javascript的非脚本参数用法

Javascript也可以用于生成参数的值,甚至参数没有被指定为具有脚本类型。然而,在这种情况下,需要使用特殊的语法 - Javascript代码片断必须被包围在封闭的大括弧({})中,并且带有javascript的标签前缀,如javascript {这儿是你的代码}。下面是一个示例,type命令的第二个参数置是由Javascript代码使用特殊的语法生成的。

CommandTargetValue
storeleague of nationssearchString
typeqjavascript{storedVars[‘searchString’].toUpperCase()}

echo - Selenese打印命令

Selenese有一个简单的命令,允许你打印文本到你的测试输出。这是有用的,对于提供你信息性进度说明,当你的测试正在运行时,显示在控制台。这些说明也可以为你的测试结果报告提供上下文,可以被使用于你的测试发现一个问题时,查找缺陷存在在页面的哪里。最后,echo语句可以使用于打印Selenium变量的内容。

CommandTargetValue
echoTesting page footer now.
echoqUsername is ${userName}

警告,弹出和多窗口

假定你正在测试一个页面,看起来像这样。


1<!DOCTYPE HTML>
2<html>
3<head>
4 <script type="text/javascript">
5 function output(resultText){
6 document.getElementById('output').childNodes[0].nodeValue=resultText;
7 }
8
9 function show_confirm(){
10 var confirmation=confirm("Chose an option.");
11 if (confirmation==true){
12 output("Confirmed.");
13 }
14 else{
15 output("Rejected!");
16 }
17 }
18
19 function show_alert(){
20 alert("I'm blocking!");
21 output("Alert is gone.");
22 }
23 function show_prompt(){
24 var response = prompt("What's the best web QA tool?","Selenium");
25 output(response);
26 }
27 function open_window(windowName){
28 window.open("newWindow.html",windowName);
29 }
30 </script>
31</head>
32<body>
33
34 <input type="button" id="btnConfirm" οnclick="show_confirm()" value="Show confirm box" />
35 <input type="button" id="btnAlert" οnclick="show_alert()" value="Show alert" />
36 <input type="button" id="btnPrompt" οnclick="show_prompt()" value="Show prompt" />
37 <a href="newWindow.html" id="lnkNewWindow" target="_blank">New Window Link</a>
38 <input type="button" id="btnNewNamelessWindow" οnclick="open_window()" value="Open Nameless Window" />
39 <input type="button" id="btnNewNamedWindow" οnclick="open_window('Mike')" value="Open Named Window" />
40
41 <br />
42 <span id="output">
43 </span>
44</body>
45</html>

用户必须响应alert/confirm对话框,以及移动焦点到新打开的弹出窗口 。幸运地是,Selenium可以替代javascript弹出窗口。

但在我们开始分别讨论alert/confirm/prompt的细节前,理解它们之间的共性是有益的。警告,确认和提示对话框都有下面的变种

Command Description

assertFoo(pattern) 抛出错误,如果模式不匹配弹出的文本

assertFooPresent 抛出错误如果弹出是不可得到的

assertFooNotPresent 抛出错误如果任何弹出呈现

storeFoo(variable) 存储弹出的文本到变量

storeFooPresent(variable) 存储弹出文本在变量,然后返回true或false

当在Selenium运行时,Javascript弹出窗口不会出现。这是因为函数调用在运行时实际上被Selenium自己的Javascript重写了。不管怎样,不能因为你不能看到弹出窗口,就意味着你不必处理它。要处理一个弹出窗口,你必须调用assertFoo(pattern)函数。如果你在断言一个弹出窗口的出现时失败,你的下一个命令将会被阻塞,你会得到一个错误,类似于这下面[error] Error: There was an unexpected Confirmation! [Chose an option]

警告

让我们从警告开始,因为这是最简单的需要处理的弹出。要开始,首先在浏览器中打开上面的那个样品页面,然后点击“Show alert”按钮。你会注意到在你关闭了这个alert对话框后,文本“Alert is gone."被显示在页面上。现在运行这相同的步骤,并用Selenium IDE录制下来,然后验证文本是否在你关闭警告后被增加了。你的测试看起来像这个:

Command Target Value
open /
click btnAlert
assertAlert I’m blocking!
verifyTextPresent Alert is gone.

你可能觉得“那时奇怪的,我从没有断言那个警告。”。但这是Selenium IDE处理的和为你关闭了这个警告。如果你移出那个步骤并回放这个测试,你会得到下面的错误:[error] Error: There was an unexpected Alert! [I'm blocking!]。你必须包含一个警告的断言去认可它的出现。

如果你只是想要去断言一个出现的警告,但既不知道也不在乎它包含啥文本,你可以使用assertAlertPresent。这将返回一个true或false,在为false时,将停止这个测试。

确认

确认的行为和警告的完全一致,使用assertConfirmation和assertConfirmationPresent提供如同警告的对应操作相同的特征。然而,默认地当一个确认弹出时,Selenium将选择OK。试着录制点击在相同页面的“Show confirm box”按钮,但在弹出得确认对话框中点击"Cancel"按钮,然后断言这输出的文本,你的测试看起来像这个:


Command Target Value
open /
click btnConfirm
chooseCancelOnNextConfirmation
assertConfirmation Choose an option.
verifyTextPresent Rejected

chooseCancelOnNextConfirmation 函数告诉Selenium,所有后面的确认对话框应该返回false。这可以被重置,通过调用chooseOkOnNextConfirmation。

你可能注意到,你不能回放这个测试,因为Selenium抱怨有一个没有处理的确认。Selenium IDE录制事件的顺序,引起click和chooseCancelOnNextConfirmation的顺序错误(如果你仔细考虑会认为这是合理的,在你打开确认对话框前,Selenium不知道你会取消)。只需切换两个命令的顺序,你的测试将运行良好。


© Copyright 2008-2012, Selenium Project. Last updated on Feb 02, 2012.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值