问题:鼠标右键如何测试?

使用 selenuim2library 如何测试鼠标右键单击?我使用的是smartclient组件

以下面的页面为例

http://smartclient.com/#cellClicks

右键单击表格中第一行,弹出对话框。

执行测试用例的命令行参数如下:

-d out -v WEBSERVERIP:smartclient.com -v WEBSERVERIP_PORT:80 -v BROWSERTYPE:gc  -v BROWSERHUB:10.10.10.10 -v BROWSERHUB_PORT:4444

 

下面是测试用例,始终报 “右键未弹出对话框”

Continue reading “问题:鼠标右键如何测试?”

robot framework开发和调试关键字

使用了一段时间的robot framework,感觉工具的应用理念和扩展性,灵活度都很不错。使用过程中也发现了一些问题,在ride上开发测试用例的确很方便,但是编辑底层的关键字和运行时的调试非常不便。想请中文站上的高手提供这方面的经验。比如使用某个IDE去开发调试底层的关键字和作为整个测试用例运行时的调试。万分感谢

Robot Framework中对出错用例处理的策略

原文地址:http://blog.sina.com.cn/s/blog_654c6ec701016363.html

  • 出错后退出

   在默认情况下,当一个测试用例中的某个关键字返回错误时,这个测试用例就停止执行剩余的关键字。RF会继续执行下一个用例。这么做的好处是节省时间–反正这里出问题要返回来看了,再继续执行剩下的关键字也没有用了。

  • 出错后继续执行

    但是,有时候,我们却需要执行用例中的所有关键字,例如:要获取更多的出错信息、更改某些全局相关的变量、做teardown或者rollback操作等。这时候,我们就可以使用BuiltIn库中的关键字来让特定关键字出错后RF仍然执行用例中剩余关键字。

第一个关键字是:Run Keyword And Continue On Failure

假设我们有个关键字叫做 Mykeyword

我们这样使用:

 Run Keyword And Continue On Failure  Mykeyword
 Log  这一句被执行

这样,不管Mykeyword这个关键字是否fail,下一个关键字Log都会被执行。

如果Mykeyword有返回值,我们可以这么使用:

 ${str}  Run Keyword And Continue On Failure  Mykeyword
 Log  ${str}  

  • 获取关键字执行结果后继续执行 

   有时候,我们需要获取某个关键字的执行结果,然后根据结果做不同后续操作,这个时候,我们就会用到关键字Run Keyword And Ignore Error 。假设我们要执行一个关键字Mykeyword,关键字有一个返回值。我们可以如下使用:

 ${result}  ${returnvalue}  Run Keyword And Ignore Error Mykeyword 
 Log  ${result}+${returnvalue}    

Run Keyword And Ignore Error 有2个返回值${result}获取执行结果,值为PASS或者FAIL;${returnvalue}获取Mykeyword的返回值。

  • TestSuit级别出错处理

有些场合,我们想要在整个testsuit执行结束后根据执行结果做一些特殊操作。这时候,我们就用上了下面几个个关键字:

Run Keyword If All Critical Tests Passed

Run Keyword If All Tests Passed

Run Keyword If Any Critical Tests Failed

Run Keyword If Any Tests Failed

Run Keyword If Test Failed

Run Keyword If Test Passed

Run Keyword If Timeout Occurred

这些关键字有些像Java中的Finally语句,但是略有区别,大家可以在使用的时候细细体会。另外要说的是,这些关键字只能被用到Suit Teardown部分(一般会写到一个用户自定义关键字中,被Suit Teardown调用)。他们的含义通过字面我们已经能够理解,格式也跟上边的两个关键字格式一致,就不一一展开介绍了。

  • 题外话
  1. 每个用例只做一件事情是一个好习惯。
  2. 慎用Test setup和test teardown,善用Suit setup 和 Suit teardown
  3. 用户关键字很好,但尽量不要多层嵌套,2层足矣,不然你的用例组织结构就有问题。

  这样利用上述错误处理机制就基本能满足你的要求了。

  其实我想找一个关键字:在用例中任意位置,不管上面关键字执行情况如何都会执行,这样更方便,可惜没有,只能规避。享受表格语言接近自然语言的特性,就要忍受它不如高级语言灵活。

使用Robot Framework测试.net程序的方案

原文地址:http://blog.sina.com.cn/s/blog_654c6ec70100zml1.html

Robot Framework测试 .Net的方法。

1.使用IronPython写一个库,包裹被测的dll。然后在IronPython下用iybot来执行测试脚本。

IronPython版本的RF使用如下。

http://code.google.com/p/robotframework/wiki/DotNetSupport

下面有个帖子标明了如下写包裹器。

2.如果还涉及了其它库,不能用IronPython,则可以用xml-rpc的方式来完成。

有一个RF的扩展工程实现的C#的Server,可参考下面链接:

升级SeleniumLibrary到Selenium2Library

原文地址:http://blog.sina.com.cn/s/blog_654c6ec70100yjrh.html

升级的理由:

相比SeleniumLibrary,Selenium2Libarary的优势如下:

1.由于将通过起Server然后向浏览器注入JS,通过JS引擎操纵浏览器的方式改为了直接操纵浏览器接口的方式,Selenium2Library速度有了显著提升,稳定性也得到了进一步加强。

2.能够越过浏览器沙箱操控其它资源,比如:文件上传,弹出的windows窗体等。

3.因为底层的webdriver使用blocking Api( 页面请求发出后,浏览器等待结果的返回,其间不能做后续操作),那些恶心的wait和don’t wait 参数就可以扔掉了。

如果还没有听说过seleniumlibrary,可以参考这篇文章:

http://blog.sina.com.cn/s/blog_654c6ec70100tnt6.html

升级方式:

———————————————————————-

2012年2月1日补充

如果你用windows: 

https://github.com/rtomac/robotframework-selenium2library/downloads

在上面页面上下载对应的安装包,一路点击next就安装好了。后面的命令行安装方式可以略过。

————————————————————————

Github下载:

https://github.com/rtomac/robotframework-selenium2library

可以直接下载zip文件,也可以用svn工具下载源码。

在命令行模式进入下载好的文件目录(如果下载的是zip,解压到一个文件夹),执行setup.py install来安装。

如果提示错误,可能是你没有安装python的setuptools,先安装它再尝试上面步骤。

http://pypi.python.org/pypi/setuptools

验证安装是否成功:

Selenium2Library个出了一个很cool的验收测试。

我们使用它提供的验收测试就能查看是否安装成功,并且顺便测试了selenium2Library的测试。

我们可以在命令行进入它的Test子目录然后运行run_test.py python ie

这个脚本的作用其实是起了一个微型的webserver,然后用浏览器访问这个server,作为被测系统。

最后调用robotframework对这个被测系统进行测试。如果看到绝大部分pass了,说明你装好了。

建议仔细读一下test\acceptance\目录下的这些验收测试脚本。读完了,selenium2Library也就会用了。

API变更:

新增的关键字:

  • Get Selenium Speed
  • Get Selenium Timeout
  • Log Title
  • Log Location

参数改变的关键字

  • Choose File – Pulled remote files support
  • Click Button – Removed dont_wait argument
  • Click Element – Removed dont_wait and coordinates arguments
  • Click Image – Removed dont_wait argument
  • Click Link – Removed dont_wait argument
  • Double Click Element – Removed dont_wait and coordinates arguments
  • Go Back – Removed dont_wait argument
  • Open Context Menu – Removed offset argument
  • Press Key – Removed dont_wait argument
  • Select All From List – Removed wait argument
  • Select Radio Button – Removed wait argument
  • Submit Form – Removed dont_wait argument

移除的关键字

  • Flex-related keywords
  • Add Location Strategy
  • Call Selenium API
  • Capture Screenshot (better support for Capture Page Screenshot in Selenium 2/WebDriver, and conversely no support for full screen screenshot)
  • Drag And Drop (requires Advanced User Interactions API which isn’t quite ready to support this)
  • Press Key Native (requires Advanced User Interactions API which isn’t quite ready to support this)
  • Start Selenium Server
  • Stop Selenium Server
  • Wait Until Page Loaded (Selenium 2/WebDriver is blocking API, so this is not important/less important)

必读的文档:

关键字文档:
 
wiki:
 
不同:
https://github.com/rtomac/robotframework-selenium2library/wiki/Differences-From-SeleniumLibrary

使用RobotFramework的DataBaseLibrary(Java实现)

原文地址:http://blog.sina.com.cn/s/blog_654c6ec70100uifs.html

RobotFramework能用Python和Jython两条腿走路。但有的时候你得选一条。今天就碰上个问题,为了整合其它模块必须用Java实现的DataBaseLibrary

其实实它很简单,记录步骤如下:
1.在RF的主页找到DataBaseLibrary(Java)的主页。
http://code.google.com/p/robotframework-dblibrary/
下载dblibrary-1.0.jar 这个库文件
2.在Oracle的主页的download中找到JDBC的驱动程序下载下来(不同版本驱动不同,我用的10g的驱动class12.jar),或者从你安装的Oracle目录的jdbc子目录中找到驱动备用。
3.将这两个jar文件全部加入环境变量CLASSPATH
4.在RF里编写测试脚本
连接的例子如下:

Database

Setting Value
Library org.robot.database.keywords.DatabaseLibrary
Test Case Action Arguments
Test Connect to DataBase oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:sid username
password
具体使用情况可见用户手册:
http://robotframework-dblibrary.googlecode.com/svn/tags/robotframework-dblibrary-1.0/doc/DatabaseLibrary.html
两个Tip:
1.为了便于多人使用,建议使用bat动态在Classpath加入Jar包。而不是直接写到环境变量中(这样慢慢的你的classpath就乱死了)。
给一个参考例子:
set CP=%CLASSPATH%
for %%j in (*.jar) do ( call :set_cp %%j )
set CLASSPATH=%CP%
jybot –outputdir �%   –suitestatlevel 1 %*
goto :eof
:set_cp
set CP=%CP%�%\%1;
goto :eof
2.这个classLibrary是开源的,写的很粗糙,觉得不爽可以自己改一改,它的代码host在google code上
可用SVN checkout
http://code.google.com/p/robotframework-dblibrary/source/checkout

Robot Framework下DataBaseLibrary的使用

原文地址:http://blog.sina.com.cn/s/blog_654c6ec70100u9fr.html

    在Robot Framework的主页上有2个DataBase相关的扩展库,一个是Java实现,一个是Python实现。Java实现文档做的比较好,有详细说 明,也有样例文档。但是Python实现的文档太少了,搞通它得费一番周折。在折腾了一段时间后我终于把它调通顺了,做个记录,也希望能帮助别人迅速解决 问题。需要说明的是:我是用的oracle数据库。

  • 工作原理

任何一个Robot Framework的Library基本上都是一个双层结构:外层的皮,实现标准接口供Robot Framework调用;里面的瓤,实现具体的功能,提供API供外层的皮进行封装。

DataBaseLibrary也不例外,你从它的主页Download标签处下载的只是一个皮。

为了使它能够真正工作,你还得下载一个瓤———一个符合Python数据库接口规范的库文件。

两部分缺一不可。

  • 安装介绍

前提是你已经安装好了Robot Framework环境,如果没有,可参考下面文章:

http://blog.sina.com.cn/s/blog_654c6ec70100tkxn.html

1.先下载安装瓤,我们从这个主页能够找到所有支持Python数据库规范的实现:

http://wiki.python.org/moin/DatabaseInterfaces

由于要连接Oracle ,我这里要进入Oracle的支持页面

http://wiki.python.org/moin/Oracle

选择第二个 cx_oracle 的主页,进入下载列表

选择合适的版本下载并安装。我选择的是 Windows x86 Installer (Oracle 10g, Python 2.6)

安装好了以后你的python\Lib\site-packages下多了一个cx_Oracle.pyd文件,这个目录下同时也多了个文件夹

cx_Oracle-5.1-py2.6.egg-info,cx_oralce的使用文档就在里边。

2.再下载安装皮,我们从这个地方下载DatabaseLibrary的皮,这是个压缩文件。

http://github.com/franz-see/Robotframework-Database-Library/tarball/master

下载解压后,在命令行进入解压目录,执行 setup.py install 

安装好了以后DatabaseLibrary这个目录也被安装到了site-package目录下。

安装就算完成了。

  • 使用

在Ride下编辑

Setting Value
Library DatabaseLibrary
Test Case Action Arguments
ConnectTest Connect To Database Using Custom Params cx_Oracle ‘username’,’password’,’your TNS Name’
@{rs} query select * from table1
Log many @{rs}
Disconnect from Database

这样我们就完成了第一个选择table1的操作。

需要说明的是Connect To Database Using Costom Params的参数:由于我使用了cx_Oracle这个库,所以第一个参数指定它;第二个参数是连接串 用户名,密码,和要连接的Oracle数据库的本地服务命名(与你oracle目录\network\admin\tnsnames.ora文件中的描述相对应)。cx_Oracle依赖Oracle的客户端环境,这点需要注意。

运行,得到Pass:)

  • 中文显示问题

运行后查看Log,傻眼了。表中的中文全部变成了一串乱码。翻阅资料,原来是cx_Oracle的默认编码不是Utf-8。需要人工转换一下。而 DataBaseLibrary又没有提供转换函数,为了解决这个问题,我们得对DataBaseLibrary进行扩展了。打开安装目录下的 query.py文件,在后面加一个函数

   def decode(self,customstr):
       return customstr.decode(‘utf-8’)

对所有需要变成中文的地方执行Decode关键字,就能得到中文了:

${a} decode ${rs[0][2]}

这样还是有些麻烦,其实我们可以重写query关键字,让它把所有的值都做一下decode。

  • 扩展问题

DatabaseLibrary提供的关键字挺少,有时候不够用(例如不能insert),这时候我们就需要对它进行扩展了。扩展原理同上,可以按需扩展:)

使用Robot Framework测试AJAX

原文地址:http://blog.sina.com.cn/s/blog_654c6ec70100u456.html

Ajax是现在使用非常广泛的一种技术,它在不重新刷新整个页面的情况下实现了客户端与服务器端的动态交互和页面内容变更。基于上述特性,在使用Robot Framework对Ajax进行测试的时候就需要一些特殊的操作。

下面举一个例子来说明这些:

为了方便大家自己尝试,我找一个在线的最简单的AJAX例子(W3School是个好网站):

http://www.w3school.com.cn/tiy/loadtext.asp?f=ajax_get

这个例子的源代码如下:

<html>
<head>
<script type=”text/javascript”>
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject(“Microsoft.XMLHTTP”);
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
   {
    document.getElementByIdx_x_x(“myDiv”).innerHTML=xmlhttp.responseText;
    }
}
xmlhttp.open(“GET”,”/ajax/demo_get.asp”,true);
xmlhttp.send();
}
</script>
</head>
<body>

<h2>AJAX</h2>
<button type=”button” onclick=”loadXMLDoc()”>请求数据</button>
<div id=”myDiv”></div>

</body>
</html>

红色部分的关键代码说明:当点击“请求数据”这个按钮时

我们以异步的形式发送XMLHttpRequest,并且动态生成了一部分DOM内容,而这是以不刷新页面为前提的。

 

Robot Framework的Selenium库中,我们使用Click Button关键字来点击按钮。默认的情况下关键字认为页面会刷新,如果不刷新就会发生超时错误。

请看下面代码:

TestAjax

Setting Value
Library Selenium Library

Test Case Action Arguments
TestFail Start Selenium Server
open Browser http://www.w3school.com.cn/tiy/loadtext.asp?f=ajax_get ie
Maximize Browser Window
click button xpath=//button[1]
Page should contain  本内容是使用 GET 方法请求的
Stop selenium Server

运行后我们看日志,从下图的日志截图中我们看出,在点击按钮后出现了500错误,这是因为Click button期待页面刷新,而页面没有刷新。使用Robot <wbr>Framework测试AJAX

为了解决这个问题,我们应该在 click button 关键字的后面加上 don’t wait参数,这样就不会出现500错误了。

click button xpath=//button[1] don’t wait

修改后我们继续运行一遍测试用例,没有500错误出现,但这次却出现了其他错误。
TestFail                                                              | FAIL |
Page should have contained text ‘本内容是使用 GET 方法请求的’ but did not

这又是为什么呢? 记住。Ajax的刷新是异步的,返回文字需要时间。而由于使用了don’t wait参数,Robot Framework直接执行了下一个关键字 Page should contain,此时返回文字这时还没有出现,自然会失败。

这时候我们就用到了另外一个关键字 Wait Until Page Contains

我们将Page should contain 这一句换成下面这一句(第二个参数5000指的是等待5000毫秒,超过后就抛出超时错误)。

Wait Until Page Contains 本内容是使用 GET 方法请求的 5000

这样再次运行测试用例,就得到TestPass了。

  • 拓展

上述的例子只是实现了最简单的对Ajax的测试方法。由于JavaScript代码能写得各式各样,因此测试用例的写法也会不尽相同。但是本质上AJAX 就两个关键点:异步和动态DOM变更。只要抓住这2点,基本上什么都难不倒你了。下面的几个关键字应该能搞定绝大部分AJAX测试:

 Wait For Condition   ·  Wait Until Page Contains  ·  Wait Until Page Contains Element 

尤其是Wait For Condition,由于能够直接访问JavaScript代码,它异常强大,值得关注。

如何编写Robot Framework测试用例2—(测试用例语法1)

原文地址:http://blog.sina.com.cn/s/blog_654c6ec70100tnac.html

  • 基本语法

测试用例由关键字组成,关键字的来源有三种:
1从测试库引入;2从资源文件引入;3从关键字表中引入(自定义关键字)

下面就是一个典型的测试用例组织形式。

如何编写Robot <wbr>Framework测试用例2---(测试用例语法1)

图中有2个测试用例“Valid Login” 和 “Setting Varriables”。第一列是用例名称,第二列是关键字,这些关键字来实现具体的测试工作,后面的列是参数列,放置关键字需要的参数。Valid Login这个用例其实很清晰,我们通过读这个用例使用的关键字就能清晰的看出是一个登陆的检验。

  • 使用参数

我们看到,关键字其实和编程语言中的函数很相似,他们有时候要输入参数(arguments)。关键字是否需要参数,需要多少参数,和需要什么样的参数一 般在关键字的文档中给出。你编写扩展库的时候如果遵循注释规范,可以使用libdoc.py或者javadoc(使用Java编写扩展库时)生成。

从下图的2个例子中,我们可以看到:

  1. Create directory需要1个参数,CopyFile需要2个,而No Operation不需要参数。
  2. 我们可以把变量作为参数输入(${CURDIR}就是一个变量,后面会讲解)。
  3. 有些参数有默认值,如果你不输入则会取默认值,如Create File ,第三个参数的默认值是 UTF-8

如何编写Robot <wbr>Framework测试用例2---(测试用例语法1)

如何编写Robot <wbr>Framework测试用例2---(测试用例语法1)

还有一些我们不常用到的细节,这里就不一一指出了,可以参阅官方文档的2.2节。

  4.指名参数:可以给参数加上名字,这样参数的意义显得更清晰(当然得测试类库提供这样的支持)

如何编写Robot <wbr>Framework测试用例2---(测试用例语法1)

从上面例子中我们能看出 Setting段引入的Telnet 类库输入了一个参数 $ ,通过参数前的指名,我们看到这个$代表了所连接系统的提示符。从Test case段 我们看到 Open connection 的第二个参数 ${25},通过参数前的指名“port”我们知道了这个参数代表端口号。

  • 测试用例的描述信息(metadata,也就是元数据)

很多时候我们需要对测试用例进行描述和标记,这样有2个作用:帮助用例使用者更清晰了解测试的意图;在测试执行期间的利用这些元数据动态的控制用例的测试执行(比如根据tag选择那些用例执行,那些不执行)。

RB的元数据有2种,一种是[documentation],一种是[tag]。

[documentation]帮助记录有用的信息,记录结果会保存在日志和测试报告文件中。下图就是documentation的使用方法,我们用[documentation]这个关键字来表示,这是一个描述信息。另外,看测试用例 Variables,[documantation]的参数中可以使用变量。

如何编写Robot <wbr>Framework测试用例2---(测试用例语法1)

[Tags]是测试用例的元数据(metadata),能够帮助完成如下工作:能够给测试用例归类,帮助完成相关的统计;能够根据tags决定执行或者不执行那些测试用例;能够用tag标记哪些用例是关键用例。

下图的给出了Tags使用的例子。里边的Force Tags指的是下面的用例都强制打上req-42的标。除非你在用例中使用[Tags]自己覆盖。

如何编写Robot <wbr>Framework测试用例2---(测试用例语法1)

(未完)