51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

楼主: ryugun
打印 上一主题 下一主题

[资料] 自己收集的一些资料,41楼贴上自己写的基于selenium的自动化框架相关的代码

[复制链接]

该用户从未签到

81#
 楼主| 发表于 2012-4-11 14:58:39 | 只看该作者
本帖最后由 ryugun 于 2012-5-8 15:34 编辑

监控linux的资源使用情况
首先,suse上要安装sar包,保证sar命令可用
创建shell脚本:collector-data.sh
#!/bin/sh

# 设置测试结果源文件的路径
REPORT_HOME=/home
SAR_FILE=$REPORT_HOME/result

if [ -f "$SAR_FILE" ]
then
  echo "Collecting the test data..."
  
  {
    #collect cpu-usage info
    sar -u -f $SAR_FILE | awk '/all/{print 100-$8}' > $REPORT_HOME/cpu-usage.xls
    if [ $? -ne 0 ]
    then
      echo "Failed in collecting CPU info!"
    else
      echo "Succeed in collecting CPU info: ${?}"
    fi
  } &
  
  {
    #collect ram-usage
    sar -r -f $SAR_FILE | awk '!/kbmemfree/&&/^([0-9]|Average)/{print ($3-$5-$6)*100/($2+$3)}' > $REPORT_HOME/ram-usage.xls
    if [ $? -ne 0 ]
    then
      echo "Failed in collecting RAM info!"
    else
      echo "Succeed in collecting RAM info: ${?}"
    fi
  } &

  #collect disk info
  {
    awk 'BEGIN{OFS="\t";print "rd_MB/s","wr_MB/s","avgqu-sz","%util"}' > $REPORT_HOME/disk-info.xls
    sar -d -f $SAR_FILE | awk '$2=="dev8-16"||$2=="dev8-32"||$2=="dev8-48"||$2=="dev8-64"||$2=="dev8-80"||$2=="dev8-96"||$2=="dev8-112"||$2=="dev8-128"||$2=="dev8-144"' | awk 'BEGIN{OFS="\t"}{sum_rd+=$4;sum_wr+=$5;sum_avgqu+=$7;sum_util+=$10;if(NR%9==0){print sum_rd/(9*2*1024),sum_wr/(9*2*1024),sum_avgqu/9,sum_util/9;sum_rd=0;sum_wr=0;sum_avgqu=0;sum_util=0}}' >> $REPORT_HOME/disk-info.xls
    if [ $? -ne 0 ]
    then
      echo "Failed in collecting DISK info!"
    else
      echo "Succeed in collecting DISK info: ${?}"
    fi
  } &

  #collect net-usage
  {
    awk 'BEGIN{OFS="\t";print "rx_MB/s","tx_MB/s","%net"}' > $REPORT_HOME/net-usage.xls
    sar -n DEV -f $SAR_FILE | awk 'BEGIN{OFS="\t"}$2=="eth0"{print $5/1024,$6/1024,($5+$6)/(1024*1.25)}' >> $REPORT_HOME/net-usage.xls
    if [ $? -ne 0 ]
    then
      echo "Failed in collecting NET info!"
    else
      echo "Succeed in collecting NET info: ${?}"
    fi
  } &
  
  echo "Collecting data is done."

else
  echo "The monitor data file is not exist!"
fi
回复 支持 反对

使用道具 举报

该用户从未签到

82#
 楼主| 发表于 2012-4-11 15:04:07 | 只看该作者
接着上面:监控linux的资源使用情况

将collector-data.sh放到/home

通过SSH输入命令:
sar -u -d -r -n DEV -o /home/result 2 200
u:cpu   
d:磁盘
r:内存
n:流量
o:保存文件的路径
2:每2秒监控一次
200:监控200次

使用上面的命令后,将会在/home/下生成一个文件result

执行collector-data.sh: ./collector-data.sh 将会在/home下生成几个excel文件,即使资源使用情况,再通过excel的制图功能把数据转化为图标即可
回复 支持 反对

使用道具 举报

该用户从未签到

83#
 楼主| 发表于 2012-4-11 15:53:42 | 只看该作者
本帖最后由 ryugun 于 2012-4-11 16:10 编辑

http://www.51testing.com/?uid-60535-action-viewspace-itemid-18423
http://www.51testing.com/?uid-146821-action-viewspace-itemid-222680
测试策略
回复 支持 反对

使用道具 举报

该用户从未签到

84#
 楼主| 发表于 2012-4-17 17:54:38 | 只看该作者
测试计划与测试方案的区别
http://www.51testing.com/?uid-15 ... space-itemid-241236
回复 支持 反对

使用道具 举报

该用户从未签到

85#
 楼主| 发表于 2012-5-2 10:51:57 | 只看该作者
WATIR脚本编写指导文档


WATIR
英文缩写“Web Application Testing in Ruby”,是一个使用 Ruby 实现的开源Web 自动化测试框架,相对于那些庞大的商业工具来说,它很小巧,也很灵活,提供的功能也足够用。它对于ActiveX插件,JavaApplets, Flash, 或者其他的插件应用程序基本不支持。Ruby语言本身是一个面向对象语言,所以使用WATIR也是面向对象的思想在里面。WATIR支持对IE5.5,IE6.0,IE7.0,Firefox等浏览器的测试。

XX项目使用WATIR实现WEB自动化测试。WATIR这个自动化框架是一种编程语言,没有其他WEB自动化框架的录制功能。所以动作都需要使用语言进行控制。这样虽然在自动化中没有其他框架方便,但是纯脚本的控制可以使WEB自动化与XX项目的业务相结合,融合到原有的自动化框架中。实现了业务+WEB+CLI多种自动化模式。但是在WATIR语言编写中遇到了一些问题,例如ID根据页面信息自动分配,这样就导致了无法通过ID准确获取需要的内容。在页面复杂的情况下,HTML语言内大量的使用了<div>,CSS样式等较高级的技术。界面的操控难度上大大的提高了。本文重点介绍一下在编写过程中遇到的问题以及解决方式。

1
WATIR API使用方法

由于WATIR是RUBY的一个类库,所以也继承了RUBY面向对象的特性,所以当使用WATIR查找到某个页面时,WATIR获取到一个大对象,将这个页面内所有的组件根据HTML的结构组织成一个树形结构存放在对象中,根节点就是<html></html>,可以通过“.”的方式一层一层的向下检索,也可以使用id等组件的唯一标识直接找到这个组件,然后调用属于这个组件该有的操作。在WATIR中可以实现对按钮、链接、表格、文本框、复选按钮、单选按钮等操作。在WATIR里面找到一个组件有几个方式,可以使用组件的name、id、xpath、index等。上述几个为通用的,有些还有其他属性,例如对于超级链接还可以使用text,url等进行检索。WEB自动化测试主要依靠于WEB界面HTML语言显示出来的结果,对于name、id、text、url都是通过HTML语言对组件的定义得到的。对于xpath、index等需要根据当前页面的结构得到。Index表明这个组件在整个页面出现的序列号,例如在一个页面中出现三个文本框,如果我要检索到第三个文本框,这个文本框在没有id,name等标识情况下就可以使用index为3形式进行索引,从而找到这个文本框。。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集,而每个组件的路径表达是唯一的。所以可以通过XPATH直接找到所要操作的组件。

回复 支持 反对

使用道具 举报

该用户从未签到

86#
 楼主| 发表于 2012-5-2 10:52:51 | 只看该作者
接着上面

l
text_field,对应HTML标签为<input></input >:

browser.text_field(:id, "wushan").exists ,判断文本框是否存在;

browser.text_field(:id, "wushan").value,得到文本框的值;

browser.text_field(:id, "wushan").set(“www”),向文本框输入内容。

l
button,对应HTML标签为<button></button >:

browser. button (:name, "box1").exists,判断按钮是否存在

browser .button(:id,"posixShare_input").click,点击一个按钮

l
checkbox,对应HTML标签<input type ='checkbox' ></input>:

browser. checkbox (:name, "box1").exists,判断checkbox是否存在

browser.checkbox(:name, "box4").value,返回checkbox的值

browser. checkbox(:name, "box4").set 选中checkbox

l
radio,对应HTML标签<input type =‘radio’></input>:

browser.radio(:name, "box1").exists,判断radio是否存在

browser.radio(:name, "box5", 1).set 设置radio

browser.radio(:name, "box3").isSet ,检查radio是否被设置

browser.radio(:name, "box1").getState 获取radio的状态,有两个返回值true,false

l
link,对应HTML标签为<a></a>;

browser.link(:text, "test1").click,点击一个链接

browser .link(:index, 1).href,查看一个链接的地址



l
table,对应HTML标签如下,<table>为表格定义开始,<tr></tr>定义一个行,<td></td>定义一个为列,一行里面可以包含多个列即<td></td>。

<table>


<tr>


<td>Row 1 Col1


<tr>

</table>


t=browser.table(:id, 'ext-comp-1004')
,找到一个表格


t.rows.each do|h|
,使用循环遍历表格的每一个行,每一个行有h表示,do是RUBY基本的语法,可以参考循环语句,而此时h变量是一个属组,如果想找到这一行的第一列可以h[1]来找到。如果不使用循环语句进行遍历行,也可以使用而为属组的形式直接找到相应的行和列,例如t[1][1],找到的是表格的第一行第一列。

l
div,对应HTML标签<div></div>,DIV通常与CSS使用,DIV标签可以把文档分割为独立的、不同的部分。它可以用作严格的组织工具,并且不使用任何格式与其关联。

browser .div(:id,"ext-gen21"),找到相应的DIV。

l
如果用 id 或 class 来标记<div>,那么该标签的作用会变得更加有效。在使用CSS来定义样式。然后DIV中CLASS指定包括的代码段是属于那个样式。iframe,对应HTML<iframe></iframe>:

HTML中frame将页面进行分割,每个分割后的框是一个完整的html。

browser.frame(:id,"usredit_Frame") 找到相应的frame

l
contains_text

browser. contains_text(“abc”),这个函数功能是在当前整个页面寻找是否存在abc这个字段。

l
fire_event,用这个函数可以触发事件以及SCRIPE脚本

browser.div(:id,1).fire_even(“onmousedown”),这个DIV有一个鼠标事件,但是DIV的属性与button以及click不一样,所以这个地方只能调用DIV提供的鼠标事件。

以上每个组件在页面内的使用方式以及标签属性都通过HTML页面来定义,有些属性可能不存在id,name等属性。

回复 支持 反对

使用道具 举报

该用户从未签到

87#
 楼主| 发表于 2012-5-2 10:54:23 | 只看该作者
1
XX项目WATIR使用举例1.1
查询组件

WEB界面操作,找到需要操作的组件是很重要的。找到组件之后才能根据组件的属性进行设置或者查询。由于WATIR在获取到一个界面时,会将这个界面所有的信息封装到一个对象里面,根据面向对象的思路,就可以找到组件。

(1)
因为组件的属性有id,name,value,xpath,如果要获取组件有明确的id,name,value,xpath等树形。那么根据属性的唯一标识直接找到这个组件,从而对组件进行操作。使用IE.start启动页面,这个函数以对象返回该页面HTML的树形结构,如果此时操作中变换到其他页面,browser这个对象值也会跟着改变。

browser =Watir::IE.start("http://www.baidu.com”)

browser.button(:id,”submit”),这样就可以找到IDsubmit的组件了。同样name,value,xpath只需要改变“:”后面的定义就可以了,其中XPATH前面介绍过任何一个组件都可以通过XPATH形式进行查找。

(2)
WATIR语法返回一个属性结构,在查找一个节点时可以从他的根节点一层一层的向下索引,这种方式对于组件ID自动生成有很好的效果,虽然组件存在ID,但是根据不同的情况该ID会变更,但是HTML节点位置是不会改变的,所以对于处理组件ID动态变更情况可以使用该种方法。

例如:


<div id=”test”>

<div>


aaa

</div>

<div>


<Ahref=”www.baidu.com”>baidu</A>

</div>

</div>

根据以上这个例子如果想找到baidu的超级链接并点击超级链接进入baidu页面,通过ID,name的方法是无法获取到。可以使用两种方法,一种是由于这个页面只有一个超级连接,所以只用index号为1找到这个链接:

browser.link(:index,1).click

另外一种是可以根树形结构一层一层向下查找,通过对界面观察,可以找到与元素相近的根也就是idtestdiv,这个div对象下面包含两个div,由于两个div都没有参数,所以这里使用index号找到第二个div标签,然后根据链接的index号找到链接。

browser.div(:id,”test”).div(:index,2).link(:index,1).click

回复 支持 反对

使用道具 举报

该用户从未签到

88#
 楼主| 发表于 2012-5-2 10:55:54 | 只看该作者

(1)
由于有些组件没有id,name等唯一标识这种情况下可以使用XPATH这个参数找到组件,看似复杂的语法,但是在FIREFOX中有插件可以直接找到组件对应的XPATH。使用XPATH查询组件曾经有一个问题是随着网页的变化组件的XPATH可能会更改。在XX项目自动化中很少使用该种进行查找。

回复 支持 反对

使用道具 举报

该用户从未签到

89#
 楼主| 发表于 2012-5-2 10:57:40 | 只看该作者

路径表达式:

  

表达式

  
  

描述

  
  

nodename

  
  

选取此节点的所有子节点。

  
  

/

  
  

从根节点选取。

  
  

//

  
  

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。

  
  

.

  
  

选取当前节点。

  
  

..

  
  

选取当前节点的父节点。

  
  

@

  
  

选取属性。

  
回复 支持 反对

使用道具 举报

该用户从未签到

90#
 楼主| 发表于 2012-5-2 10:58:27 | 只看该作者

实例:

  

路径表达式

  
  

结果

  
  

/bookstore/book[1]

  
  

选取属于 bookstore 子元素的第一个 book 元素。

  
  

/bookstore/book[last()]

  
  

选取属于 bookstore 子元素的最后一个 book 元素。

  
  

/bookstore/book[last()-1]

  
  

选取属于 bookstore 子元素的倒数第二个 book 元素。

  
  

/bookstore/book[position()<3]

  
  

选取最前面的两个属于 bookstore 元素的子元素的 book 元素。

  
  

//title[@lang]

  
  

选取所有拥有名为 lang 的属性的 title 元素。

  
回复 支持 反对

使用道具 举报

该用户从未签到

91#
 楼主| 发表于 2012-5-2 10:58:59 | 只看该作者

实例:

  

路径表达式

  
  

结果

  
  

/bookstore/book[1]

  
  

选取属于 bookstore 子元素的第一个 book 元素。

  
  

/bookstore/book[last()]

  
  

选取属于 bookstore 子元素的最后一个 book 元素。

  
  

/bookstore/book[last()-1]

  
  

选取属于 bookstore 子元素的倒数第二个 book 元素。

  
  

/bookstore/book[position()<3]

  
  

选取最前面的两个属于 bookstore 元素的子元素的 book 元素。

  
  

//title[@lang]

  
  

选取所有拥有名为 lang 的属性的 title 元素。

  
回复 支持 反对

使用道具 举报

该用户从未签到

92#
 楼主| 发表于 2012-5-2 10:59:13 | 只看该作者
  

//title[@lang='eng']

  
  

选取所有 title 元素,且这些元素拥有值为 eng lang 属性。

  
  

/bookstore/book[price>35.00]

  
  

选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00

  
  

/bookstore/book[price>35.00]/title

  
  

选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00

  
回复 支持 反对

使用道具 举报

该用户从未签到

93#
 楼主| 发表于 2012-5-2 10:59:45 | 只看该作者
1.1
表格内组件查询、触发javascripe事件

有很多情况下表格不会单独只有数据,可能在表格内存在复选框,按钮,超级链接等组件。在这种情况下的组件通常没有ID或者ID会根据其他参数有所改变。这样在给自动化处理上就带来一些难度。如下图所示,mliu为创建的一个命名空间,如果想删除这个命名空间就一定要点击前面的复选框。


下图所示为插件显示该组件的信息,可以发现这个“复选框”实际上是一个div的,并不是checkbox,但是界面通过css样式的形式具有checkbox的功能。这个div并没有idname等属性。


这种情况下由于每次操作的表格项不一样,所以需要逐条循环。选择“名称”为mliu的行,并找到第一列的元素,到这里找到了一个<TD>。这个<TD>下面包含一个div(上图左面红色部分),根据index号这样就找到了这个文本框。但是此时又有一个问题出现了,这个图形表现是一个复选框,但是从HTML来看只是一个DIV,那么他就不具有checkbox的功能和动作。如果是一个简单的checkbox,可以使用set方法将这个checkbox选中。从右图红色标识可以看到这个DIV存在一个”onmousedown”的鼠标事件,那么勾选的动作是通过这个鼠标实现触发的。所以找到这个div之后需要调用fire_even(“onmousedown”)这个函数触发鼠标事件,这样这个元素就勾选上了。

t=ie.table(:id,"namespaceGrid")


t.rows.each do|h|



if h[3].text.strip ==
"mliu"


h[1].div(:index,1).fire_event("onmousedown")


break


end


end

另外,在确定查找某行或者某列时,一定要观察好这个表格的结构。有可能对外显示的是35列,但是实际上在HTML有一些隐藏的行和列,所以要看好元素真正的行和列,否则会查找失败,脚本报错。

回复 支持 反对

使用道具 举报

该用户从未签到

94#
 楼主| 发表于 2012-5-2 11:00:25 | 只看该作者
1.1
frame的使用

对于在复杂的WEB界面,其实是有很多个独立的HTML组成的,把这些独立的HTML组成在一起的是<iframe>标签。在查找一个组件时一定不要被界面的“外表”所蒙蔽,有可能这个组件在某一个frame中。所以当使用IE.start或者IE.attch找到一个页面时,首先要分析这个页面显示的结构,如果要是存在多个<iframe>标签,要找到所查找组件是否在哪个frame中,然后再按照3.1的方式进行查找组件。

例如下面这段代码中,是一个frame中嵌套另外一个frame,所以要索引到baidu的超级链接,不能通过ie.link(:index,1)的方式查找,必须要找到这个超级链接所对应的页面后,才能找到元素,根据下面代码也可以知道,每个iframe内嵌套了一个完成的HTML,所以要使用ie.frame(:id,”a1”),frame(:id,”namespace”).link(:index,1).click,这样就能找到这个超级链接了。


<html>


<iframe id=”a1”>


<html>


<iframe id=”namespace”>


<html>


<ahref=”www.baidu.com”>baidu</a>

</html>


</iframe>


<html>


</iframe>


</html>

2
经验总结、对规范的建议等

在对WATIR自动化开发过程中,还是有一些问题现在WATIR解决不了,应该是WATIR之后的最新的版本不支持这种情况。

1、
例如对于class_name这个属性如果存在两个值之间用空格隔开的情况,只能获取到class_name值的第一个值,空格后面的值就获取不到。这个应该是WATIR不支持多个class_name情况。

对于FLEXFLASE等无法使用WATIR进行RUBY自动化,所以对于新版本ISM的用户管理选择管理资源这个功能现在无法实现。
回复 支持 反对

使用道具 举报

该用户从未签到

95#
 楼主| 发表于 2012-5-2 20:44:17 | 只看该作者

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

该用户从未签到

96#
 楼主| 发表于 2012-5-2 21:38:14 | 只看该作者

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

该用户从未签到

97#
 楼主| 发表于 2012-5-3 21:52:42 | 只看该作者

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

该用户从未签到

98#
 楼主| 发表于 2012-5-3 21:57:30 | 只看该作者
回复 支持 反对

使用道具 举报

该用户从未签到

99#
发表于 2012-5-3 22:11:07 | 只看该作者
感谢分享
回复 支持 反对

使用道具 举报

该用户从未签到

100#
 楼主| 发表于 2012-5-10 13:50:24 | 只看该作者
http://www.51testing.com/html/45/n-813345.html
浅析Java web程序之客户端和服务器端交互原理
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-23 01:55 , Processed in 0.082878 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表