刚听到Selenium 这个词的时候好像是去年夏天吧。这里感谢一下Chestin Wang, 好像是他推荐的。
.~ H
F"F,lMt$p
W0一开始使用selenium 自然会先使用简单的Core 模式,使用IDE 进行一些脚本的录制。然后回放。然后放在Core里面运行。但是用了一段时间之后发现Core越来越有局限性,不能满足自己程序的
测试要求了。而且IDE很多东西都是录制不下来的,还有就是很多东西在IDE里面回放正常,但是放在core 里面运行就是有问题。那时候还在想,可能自己不够熟悉它,特别对他的那些命令。所以反复的在那里研究Selenium Reference. 但是后来发现有些问题还是解决不了。然后在 OpenQA 的论坛上发帖(http://clearspace.openqa.org/index.jspa)求助,网上找一样使用Selenium 的人帮助。
8N8[/fEG:Y?At0-x)K%?(z O0经过一些时间的研究发现selenium rc 的功能好像强大一点。所以准备转向Selenium RC,好好的研究研究,看到底是怎么样的。(因为光看介绍里面好像吹的很厉害一样的,感觉什么都可以。但是实际上自己用的时候到处都是问题,所以要深入研究研究。)
WG4o3uz$i1t0研究 open source 的东西是比较痛苦的,因为其文档真的是很有限的,而且当时基本没有中文的文档,好像只有
IBM网站上有一篇介绍selenium (http://www.ibm.com/developerworks/cn/java/wa-selenium-ajax/),还有就是有几个人在网上的几篇翻译的selenium的文档(http://wiki.javascud.org/display/SEL/Home)。
51Testing软件测试网3S4hb9uUw1@所以其实主要的还是在OpenQA的论坛里面查,看有没有类似的问题人家已经解决的。然后自己拿过来尝试。
51Testing软件测试网G[!i
N$lz%yu#q d8D0最初的用的东西是Java+Firebug +selenium IDE +selenium rc +eclipse +junit.因为一开始的程序 IDE还是可以录制大部分的,所以把IDE录制的东西修改修改就成了可以跑的 testcase. 而且当时一上来肯定是用junit来跑。
.aW&R7Ih&e+Uxr0!s(ws:o\6?|
a#T0单个可以跑了,那就要考虑多个了,不过这个也简单,junit 本来就有testsuite.这样多个也可以跑了。
51Testing软件测试网,L!oDjM+e9d可以跑了。 那该考虑跑完后的测试结果了,就是所谓的report了。总不能再Eclipse里面,看一下就没了,不能保存一起。所以又研究。发现junit ant task里面有report 功能。。所以在这个时候引入了ant + junit report 来生成 pdf格式的report.
+mA8pf!T{+P
u051Testing软件测试网
w6Oqs \O]好了report 有了,但是运行过程中有问题的话,怎么去debug,怎么去发现哪里出的问题呢。这就需要log.最初看log也就只能在slenium server 的console里面,可以看到出错信息能。selenium server 启动的时候-log 参数记录的东西可读性太差了,不符合要求。所以继续research。。发现有一个人写了一个叫loggingSelenium(http://loggingselenium.sourceforge.net/usage.html) 的东东,拿来一用感觉还不错,每个case可以生成记录selenium 命令的html格式的result了。不过当是不支持assert 命令的记录。其实后来看了它的运行机制就明白了。他记录的是selenium command ,而assert 是junit testcase里面的命令。不过即使assert不能记录也足够用了。
51Testing软件测试网3W4~3w
E#iT&c(X ^R/`D~,Z?'w/ob0-----------------------------------
51Testing软件测试网
yy3N3Jkq51Testing软件测试网`Ch-|5W6MS好了。一些东西都有了,接下去让我们再看看用
java写的testcase。selenium 的command是基于html element的locator 的,其实selenium 并不关心element type.一般的selenium 的命令都是command(locator, value) 这样格式的。从这样的命令中我们根本看不出selenium 在对哪个element进行操作。特别是testcase比较长的情况下。可读性很差,导致到时候有问题debug起来也很麻烦。
51Testing软件测试网*o+R.KIM4iwO$b51Testing软件测试网py+\Bs|*s:nMZ\还有一个决定因素就是我们的application用的是extjs,里面的widget很多,所以最好的脚本形式是widget.command(),这样形式的。这样可读性强很多。比如button.click(),textfield.setvalue("abc"),grid.selectRow("afdaf");combobox.selectItem("value"); 但是没执行这样一个命令,对应的selenium命令可能不只一个,而且操作对象可能也不只一个htm element。。 所以在这个时候,我们决定封装selenium。首先建立一个对应的widget的库已经对应的一些测试的API.比如Grid 需要的api有selectRow,sortAs,nextPage,prePage等等。。。。然后用selenium command 组合去一一实现他们。这个是我所花时间最多的地方。从今年两三月份到现在一直在不断的添加测试API.其实主要是参考silktest里面提供的一些主要常用的方法的。
6c:PvfE:~bk2C,`Y0c)@8K1^~3XO:\0封装好之后我们的脚本就变的很简洁了,比如homepage.open("www.googel.com");homepage.tfSearch.setText("Selenium");homepage.btnSearch.click();homepage.waitForPageToLoad(10); homepage.assertTextPresent("Selenum");..................
O-z%x7cS/l F'i[0就是这样tester在看脚本的时候知道selenium在干什么,而且可以和手动的
test case的步骤一一对应起来。
51Testing软件测试网H oo P
CE
h51Testing软件测试网9Al8Q8^oOh~ `接下来的问题是怎么增加 测试脚本debug的效率。。因为我们现在只有selenium command level 的log(loggingSelenium). 因为我们的tester写的是 element.command 这样的测试脚本。但debug的时候让他去看selenium command level log,也是很麻烦的,因为可能不知道这个element的命令,到底对应哪几个selenium command。所以在这里我们引入了element command level log.就是每个element的action 都添加一个log信息,这个就相对简单了。用了commons-logging + log4j 很容易实现的。
`gH"Ry!aZ051Testing软件测试网Lg:L$L;m-x2E%U? f E下面一个问题是要考虑一下代码的维护代价了。把test data 和element locator 放在脚本里面好像不合适。测试脚本不能重用。第二万一UI界面稍微改动导致locator 改动,这样需要去修改所有用到这个element的脚本,那代价也是很高的。
1ipq3vg0 ntUf(ka2~0--------------------------------------
l x1S X*Bj'?;~/Hc0!_ d|(g&@$G%oc^`
~0所以用了一个declaration 这个概念,就是你写脚本的时候,要使用控件之前,先在另外的脚本里把这些控件给声明好,在
web里主要就是locator。可以是id,name, 或者xpath,其实用的最多的还是xpath,因为ajax的东西很多都是动态生成的。有了declaration 之后,UI界面稍微点位置调整的话,对脚本就影响很小了,只要修改这个declaration 里面的locator.
51Testing软件测试网0e;]Z&D&{e:Hf51Testing软件测试网9^YIH;aD(G[T5v另外关于测试数据,很传统的,存在excel文件里面。用key-value 的方式。
51Testing软件测试网UW ~e v&y51Testing软件测试网&n$`vwm_--------------------
51Testing软件测试网K3Wc7V7t}8SE&a9\ c
t2SZ$dq*d0继续待续。。。最近在 研究selenium IDE ..
mi8~X.LDE
h q;U051Testing软件测试网!X.SqK5I)X6_g.|i4o8]p^'A|o~+q(?0