WEB程序自动化
FWScript 在设计时考虑了对web程序自动化测试的支持。为了使测试更加便利和灵活,这里使用全新的方式来实现web测试自动化。传统的web测试是从编程的思维来编写测试脚本,而FWScript这里是采用的点对点(因为FWScripts解释器是以行为单位执行的)的思维来编写测试用例。这里我称为“交互式”web自动化测试。FWScript针对Web的支持主要包括下面5大模块:
- web测试的状态切换
- web控件的查找方式
- web控件属性值的获取
- web控件的动作
- 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 | () | !234 | web窗口设置最大化 |
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调用说明 >> |