WEB程序自动化

FWScript 在设计时考虑了对web程序自动化测试的支持。为了使测试更加便利和灵活,这里使用全新的方式来实现web测试自动化。传统的web测试是从编程的思维来编写测试脚本,而FWScript这里是采用的点对点(因为FWScripts解释器是以行为单位执行的)的思维来编写测试用例。这里我称为“交互式”web自动化测试。FWScript针对Web的支持主要包括下面5大模块:

  1.  web测试的状态切换
  2.  web控件的查找方式
  3.  web控件属性值的获取
  4.  web控件的动作
  5.  web窗口的操作

1. web测试的状态切换

FWScript支持Windows与Web程序自动化测试,FWScript缺省执行空间是Windows程序测试。下面介绍Windows状态与web状态空间之前的切换方式:

  •  :^<webdriver_spec> 缺省的元素空间更改为本语句指定的浏览器版本。如::^chrome 56 表示在web测试空间中启动chrome第56版本的浏览器。
  •  :^ $var 将浏览器版本写在变量中
  •  :^: 将缺省的元素空间转为windows控件。
  •  :^@ 将缺省的元素空间转回Web,使用上次指定的浏览器

2. web控件的查找方式

FWScript是一个脚本解释器, 我们根据测试需求自己定义了词法,和语法。在支持web自动化测试中,FWScript的后端是使用开源测试框架Selenium实现的。遵循selenium查找控件的理念,下面是FWScript查找控件的方式:


HTML本质上是一个DOM树结构,可以使用id、Xpath、CSS等方式直接定位到指定控件。

方式示例说明
:@/... ... :@//html/body/input 使用Xpath找到第一个符合的Element
:@Idstr :@passwd-id 使用ID值找到第一个符合的Element
:@.classname:@.input_class使用CSS样式的类名找到一个符合的Element
:@-clsssselector:@-input_class.first使用CSS的选择器找到第一个符合的Element
:@&linktext:@&百科使用链接名称文本找到第一个符合的Element
:@~partiallinktext :@~baidu使用链接中部分文本找到第一个符合的Element
:@^name :@^passwd使用标签中name属性找到第一个符合的Element
:@<tagname:@<input使用标签名称找到第一个符合的Element

注意:<input class="input_class" type="text" name="passwd" id="passwd-id" /> 为上面部分示例查找的控件

控件的查找不仅可以是点对点的精确查找, 这里引入了Element Group个概念。可以先查找一组控件, 人工维护自定义的控件组对它行增删查改。

方式示例说明
:@@dd @dd代表外部文件自定义字符串,如果没有dd,则为预置字符串
:@$Var var=".classname"使用变量里面的字符串
:@将当前系统中 focused的webElement变成当前的Element
:@*... :@*.classname寻找一组WebElement
:@dd从当前group中获取位置为dd的元素值/td>
:@*dd 将当前元素加入到group中,使用位置dd

3. web控件属性值的获取

当找到一个元素后,可以将这个元素记录在一个变量中,这个变量的类型自动为webelement,可以获取这个元素的相关信息:

代码描述
$Var.*X控件Rectangle的 X 坐标,返回float变量
$Var.*Y控件Rectangle的 Y 坐标,返回float变量
$Var.*W控件Rectangle的宽度 Width,返回float变量
$Var.*H控件Rectangle的高度 Height,返回float变量
$Var.*R返回数据源变量,该数据源包含4列,分别为X、Y、Width和Height,如果$Var为元素集合变量,则返回多组数值
$.*T获取当前控件的标签名称
$.*N获取当前控件的文本内容
$.*F当前控件是否为focused 转台,返回bool值
$.*D:当前控件是否为display,返回bool值
$.*E:当前控件是否为enabled,返回bool值
$.attr获取当前控件由attr指定的属性的值
$._css获当前控件由css指定的CSS属性的值

4. web控件的动作

与window控件动作类似, 当找到控件以后,可以针对这个控件执行很多动作。

控件动作使用方法:空间的动作主要有两种情况,一是没有参数的动作,二是带参数的动作。

(1) 对于无参动作:

首先先将需要的变量值放入 $1,$2, $3 ....(最多到$9), 然后执行动作。比如:给当前浏览器页面创建一个Cookie

$1="tom"

$2="abc123"

AddCookie

(2) 对于有参动作:

直接使用动作后面加上需要传入的变量。比如:给当前浏览器页面创建一个Cookie

AddCookie<"tom,abc123"

下面是控件动作列表

语句参数列表代码描述
ClickElement()!201 鼠标左键单击当前控件元素
DoubleClickElement()!202鼠标左键双击当前控件元素
MouseOverElement()!203把鼠标的光标移动到指定位置
SetElementText(string keys)!204输入框先清空在传值
SendKeysToElement(string keys)!205直接给输入框传值
SetElementSelected()!206单选按钮或复选框选中
SetElementNotSelected()!207单选按钮或复选框撤销
ClearSelections()!208只适用于清空所有多选下拉菜单
SubmitElement()!209提交form内表单(也可以用click代替)
DragToAndDropElement(RemoteWebElement target)!210从一个element拖拽到目标element后释放
ClickAndHoldElement()!211结合clickAndHoldElement使用释放鼠标左键
ReleaseElement()!212结合clickAndHoldElement使用释放鼠标左键
AddCookie(string name,string value)!213给当前浏览器添加一组cookie
DeleteCookie(string name, string value)!214给当前浏览器删除一组cookie
SaveScreenshot()!215根据路径保存截图
SetWindowSize(int width, int height)!216设置浏览器窗口的大小
ImplicitlyWait(long time)!217设置页面的全局等待时间
WaitForCurrentUrl(string url)!218等待直到当前页面的url与给定的url相同
WaitForTitle(string title)!219等待直到当前页面的title与给定的title相同
WaitForText(string type, string value, string text)!220等待直到页面的指定element的text与给定的相同
WaitForTextPresent(string text)!221等待直到给定的text在当前的某个未知出现
WaitForBodyText(string text)!222等待直到整个page的body与给定的相同
WaitForPageSource(string source)!223等待直到当前页面下的pageSource源码与给定的是否相同
WaitForElementPresent(string type, string value)!224等待直到页面指定的element出现
WaitForElementSelected(string type, string value)!225等待直到指定位置的下拉菜单的element被选中
WaitForElementAttribute(string type, string value, string name, string value)!226等待直到指定位置的元素下的标签属性与value值与给定的相同
WaitForElementStyle(string type, string value, string name, string values)!227等待直到指定的置的元素下的css属性与value值与给定的相同
WaitForElementValue(string type, string value, string values)!228等待直到指定位置的元素下的value值与给定的相同
WaitForCookiePresent(string name)!230等待直到某一给定的cookie成为当前的cookie
WaitForAlertText(string text)!231等待直到某一弹出窗口的text与给定的相同
WaitForAlertPresent()!232等待一个弹框出现
WaitForEval(string script, string value)!233等待直到执行一段js 返回的结果否为给定的value
Maximum()!234web窗口设置最大化

5. web窗口的操作

使用FWScript脚本对web做测试时, 为了使Tester更容易理解和方便操作,把浏览器窗口单独看做一个对象。浏览器的每个窗口有自己的属性值,从浏览器的层面上控制窗口。下面从两个部分介绍:

获取浏览器窗口的属性值

代码描述
:^.Url获取当前窗口的url
:^.Title获取当前窗口的Title
:^.Handle获取当前窗口的handle
:^.BodyText获取当前窗口的BodyText
:^.Alert获取窗口的Alerted的text如果没有则返回null
:^.PageSource获取当前窗口下的html源码
:^!script获取当前窗口执行一段js得返回值
:^.@cookiename获取浏览器的cookie

浏览器对窗口的动作

代码描述
:^后面什么参数都没有的话,表示初始化当前的元素空间,如果是Web,则关闭所有的窗口,初始化
:^/URL打开URL窗口,并将它设为当前窗口
:^/$var如果变量值为数字,则将切换到对应index的窗口,如果不是数字,则为title
:^/”string”将当前窗口切换到title为这个字符串的窗口
:^/dd将当前窗口切换到数字代表的index中。(setwin dd)
:^/将Browser的当前窗口变为Selenium的当前窗口。
:^/^将selenium的当前窗口变为系统的当前窗口
:^^更新当前窗口的列表和索引(一般在点击某个链接弹出一个新的窗口使用)
:^.刷新当前窗口
:^<当前页面后退
:^> 当前页面前进
:^!关闭当前窗口,如果是最后一个,则退出浏览器
:^!!强制退出关闭当前整个浏览器
:^!1点击alert或confirm的OK (alertOK)
:^!2 点击confirm或prompt的Cancel (alertCancel)
:^!”string”将$var或字符串的内容放到prompt 中,然后OK

补充

1. FWScript脚本中检查属性值与给定的值是否相等

在写测试用例中经常会有这种需求, 在获取窗口或者控件的属性值后, 然后核对该值与给定的参数值是否相等。FWScript脚本从语法的结构上提供了非常便利的测试方法(Verify部分)。比如,你想判断判断当前浏览器窗口的标题与给定的值是否相等,返回bool变量,你只需要做下面两步:

(1) 获取当前窗口的标题: :^.Title

(2) 判断是否相等: !($$ == title)

如下检查可以使用该方法:

名称描述
VerifyCurrentUrl判断当前的url与给定的url是否相等
VerifyTitle判断当前的title与给定的title是否相等
VerifyText判断给定element 下的text与给定的text是否相等
VerifyTextPresent判断当前element 下的text与给定的text是否相等
VerifyBodyText判断页面body 下text 与给定的text是否相等
VerifyPageSource判断当前页面下的pageSource源码与给定的是否相同
VerifyElementPresent判断给定的element是否存在
VerifyElementSelected判断给定的element是是否被选中
VerifyElementAttribute判断给定的element 标签的属性值是否给给定的相等
VerifyElementStyle判断给定的element 标签的css属性值是否与给定的相等
VerifyElementValue判断给定的element 标签的value属性值是否与给定的相等
VerifyCookiePresent判断给定的cookie name是当前的吗
VerifyCookieByName判断给定的cookie name和value是当前的吗
VerifyAlertText判断弹框中的text是否与给定的text相同
VerifyAlertPresent判断当前是否有个弹框
VerifyEval判断执行一段js 返回的结果否为给定的value

2. FWScript脚本关于Web的Assert操作

和上面的Veriy类似,FWScript脚本从语法的结构上也提供了异常操作,既当使用上面Verify检查到某个属性与给定的属性值不想等, 但是因为这个不相等使我的测试用例无法继续下去,这里我需要抛出异常来中断操作.。比如,你想判断判断当前浏览器窗口的标题与给定的值是否相等,如果相等抛出异常并且中断后面操作,你只需要做下面两步:

(1) 获取当前窗口的标题: :^.Title

(2) Assert两者的相等关系: !!($$ == title)

注意:FWScript脚本关于web的异常操作的其他方法和Verify一致, 请参考上面的Verify方法汇总

<< FWScript 键盘事件BizRunner调用说明 >>