51Testing软件测试论坛

标题: Selenium 连续记录【有啥问题可以在这里问,一起讨论】 [打印本页]

作者: bruce.gu    时间: 2008-11-12 11:07
标题: Selenium 连续记录【有啥问题可以在这里问,一起讨论】
本帖最后由 bruce.gu 于 2011-3-27 11:12 编辑

http://seleniumcn.cn  Selenium中文论坛。

刚听到Selenium 这个词的时候好像是去年夏天吧。这里感谢一下Chestin Wang, 好像是他推荐的。
一开始使用selenium 自然会先使用简单的Core 模式,使用IDE 进行一些脚本的录制。然后回放。然后放在Core里面运行。但是用了一段时间之后发现Core越来越有局限性,不能满足自己程序的测试要求了。而且IDE很多东西都是录制不下来的,还有就是很多东西在IDE里面回放正常,但是放在core 里面运行就是有问题。那时候还在想,可能自己不够熟悉它,特别对他的那些命令。所以反复的在那里研究Selenium Reference. 但是后来发现有些问题还是解决不了。然后在 OpenQA 的论坛上发帖(http://clearspace.openqa.org/index.jspa)求助,网上找一样使用Selenium 的人帮助。

[ 本帖最后由 bruce.gu 于 2008-12-5 13:40 编辑 ]
作者: bruce.gu    时间: 2008-11-12 11:07
经过一些时间的研究发现selenium rc 的功能好像强大一点。所以准备转向Selenium RC,好好的研究研究,看到底是怎么样的。(因为光看介绍里面好像吹的很厉害一样的,感觉什么都可以。但是实际上自己用的时候到处都是问题,所以要深入研究研究。)
研究 open source 的东西是比较痛苦的,因为其文档真的是很有限的,而且当时基本没有中文的文档,好像只有IBM网站上有一篇介绍selenium (http://www.ibm.com/developerworks/cn/java/wa-selenium-ajax/),还有就是有几个人在网上的几篇翻译的selenium的文档(http://wiki.javascud.org/display/SEL/Home)。
所以其实主要的还是在OpenQA的论坛里面查,看有没有类似的问题人家已经解决的。然后自己拿过来尝试。
作者: bruce.gu    时间: 2008-11-12 11:07
最初的用的东西是Java+Firebug +selenium IDE +selenium rc +eclipse +junit.因为一开始的程序 IDE还是可以录制大部分的,所以把IDE录制的东西修改修改就成了可以跑的 testcase. 而且当时一上来肯定是用junit来跑。

单个可以跑了,那就要考虑多个了,不过这个也简单,junit 本来就有testsuite.这样多个也可以跑了。
可以跑了。 那该考虑跑完后的测试结果了,就是所谓的report了。总不能再Eclipse里面,看一下就没了,不能保存一起。所以又研究。发现junit ant task里面有report 功能。。所以在这个时候引入了ant + junit report 来生成 pdf格式的report.
作者: bruce.gu    时间: 2008-11-12 11:08
好了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不能记录也足够用了。
作者: bruce.gu    时间: 2008-11-12 11:27
今天就这些。明天继续。
作者: bruce.gu    时间: 2008-11-13 09:45
好像没人看哦。放到blog里去算了。http://www.51testing.com/?111742
作者: xzl    时间: 2008-11-13 14:29
好贴

和我的研究轨迹差不多
作者: 月上百合    时间: 2008-11-13 17:03
我就用的很浅就用了一下IDE.没有这么深哦,
作者: kuangjian7    时间: 2008-11-13 18:17
谁说没人看的  小弟就正在学习中    感谢!!!
作者: 厍仕杰    时间: 2008-11-13 20:08

作者: indiepop    时间: 2008-11-14 13:21
又是一未知领域,见识了。
作者: bruce.gu    时间: 2008-11-14 14:06
好了。一些东西都有了,接下去让我们再看看用java写的testcase。selenium 的command是基于html element的locator 的,其实selenium 并不关心element type.一般的selenium 的命令都是command(locator, value) 这样格式的。从这样的命令中我们根本看不出selenium 在对哪个element进行操作。特别是testcase比较长的情况下。可读性很差,导致到时候有问题debug起来也很麻烦。

还有一个决定因素就是我们的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里面提供的一些主要常用的方法的。

封装好之后我们的脚本就变的很简洁了,比如 homepage.open("www.googel.com");homepage.tfSearch.setText("Selenium");homepage.btnSearch.click();homepage.waitForPageToLoad(10); homepage.assertTextPresent("Selenum");..................
就是这样tester在看脚本的时候知道selenium在干什么,而且可以和手动的test case的步骤一一对应起来。
作者: bruce.gu    时间: 2008-11-14 14:07
接下来的问题是怎么增加 测试脚本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 很容易实现的。

下面一个问题是要考虑一下代码的维护代价了。把test data 和element locator 放在脚本里面好像不合适。测试脚本不能重用。第二万一UI界面稍微改动导致locator 改动,这样需要去修改所有用到这个element的脚本,那代价也是很高的。
作者: bruce.gu    时间: 2008-11-14 14:07
所以用了一个declaration 这个概念,就是你写脚本的时候,要使用控件之前,先在另外的脚本里把这些控件给声明好,在web里主要就是locator。可以是id,name, 或者xpath,其实用的最多的还是xpath,因为ajax的东西很多都是动态生成的。有了declaration 之后,UI界面稍微点位置调整的话,对脚本就影响很小了,只要修改这个declaration 里面的locator.

另外关于测试数据,很传统的,存在excel文件里面。用key-value 的方式。
作者: bruce.gu    时间: 2008-11-14 14:07
待续。。。
作者: kuangjian7    时间: 2008-11-16 20:15
顶一个先。。。。

        XPATH 怎么看的时候很清楚   到写就不知道怎么写了            继续埋头苦看!!!!
作者: bruce.gu    时间: 2008-11-21 11:06
看一下w3c 的 xpath language ,然后装一个firebug + xpath checker,另外 xpath 在ie里和在firefox里面有些不一样的。有些表达式在ie里不能用,因为ie本身不支持xpath,只是selenium内嵌了一个解析器。

[ 本帖最后由 bruce.gu 于 2008-11-21 11:08 编辑 ]
作者: bruce.gu    时间: 2008-11-21 11:14
原帖由 bruce.gu 于 2008-11-14 14:07 发表
所以用了一个declaration 这个概念,就是你写脚本的时候,要使用控件之前,先在另外的脚本里把这些控件给声明好,在web里主要就是locator。可以是id,name, 或者xpath,其实用的最多的还是xpath,因为ajax的东西很多都 ...


接下去该考虑所谓的并行测试了。就是同是跑多个测试线程。这里就是引入 testng和selenium grid 的时候了。
由于junit 本身不支持parallel 所以,当时就把junit去掉改用testng来跑test了。另外selenium grid也不难,不需要他安装包里面那么多东西,只要selenium-grid-hub-standalone-1.0.2 , selenium-grid-remote-control-standalone-1.0.2 和 grid_configuration.yml 和原先的selenium server放一起。然后改一下它的build文件就ok了。
作者: kuangjian7    时间: 2008-11-24 13:55
顶个先  

作者: bruce.gu    时间: 2008-11-26 11:40
但是多线程就会引起 log日志混乱。各个线程的全都交错在一起,debug起来太麻烦了。
作者: bruce.gu    时间: 2008-11-26 13:02
所以需要自己写一个log4j filter 的扩展。可以把case id push 到ndc里,然后根据ndc来filter log到 不同的文件里。或者可以根据thread name 来filter。
作者: xzl    时间: 2008-11-26 19:29
接下去该考虑所谓的并行测试了。就是同是跑多个测试线程。这里就是引入 testng和selenium grid 的时候了。
由于junit 本身不支持parallel 所以,当时就把junit去掉改用testng来跑test了。另外selenium grid也不难,不需要他安装包里面那么多东西,只要selenium-grid-hub-standalone-1.0.2 , selenium-grid-remote-control-standalone-1.0.2 和 grid_configuration.yml 和原先的selenium server放一起。然后改一下它的build文件就ok了。

上面的GRID那些内容怎么理解?
我运行GRID,不是这么运行的啊,也不要改什么build文件。我原来一直以为是通过HUB来控制其它电脑上的RC,后来发现是其它电脑连着HUB。也就是说在另外电脑上执行,在HUB上就会运行RC电脑上的操作过程。HUB是多台RC演示的汇总。在这个问题上我好多天才转过思路,才成功在GRID上运行多个环境、平台的JUNIT。这样达到了并行测试的效果。

[ 本帖最后由 xzl 于 2008-11-26 19:34 编辑 ]
作者: bruce.gu    时间: 2008-12-2 15:14
标题: 回复 22# 的帖子
我是先用的单独的selnium server,然后后来想用grid的时候,就把需要的几个jar包加进去,改一下build file。。不需要整个grid 目录里面那么多东西。。
grid 想当与一个负载均衡器一样的东西。其实。
作者: bruce.gu    时间: 2008-12-2 15:19
有啥问题可以在这里讨论讨论,尽力回答
作者: bruce.gu    时间: 2008-12-2 15:24
因为我们的脚本分成了declaration 和 script 两部分。declaration的主要部分就是定义element的locator. 现在在想怎么能够 自动获得这个locator 而不需要一个一个去同过firebug出来source 然后自己去写。
作者: rting    时间: 2008-12-3 11:37
ajax的东思好像不好录制的,有什么解决办法么?
作者: rting    时间: 2008-12-3 11:38
还有对于从本地上传的操作可以怎么处理
作者: xzl    时间: 2008-12-3 17:33
我不认为GRID是一个负载均衡器。
我用GRID的目的是为了节省资源。如果每个电脑都跑RC的话,假若是多种环境、多种浏览器,那么就需要浪费多台电脑,而且一运行RC的话,这台电脑就没法做其它的事情(屏幕上经常跳出页面来,这样导致使用这台机器的人无法做其它事情).如果用GIRD,多台电脑仍然可以做自已的事情,多台电脑的事情都交给运行GRID的电脑去工作.
通俗地说,也就是说我们测试部有5个工程师,一段相同的脚本跑在5台不同环境下,需要消耗我们5个测试工程师的时间,但我们把这些事情交给一台HUB(也就是装有GRID),让这台HUB去做事情,其它5台电脑照样去做事情.从HUB中发现这个脚本在哪种环境下跑不起来,或者碰到了环境不兼容等问题,而不是让每台电脑去运行代码来发现问题.
我觉得这才是我们为什么要引用GRID的原因了.
不知道我有没有表达清楚我的意思?
GRID的目的是为了达到"并行测试"的目的.

[ 本帖最后由 xzl 于 2008-12-3 17:35 编辑 ]
作者: bruce.gu    时间: 2008-12-4 09:55
不好意思,不是很懂你的意思呀。我们使用grid 目的是到达平行运行test,加快测试速度。 也就是TestNG的多线程运行。比如你有100个case,本来一个一个运行需要100分钟完成,现在有5个机器(selenium remote control)注册到Grid上,然后同时分5个线程去跑test的话, 那就只要100/5=20分钟时间(假设每个case花同样的时间。)

你的情况是一个case 需要在不同的环境下跑,比如 一个case 需要在5个不同的环境下跑。那你怎么做的?
是不是 5个不同环境的机器(selenium remote control)注册到grid 上面。 然后这个case 连续运行5次?grid就去每个环境下跑一遍?


原帖由 xzl 于 2008-12-3 17:33 发表
我不认为GRID是一个负载均衡器。
我用GRID的目的是为了节省资源。如果每个电脑都跑RC的话,假若是多种环境、多种浏览器,那么就需要浪费多台电脑,而且一运行RC的话,这台电脑就没法做其它的事情(屏幕上经常跳出页 ...

作者: bruce.gu    时间: 2008-12-4 10:00
IDE对于ajax 的录制是有问题。我们在使用过程中基本是靠手动获取要用到的element的locator(firebug + xpath checker), 然后再写 element的action.
IDE 是一个firefox 的plugin, 有兴趣的话可以研究一下他,自己也可以写一个适合自己项目用的录制脚本的东西。偶们现在没时间搞这个东西。
主要原理好像就是通过javascript Element event  去获取 event.target 然后根据html source 做一些解析,得到element 以及action.
原帖由 rting 于 2008-12-3 11:37 发表
ajax的东思好像不好录制的,有什么解决办法么?

作者: bruce.gu    时间: 2008-12-4 10:13
上传选择文件也是处理不了的,因为那是一个window的UI不是 javascript 所能访问到的。
不过我们的UI上传文件一般用的<input type='file'> 这种,直接在文本框里输入文件的path.
原帖由 rting 于 2008-12-3 11:38 发表
还有对于从本地上传的操作可以怎么处理

作者: xzl    时间: 2008-12-4 19:42
你的情况是一个case 需要在不同的环境下跑,比如 一个case 需要在5个不同的环境下跑。那你怎么做的?

是的,我运用GRID的目的不是为了加快速度。我用GRID的目的是测试多个环境。比如一个大型招聘网站,客户有用windows操作系统的,然后又分N种IE,客户也有用LINEX、APPLE等操作系统的,这么多的环境,你就用在很多电脑安装在这个环境下。
当我们每台电脑都安装了不同的环境,如果不用GRID,就需要在每台电脑上都去跑RC。如果用GRID,只需在一台良好的服务器下安装GRID的,其它电脑连着这台服务器,这些机器照样可以从事其它工作,不受影响,而这些多环境全部交给服务器去运行、处理。这台装有GRID的服务器就代替多台电脑进行工作。(这种方法已经在大型招聘网站的程序运行过)
也可以照你的意思理解, 5个不同环境的机器(selenium remote control)注册到grid 上面。 然后这个case 连续(并行)运行5次?grid就去每个环境下跑一遍?
而你的思想是节省时间,负载均衡这些思想我倒没有试过。
作者: xzl    时间: 2008-12-4 19:51
IDE对于ajax 的录制??
假如要良好运用SELENIUM的话,是不用IDE进行录制的,当然可以用来作辅助。
最好全是用手去写脚本。
在写脚本之前先分析需求、设计用例,按照用例写脚本。
SELENIUM对系统是持续集成或者模块不断增加,特别是系统在多个国家,并且每个国家的程序方式又有些不同的时候,SELENIUM威力大一些。如果只针对单纯的小系统,最好不要用SELENIUM,因为成本代价是比较大的。
本地上传文件确实没有什么好办法,就如bruce.gu的方法。
还有一个就是验证码的问题,也是不太好解决的。不过验证码问题有解决方案。
作者: bruce.gu    时间: 2008-12-5 09:40
是的,我们也是完全靠手写脚本。不过我们写的脚本不是selenium.command(),我们经过包装之后的脚本是 control.action()
比如combobox.select()

原帖由 xzl 于 2008-12-4 19:51 发表
IDE对于ajax 的录制??
假如要良好运用SELENIUM的话,是不用IDE进行录制的,当然可以用来作辅助。
最好全是用手去写脚本。
在写脚本之前先分析需求、设计用例,按照用例写脚本。
SELENIUM对系统是持续集成或者模 ...

作者: xzl    时间: 2008-12-5 10:44
我们是借用ECLIPSE平台。用的是selenium.command()。

[ 本帖最后由 xzl 于 2008-12-5 10:46 编辑 ]
作者: bruce.gu    时间: 2008-12-8 09:50
对的,我们也是java @ Eclipse
原帖由 xzl 于 2008-12-5 10:44 发表
我们是借用ECLIPSE平台。用的是selenium.command()。

作者: zihuadou    时间: 2008-12-11 00:26
啊,天哪,终于有人说这个了~~~
楼主,我们的环境和你描述的差不多,有个问题问一下啊?
就是我随机一个51位的串写到一个文本框中,事实上只写进去50个,然后生成一个文件是显示这个文本框中字串的,我怎么验证显示出来的这个和我随机的那个不同呢??
作者: bruce.gu    时间: 2008-12-11 13:33
不知道你具体情况到底怎么样,你用seleniu.type? 输入一个51位的字符串,然后用selenium.getValue取得文本框的字符串,然后两个结果比较一下。如果相同就说明有问题?不相同就说明没问题?
不知道你是不是这样做的。不过上面的步骤有可能得到结果是一致的。因为一般控制输入长度是javascript写的。所以需要selenium.fireEvent去触发这个js事件。不触发的话 直接用type 51位。应该是可以成功的。

不过我没试过输入位数的控制,我试了只允许输入数字的情况。



原帖由 zihuadou 于 2008-12-11 00:26 发表
啊,天哪,终于有人说这个了~~~
楼主,我们的环境和你描述的差不多,有个问题问一下啊?
就是我随机一个51位的串写到一个文本框中,事实上只写进去50个,然后生成一个文件是显示这个文本框中字串的,我怎么验证显示 ...

作者: zihuadou    时间: 2008-12-15 22:38
多谢啊,你说的差不多,我看到一个assertNotEquals(), 不过关于这个东西我就是弄不对,去junit api 里看了,就好像没有这个命令,真是不知道怎么弄好了,不过貌似可以用别的方法去解决~~~
作者: bruce.gu    时间: 2008-12-16 09:35
这些方法自己都可以写的。

assertNotEquals() 没有可以用assertFalse(stringA.equals(stringB))或者assertTrue(!stringA.equals(stringB))来替代。

原帖由 zihuadou 于 2008-12-15 22:38 发表
多谢啊,你说的差不多,我看到一个assertNotEquals(), 不过关于这个东西我就是弄不对,去junit api 里看了,就好像没有这个命令,真是不知道怎么弄好了,不过貌似可以用别的方法去解决~~~

作者: bruce.gu    时间: 2008-12-22 09:44
好久没更新了,帖子沉的好快呀。自己顶一下
作者: okle    时间: 2008-12-23 09:15
标题: 问个问题
selenium是如何捕捉弹出窗口的?
PS,该弹出窗口没有id和name属性。。
作者: bruce.gu    时间: 2008-12-24 09:22
这个问题在openQA 论坛上也很热门的。经常有人问。
如果你的这个弹出窗口是有一个link产生的话,比较容易解决,简单的说一下步骤。。
1.selenium.openWindow("_blank","winid"); //开一个空的弹出窗口。
2.然后修改那个link的 target 属性为"winid"
3.然后click 这个link

不知道够不够详细。



原帖由 okle 于 2008-12-23 09:15 发表
selenium是如何捕捉弹出窗口的?
PS,该弹出窗口没有id和name属性。。

作者: alextowxm    时间: 2008-12-29 15:01
我有一个 关于 selenium rc 的问题
现在我自己在研究 seleniu rc 但是找了一段时间的资料 但是没有找到 如何运行 selenium-php-client-driver-1.0-beta-1 中的实例
不知道你那是不是用一些关于 seleniu rc 等等学习资料 可供参考呢
作者: bruce.gu    时间: 2008-12-29 17:18
open source 的东西少的就是资料。我主要还是泡在openqa的论坛上。
另外我用的是java client
原帖由 alextowxm 于 2008-12-29 15:01 发表
我有一个 关于 selenium rc 的问题
现在我自己在研究 seleniu rc 但是找了一段时间的资料 但是没有找到 如何运行 selenium-php-client-driver-1.0-beta-1 中的实例
不知道你那是不是用一些关于 seleniu rc 等等学 ...

作者: bruce.gu    时间: 2009-1-4 10:49
2009年了。接触selenium 断断续续已经一年半多了。今年继续。
作者: 10885    时间: 2009-1-6 11:06
我是新手 顶下先
作者: nosedive    时间: 2009-1-7 15:36
楼主,请教你一个入门级的问题。我用selenium+eclipse+Junit.用selenuimIDE录好脚本,在eclipse里建好工程,项目属性中引入selenium-java-client.jar selenium-java-client-driver-sources.jar和selenium-java-client-driver-tests.jar,以及Junit3.8.1
然后把脚本写到项目里,启动selenium-server,运行脚本,结果会出现这样的错误:
com.thoughtworks.selenium.SelenuimException:ERROR Server Exception:sessionID should not be null;has this session been started?
at com.thoughtworks.selenium.HttpCommandProcessor.doCommand(HttpCommandProcessor.java
at com.thoughtworks.selenium.DefaultSelenium.setContext(DefaultSelenium.java)
这是哪里出了问题?谢谢!
作者: nosedive    时间: 2009-1-7 15:40
我把错误都贴出来:
com.thoughtworks.selenium.SeleniumException: ERROR Server Exception: sessionId should not be null; has this session been started yet?
        at com.thoughtworks.selenium.HttpCommandProcessor.doCommand(HttpCommandProcessor.java:73)
        at com.thoughtworks.selenium.DefaultSelenium.setContext(DefaultSelenium.java:574)
        at com.thoughtworks.selenium.SeleneseTestCase.setUp(SeleneseTestCase.java:126)
        at test56.test56.setUp(test56.java:8)
        at junit.framework.TestCase.runBare(TestCase.java:125)
        at com.thoughtworks.selenium.SeleneseTestCase.runBare(SeleneseTestCase.java:71)
        at junit.framework.TestResult$1.protect(TestResult.java:106)
        at junit.framework.TestResult.runProtected(TestResult.java:124)
        at junit.framework.TestResult.run(TestResult.java:109)
        at junit.framework.TestCase.run(TestCase.java:118)
        at junit.framework.TestSuite.runTest(TestSuite.java:208)
        at junit.framework.TestSuite.run(TestSuite.java:203)
        at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
作者: bruce.gu    时间: 2009-1-8 09:42
selenium server 开了没?

其实只需要导入 selenium-java-client.jar

原帖由 nosedive 于 2009-1-7 15:36 发表
楼主,请教你一个入门级的问题。我用selenium+eclipse+Junit.用selenuimIDE录好脚本,在eclipse里建好工程,项目属性中引入selenium-java-client.jar selenium-java-client-driver-sources.jar和selenium-java-clien ...

作者: nosedive    时间: 2009-1-8 10:28
server开了,确实只用导入selenium-java-client-driver.jar的,我是病急乱投医,不过还是不行
作者: bruce.gu    时间: 2009-1-8 12:41
代码贴上来看看。
原帖由 nosedive 于 2009-1-8 10:28 发表
server开了,确实只用导入selenium-java-client-driver.jar的,我是病急乱投医,不过还是不行

作者: snnylip    时间: 2009-1-8 13:56
你的错误证明你的sever根本没开起来!
作者: nosedive    时间: 2009-1-8 14:11
import junit.framework.TestCase;
import com.thoughtworks.selenium.*;
public class Test extends TestCase {
    private Selenium selenium;

    public void setUp() throws Exception {
        String url = "http://www.google.com";
        selenium = new DefaultSelenium("localhost", 4444, "*firefox", url);  //4444 is default server port
        selenium.start();      
    }

    protected void tearDown() throws Exception {
//        selenium.stop();
    }

    public void testGoogle() throws Throwable {
        selenium.open("http://www.google.com/webhp?hl=en");
        assertEquals("Google", selenium.getTitle());
        selenium.type("q", "Selenium OpenQA");
        assertEquals("Selenium OpenQA", selenium.getValue("q"));
        selenium.click("btnG");
        selenium.waitForPageToLoad("5000");
        assertEquals("Selenium OpenQA - Google Search", selenium.getTitle());
    }
}
这个脚本在别人的机器上跑是正常的,所以我想应该脚本没有什么问题
作者: gchao    时间: 2009-1-8 14:31
大家好,我刚刚用selenium IDE 出现了些问题,也是关于网页加载的问题,我一般都是在每个click前门加 wait for element present 这条命令,但是对有些按键似乎不管用,所以我加了pause 这个命令,来延长等待时间,但是我发现,我做的脚本文件在我的电脑上运行可以,但是换台电脑就会出现问题,我测试的网页是Ajax技术的,所以加载网页就会出现问题,关键是加pause这个命令,不清楚具体的等待时间,所以我想用wait for value ,或者 wait for condition 这样的命令,但是具体的格式并不是很清楚,网上也查了,不是很清楚wait for value 这个命令中patten 应该写些什么东西,对于wait for condition 这个命令中的script不是很了解,关键我刚刚毕业,而且本科不是学计算机专业的,没有接触过javascript ,各位大侠可以给我举个例子吗,例如我想等待一个id为OKButton__Button 的按键 ,wait for condition 和 wait for value这两个命令具体该怎么写,多谢!
作者: bruce.gu    时间: 2009-1-8 14:59
把你下面这段代码里的 "localhost" 改成别人运行正常的机器名。然后运行试试。

selenium = new DefaultSelenium("localhost", 4444, "*firefox", url);  //4444 is default server port

如果可以跑说明你 selenium server 有问题。


原帖由 nosedive 于 2009-1-8 14:11 发表
import junit.framework.TestCase;
import com.thoughtworks.selenium.*;
public class Test extends TestCase {
    private Selenium selenium;

    public void setUp() throws Exception {
        Strin ...

作者: bruce.gu    时间: 2009-1-8 15:04
标题: 回复 55# 的帖子
一般用的较多的是wait for present,
一个wait for visible 的例子。/**Wait for element to be visible within time out.
      * @param sLocator element's locator
      * @param timeout time out
      */
     public void waitForVisible(String sLocator, int timeout){
         log.info("Wait for "+sElementType+" visible");
         for(int i=0;;i++){
            if(i>=timeout){
                try{
                    org.testng.Assert.fail("Wait for "+sElementType+" visible, Failed/Timeout @ "+sLocator);
                    }catch(AssertionError er){
                        log.error("Wait for "+sElementType+" visible, Failed/Timeout @ "+sLocator);
                        captureScreenshot();   
                        throw er;
                        }
                    }
            try {
                if (sel.isVisible(sLocator)){
                    log.info("Wait for "+sElementType+" visible,OK");
                    break;
                    }
                } catch (Exception e) {}
            try {
                Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    }
                }
         }

和一个  wait for value 例子
public boolean waitForValueToPresent(String value,int timeout){
        log.info(this.sElementType + " waitForValueToPresent");
                while(true){
                        if(timeout<0){
                                return false;
                                }
                        timeout--;
                        if(this.sel.getValue(this.sElementPath).equals(value)){
                                return true;
                                }else{
                                        try{
                                                Thread.sleep(1000);
                                                }catch(Exception e){
                                                        e.printStackTrace();
                                                        }
                                                }
                        }
                }
作者: nosedive    时间: 2009-1-8 15:47
谢谢楼上,问题解决了,出在两个地方。
1。我的脚本用的firefox,换成ie就可以了。听同事说这是selenium的一个BUG,如何解决我再研究下之后发上来
2.我用IE跑的时候出现了404页面无法打开的问题,设置了IE就可以了。

终于完成了搭建的第一步,以后和大家一起学习selenium,这个帖子真好,有啥问题都在这里讨论了!
作者: snnylip    时间: 2009-1-8 15:58
标题: 回复 55# 的帖子
我一般用waitForPageToLoad
作者: gchao    时间: 2009-1-8 16:08
标题: 回复 57# 的帖子
很感谢bruce的回答,但是目前来讲,我现在只是刚刚接触到selenium IDE 这个软件,还没有涉及到编程方面的知识,而且现在来说问题主要是关于想找个一个可以取代pause的命令,网上看了一下waitforvalue这个命令可以,waitForValue(locator, pattern) ,但是是不是这个命令只有输入字符的时候可以使用,对于等待按键来说使用不了?谢谢
作者: gchao    时间: 2009-1-8 16:12
标题: 回复 59# 的帖子
谢谢你,但是我想waitforpagetoload ,这个命令不是只有在等待网页的时候可以用 如果等待某一个按键或者某一个元素的话,是不是不能用呢?
作者: bruce.gu    时间: 2009-1-8 16:54
waitforpagetoload  只有这个页面load的时候可用。。ajax的局部页面loading 不能用。
原帖由 gchao 于 2009-1-8 16:12 发表
谢谢你,但是我想waitforpagetoload ,这个命令不是只有在等待网页的时候可以用 如果等待某一个按键或者某一个元素的话,是不是不能用呢?

作者: gchao    时间: 2009-1-8 16:57
网站是Ajax技术的,怎么样才能让selenium IDE执行完一个命令之后再执行下一个命令? 觉得有些时候,selenium IDE运行太快的话,在同一个页面,运行完一个命令后,还没有等到网页执行完这个命令后,就执行了下一个命令,这样的话上一个命令网页还没有响应,就到下一个命令了,所以我做的自动运行有时候就会出错,除了pause可以解决这个问题,其他有没有好点的命令可以解决,谢谢。
作者: bruce.gu    时间: 2009-1-8 16:59
waitforvalue 只有能取到value 的控件才能用吧,一般用在textfield
我想waitforpresent 应该可以解决你的问题, 不知道是不是你写的locator有点问题。。建议用firebug + xpath checker
保证你使用的locator 在页面上对应唯一的控件

原帖由 gchao 于 2009-1-8 16:08 发表
很感谢bruce的回答,但是目前来讲,我现在只是刚刚接触到selenium IDE 这个软件,还没有涉及到编程方面的知识,而且现在来说问题主要是关于想找个一个可以取代pause的命令,网上看了一下waitforvalue这个命令可以,w ...

作者: gchao    时间: 2009-1-8 17:03
标题: 回复 62# 的帖子
谢谢你,所以我有时候用wait for element present ,但是发现有些时候也不是很好用
作者: gchao    时间: 2009-1-8 17:11
标题: 回复 64# 的帖子
谢谢,也就是说,现在我不用了wait for value 这个命令来测试? 还有value控件指的是什么
作者: bruce.gu    时间: 2009-1-8 17:39
function getInputValue(inputElement) {
    if (inputElement.type) {
        if (inputElement.type.toUpperCase() == 'CHECKBOX' ||
            inputElement.type.toUpperCase() == 'RADIO')
        {
            return (inputElement.checked ? 'on' : 'off');
        }
    }
    if (inputElement.value == null) {
        throw new SeleniumError("This element has no value; is it really a form field?");
    }
    return inputElement.value;
}

这个是selenium core 的代码。
只要有value属性,就可以获取到。当然input element 就稍微特殊一点,不一定需要 value attribute.
对于非input 也可以用getAttribute(locator+"@value")

原帖由 gchao 于 2009-1-8 17:11 发表
谢谢,也就是说,现在我不用了wait for value 这个命令来测试? 还有value控件指的是什么

[ 本帖最后由 bruce.gu 于 2009-1-8 17:40 编辑 ]
作者: gchao    时间: 2009-1-12 09:36
标题: 回复 67# 的帖子
非常感谢你,我想问一个问题,就是selenium IDE 这里面的命令,有没有可以设置脚本最大运行时间的命令,比如说如果我想运行一个脚本文件最多五分钟,超过五分钟就运行下一个脚本文件,有这样的命令吗? 有的话请告知一二,谢谢,另外在我测试的网页中在一个地方会有对话框出现,但是有时候又不会存在,如果我想自动运行selenium IDE ,在这个地方应该怎么样进行设置,有没有这样的命令,有对话框出现就点击确定,然后进行下一步操作,没有对话框就直接进行下一步操作,如果有的话,请告诉一下,无比感谢!
作者: bruce.gu    时间: 2009-1-12 12:20
这些东西在ide里面我都没试过。实际上我很少用到ide。毕竟ide局限太多。
如果在rc模式下面的话。你说的两个问题都很容易解决。
第一个问题只要在程序里设一个计时的。
第二问题只要用 try{}catch(){} 来实现。
原帖由 gchao 于 2009-1-12 09:36 发表
非常感谢你,我想问一个问题,就是selenium IDE 这里面的命令,有没有可以设置脚本最大运行时间的命令,比如说如果我想运行一个脚本文件最多五分钟,超过五分钟就运行下一个脚本文件,有这样的命令吗? 有的话请告知一 ...

作者: fairylly    时间: 2009-1-13 15:36
我是selenium新手
这两天遇到一个问题:
图片按钮链接页面,在IDE中回放可以成功
放到selenium Core及eclipse中就会出错,提示后一条命令中的element找不到(实际是图片链接点击后,页面没有跳转成功,导致后面的命令失败的)

eclipse中的图片链接命令:
selenium.click("//li[@id='mm2']/a/span");

是图片链接需要特殊处理,还是别的什么原因导致的呢?
作者: 多米尼克    时间: 2009-1-13 16:56
兄弟还是蛮强的,多交流交流
作者: bruce.gu    时间: 2009-1-13 18:16
两种情况: 1.click没成功,确认click的locator 正确,如果还不行,尝试一下mouseDown, mouseUp 代替click试试看。
          2.click之后没wait, 用一个wait for page to load 之类的。
原帖由 fairylly 于 2009-1-13 15:36 发表
我是selenium新手
这两天遇到一个问题:
图片按钮链接页面,在IDE中回放可以成功
放到selenium Core及eclipse中就会出错,提示后一条命令中的element找不到(实际是图片链接点击后,页面没有跳转成功,导致后面的 ...

作者: fairylly    时间: 2009-1-14 11:43
原帖由 bruce.gu 于 2009-1-13 18:16 发表
两种情况: 1.click没成功,确认click的locator 正确,如果还不行,尝试一下mouseDown, mouseUp 代替click试试看。
          2.click之后没wait, 用一个wait for page to load 之类的。



1、click的locator是正确的,我是使用IDE自动获取到的,并确认没有错误
2、尝试使用mouseDown代替click,但一样出错,mouseDown后有使用waitForPageToLoad函数
3、click后有使用waitForPageToLoad函数
但每次都是报waitForPageToLoad超时出错
作者: fairylly    时间: 2009-1-14 11:44
另使用loggingSeleniium时,是否只有在出错的时候才会记录日志文件,没有错误时,日志文件为空?
作者: fairylly    时间: 2009-1-14 12:59
原帖由 bruce.gu 于 2009-1-13 18:16 发表
两种情况: 1.click没成功,确认click的locator 正确,如果还不行,尝试一下mouseDown, mouseUp 代替click试试看。
          2.click之后没wait, 用一个wait for page to load 之类的。



图片链接已解决

使用selenium.click("link=XXXX");这种link的方式可解决
“XXXX”为源码:
<li>XXXX<li>
中的文字
作者: bruce.gu    时间: 2009-1-14 13:32
恭喜,link=xxx 是selenium 支持的一种locator, 其他的 id=xxx, name=xxx, xpath=xxx 之类
原帖由 fairylly 于 2009-1-14 12:59 发表



图片链接已解决

使用selenium.click("link=XXXX");这种link的方式可解决
“XXXX”为源码:
XXXX
中的文字

作者: bruce.gu    时间: 2009-1-14 13:34
loggingSelenium 不管 有没有错都记录的。
另外loggingSelenium 好像更新够及时,跟不上selenium。 偶已经抛弃loggingSelenium 了。自己依葫芦画瓢做了一个适合自己的logging。
原帖由 fairylly 于 2009-1-14 11:44 发表
另使用loggingSeleniium时,是否只有在出错的时候才会记录日志文件,没有错误时,日志文件为空?

作者: fairylly    时间: 2009-1-14 13:57
我遇到一个新问题:

脚本中有一句是:点击系统中的“退出”,并在确定提示框中点击“确定”
即:selenium.click("link=退出");
  assertEquals("你确定要退出吗", selenium.getConfirmation());

但运行时,会把整个浏览器窗口跳转到退出页面,这样就无法继续后面的脚本,包括tearDown()函数都不运行,eclipse的junit状态中,一直显示在运行状态。。。
[attach]48612[/attach]
[attach]48613[/attach]
[attach]48614[/attach]
作者: bruce.gu    时间: 2009-1-14 16:02
不知道你是不是想选择 取消。
selenium 碰到 getConfirmation 之类会默认 选择 Yes. 如果要在碰到confirmation 之类选No 的话。。在触发confirmation 事件之前 用 selenium.chooseCancelOnNextConfirmation();
所以就在你click link 之前 把这个添加进去,然后confirmation 出来的的时候就选择成了cancel。



原帖由 fairylly 于 2009-1-14 13:57 发表
我遇到一个新问题:

脚本中有一句是:点击系统中的“退出”,并在确定提示框中点击“确定”
即:selenium.click("link=退出");
  assertEquals("你确定要退出吗", selenium.getConfirmation());

但运行时, ...

[ 本帖最后由 bruce.gu 于 2009-1-14 16:04 编辑 ]
作者: fairylly    时间: 2009-1-14 16:20
原帖由 bruce.gu 于 2009-1-14 16:02 发表
不知道你是不是想选择 取消。
selenium 碰到 getConfirmation 之类会默认 选择 Yes. 如果要在碰到confirmation 之类选No 的话。。在触发confirmation 事件之前 用 selenium.chooseCancelOnNextConfirmation();
所 ...


我不是想“取消”,就是“确定”退出,查看确定退出后的页面是否是我想要的页面
但退出后,退出页面会把整个浏览器替换,这样就没办法继续后面的工作了
作者: bruce.gu    时间: 2009-1-14 16:39
尝试selenium server 的 multiwindow 模式
原帖由 fairylly 于 2009-1-14 16:20 发表


我不是想“取消”,就是“确定”退出,查看确定退出后的页面是否是我想要的页面
但退出后,退出页面会把整个浏览器替换,这样就没办法继续后面的工作了

作者: fairylly    时间: 2009-1-14 17:14
原帖由 bruce.gu 于 2009-1-14 16:39 发表
尝试selenium server 的 multiwindow 模式


使用multiwindow模式,可以解决该问题,谢谢。。。
作者: bruce.gu    时间: 2009-1-14 17:29
恭喜,加油。呵呵
原帖由 fairylly 于 2009-1-14 17:14 发表


使用multiwindow模式,可以解决该问题,谢谢。。。

作者: fairylly    时间: 2009-1-14 17:49

还想问个问题:
你是否有遇到过:同样的代码,SRC运行时,有时通过,有时不通过呢?

不通过的地方,通常是waitForPageToLoad超时
作者: bruce.gu    时间: 2009-1-15 09:51
这个很正常,有时候服务器或者网络慢,那就超时了喽。
可以wait时间长一点试试。不过selenium默认最长等待时间是30s。如果你要设置更加长的,你要先selenium.setTimeout(timeout);然后再selenium.waitForPageToLoad(timeout).

另外 如果是ajax里面,不是整个页面load的话,还用wait for element to present 好。
原帖由 fairylly 于 2009-1-14 17:49 发表

还想问个问题:
你是否有遇到过:同样的代码,SRC运行时,有时通过,有时不通过呢?

不通过的地方,通常是waitForPageToLoad超时

作者: fairylly    时间: 2009-1-15 10:02
出错的时候,一段时间内(有时几小时,有时一天)都是同一个地方出错;不是一会正常一会出错,而是持续性的

而且我开WEB端,手动点击时,也都是很快反映过来的
应该不是网络和服务器的问题
其它反映慢的页面都能正常加载,原本加载很快的页面反而出错
作者: bruce.gu    时间: 2009-1-15 11:40
是不是这个地方根本不需要这个命令?出错的时候,可以用Thread.sleep(); 代替来调式一下。
原帖由 fairylly 于 2009-1-15 10:02 发表
出错的时候,一段时间内(有时几小时,有时一天)都是同一个地方出错;不是一会正常一会出错,而是持续性的

而且我开WEB端,手动点击时,也都是很快反映过来的
应该不是网络和服务器的问题
其它反映慢的页面都能 ...

作者: fairylly    时间: 2009-1-15 12:04
原帖由 bruce.gu 于 2009-1-15 11:40 发表
是不是这个地方根本不需要这个命令?出错的时候,可以用Thread.sleep(); 代替来调式一下。


可以不要waitForPageToLoad函数时,我也加了这句,会有影响吗?
作者: bruce.gu    时间: 2009-1-15 13:22
好像会有影响的。。去掉试试看好了。
原帖由 fairylly 于 2009-1-15 12:04 发表


可以不要waitForPageToLoad函数时,我也加了这句,会有影响吗?

作者: fairylly    时间: 2009-1-15 14:12
确实有影响
如果页面没有变化,或变化太快,使用waitForPageToLoad函数,反而会造成超时出错
作者: fairylly    时间: 2009-1-15 16:58
运行脚本过程中,使用的是FF浏览器
但一些操作会导致出现:
[attach]48645[/attach]

使用selenium.getConfirmation();,会提示说:There were no confirmations
是否有什么其它解决方案呢?
(注:FF下手动操作时,没有该弹出框,只有在eclipse中运行脚本时,浏览器里才会有该弹出框)

尝试在FF的“工具”->“选项”中,修改一些配置,但没有效果
selenium中是否有什么方法可行呢?

可以使用selectWindow吗?但这种情况下,我也不知道应该如何使用它
作者: bruce.gu    时间: 2009-1-15 17:30
多次提交造成的吧。
原帖由 fairylly 于 2009-1-15 16:58 发表
运行脚本过程中,使用的是FF浏览器
但一些操作会导致出现:
48645

使用selenium.getConfirmation();,会提示说:There were no confirmations
是否有什么其它解决方案呢?
(注:FF下手动操作时,没有该弹出框 ...

作者: fairylly    时间: 2009-1-15 17:33
切换页面风格,即整个WEB的TPL模版全部变化导致的
作者: bruce.gu    时间: 2009-1-16 14:31

try{
selenium.getConfirmation();
}catch(Exception e){}
试试
原帖由 fairylly 于 2009-1-15 17:33 发表
切换页面风格,即整个WEB的TPL模版全部变化导致的

作者: fairylly    时间: 2009-1-19 08:43
原帖由 bruce.gu 于 2009-1-16 14:31 发表

try{
selenium.getConfirmation();
}catch(Exception e){}
试试


使用try catch不行
打印错误信息,还是com.thoughtworks.selenium.SeleniumException: ERROR: There were no confirmations这个弹出框是FF浏览器本身弹出的,不是程序代码导致的
所以用selenium.getConfirmation应该是捕获不到的吧
作者: bruce.gu    时间: 2009-1-19 09:32
对的,浏览器本身的是捕获不到的,selenium只能捕获js的。alert, confirmation 之类。
原帖由 fairylly 于 2009-1-19 08:43 发表


使用try catch不行
打印错误信息,还是com.thoughtworks.selenium.SeleniumException: ERROR: There were no confirmations这个弹出框是FF浏览器本身弹出的,不是程序代码导致的
所以用selenium.getConfirmati ...

作者: nosedive    时间: 2009-1-19 11:21
hi, 我有一个问题要请教。
现在需要按“moody's NRDE"按钮,然后进入到下一个界面中,这个操作在IE上是可以通过的。但是用selenium跑的时候页面就不能跳转到下一个界面了,并且提示"done. but with errors on page."这是怎么回事?
sever 上有一个报错是:
warn-invalid length: content-length=22395 written=16047 for http://mdynycdssmdev.ad.moodys.n ... E2E2_DDS/MOODYS.CSS

我的代码如下:
public void test() throws Throwable {
... ...
                selenium.selectFrame("Tree");            
                selenium.click("GotoNRDE");
                selenium.waitForPageToLoad("50000");
    }


[ 本帖最后由 nosedive 于 2009-1-19 11:37 编辑 ]
作者: bruce.gu    时间: 2009-1-19 13:14
用selenium IDE 在firefox 上面跑一下你下面三条命令看。
原帖由 nosedive 于 2009-1-19 11:21 发表
hi, 我有一个问题要请教。
现在需要按“moody's NRDE"按钮,然后进入到下一个界面中,这个操作在IE上是可以通过的。但是用selenium跑的时候页面就不能跳转到下一个界面了,并且提示"done. but with errors on page. ...

作者: nosedive    时间: 2009-1-19 15:53
我们的系统不支持firefox。。。没办法在FF里跑,我直接抓取到对象,然后写的代码。

[ 本帖最后由 nosedive 于 2009-1-19 16:17 编辑 ]
作者: nosedive    时间: 2009-1-19 17:30
原帖由 nosedive 于 2009-1-19 15:53 发表
我们的系统不支持firefox。。。没办法在FF里跑,我直接抓取到对象,然后写的代码。


问题解决了,我之前写的不清楚,估计很难找到问题。其实是这样的。“GotoNRDE”不是一个简单的button,click它之后其实是调用了一个javascript。然后我猜想问题是出在页面加载JS上了。因为selenium在运行的时候会在回放的页面底部整合进两个frame,就是我们看selenium的控制台。但是当页面调用JS时,可能涉及到页面frame,如果这个JS写的不严谨的话,就可能找不到对应的frame,所以页面就出错了。
然后在运行selenium时把底部的frame给去掉就可以了。
不知道我说清楚了没有,总之如果大家遇到这样的问题可以这么试试。另外,我觉得其实可以的话,最好能建议SE把代码改一改。,毕竟你不能确定客户会在IE上加载什么。




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2