selenium的入门理解

上一篇 / 下一篇  2012-11-09 16:22:15 / 个人分类:Selenium

    网络上关于selenium的资料劈天盖地的,这只是个人在使用过程中记录的一点个人心得,抛砖引玉。
-o-jyrz {0    使用Selenium做Web自动化测试也不是一天两天了。直到最近看到TW内部的一位哥们的博客,才真的理解Selenium的发展历史。由于笔者开始使用的时候,已经是2.20.x,直接就上了WebDriver。其实有一些疑问还是一直在心中萦绕,不过现在清楚了。特此总结一下。

9U_/l&W4C6JZr0

参考博客:http://tuohuang.thoughtworkers.org/?p=157

^2o,?%o+c(ev:O,R!j PD0

51Testing软件测试网4oS [aN,q zN
51Testing软件测试网Bp(J7Jq!j5~'O

Selenium RC

Kz|9b8Q6a/c0

51Testing软件测试网o/_ T*ZB7^ g

3@ v\Mp6V\*` oh0

早期的Selenium使用的是Javascript注入技术与浏览器打交道,需要Selenium RC启动一个Server,将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript。开发过Web应用的人都知道,Javascript可以获取并调用页面的任何元素,自如的进行操作。由此才实现了Selenium的目的:自动化Web操作。这种Javascript注入技术的缺点是速度不理想,而且稳定性大大依赖于Selenium内核对API翻译成的Javascript质量高低。51Testing软件测试网 }(zp!l&\ m4|+c

51Testing软件测试网P cA&x q6?z
51Testing软件测试网,d&\$m#S2]

启动Selenium Server以及RC至今为止还保留着,应该是考虑到向前兼容吧,命令如下:

O3L Y7}A6u.vZ0
以下内容为程序代码:
,q5w_?-c Q s;dp0
?v|3~"v'|O }M0java -jar selenium-server-standalone-2.14.0.jar -role hub
~;i9RO9Z N;M0java -jar selenium-server-standalone-2.14.0.jar -role node -hub http://localhost:4444/grid/register 

 51Testing软件测试网[wNE K7O

WebDriver

,rU \I7l0


&a.E0Z$DL$~0

Xd2^3N/y6{:b&T)w0

当Selenium2.x 提出了WebDriver的概念之后,它提供了完全另外的一种方式与浏览器交互。那就是利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。由于使用的是浏览器原生的API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学。然而带来的一些副作用就是,不同的浏览器厂商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了Selenium WebDriver要分浏览器厂商不同,而提供不同的实现。例如Firefox就有专门的FirefoxDriver,Chrome就有专门的ChromeDriver等等。(甚至包括了AndroidDriver和iOS WebDriver)

S U }3o X#fpI A"pr0


1F3u[g+D%ELz3b0
51Testing软件测试网/cM-w,~LI5F

引用一句个人赞同的原文:如果你使用的是WebDriver,你就可以直接抛弃Selenium Server。因为你根本不需要启动一个服务器来处理浏览器交互。

?7R8\WbB+Dn0


{4`7CF4FR2K0
51Testing软件测试网,Zj$LL!HC

一个简答的使用WebDriver的例子:51Testing软件测试网@(B!Z%}*KG`

51Testing软件测试网i&b/J)\I[ k

以下内容为程序代码:
Ua?H:B2L{*v"b0
;YKYOb!L+J0static{System.setProperty("webdriver.firefox.bin","C:/Program Files (x86)/Mozilla Firefox/firefox.exe");}51Testing软件测试网4~&qG'}nG
FirefoxDriver driver = new FirefoxDriver();51Testing软件测试网L#B$i R{alK%Z
String url = "http://ap13933:8080";
)I R LI*GB0driver.manage().window().setSize(new Dimension(1440,1000));51Testing软件测试网7[ F3o$E/Du"F,pN$m
driver.get(url);
0V#Dn6W\&D!p,r0
9v{!s4N{o/c^0WebElement name = driver.findElement(By.id("UserName"));51Testing软件测试网1eR M*re*ya-E|!`(R
WebElement pwd = driver.findElement(By.id("OldPassword"));
1N)d3D.}|b0while(!name.isDisplayed() || !pwd.isDisplayed())
o ~ap9Z"P@`%v0sleep(100);
7@$f)Cy"]Ke'u|051Testing软件测试网5Q _D8wPub
name.clear();51Testing软件测试网 c:wo&B!}:S C6XQ:j pG'k
pwd.clear();51Testing软件测试网cD ^4H7F/l
name.sendKeys(username);
6M7C*Vi[!y8J5F0pwd.sendKeys(password);
"z ?\.yg)? q m0pwd.submit();

使用WebDriver的心得51Testing软件测试网S[6u7Q6_K

51Testing软件测试网4P5rBy;a
51Testing软件测试网Y;CD#f8oux

其中WebDriver的更加面向对象的方式大大降低了Selenium的入门门槛,对Web元素的操作也非常之简单易学。实际项目用起来,工作量最大的部分就是你如何解析定位到你的目标项目页面中的各种元素。好比你要定位一个Button,你可以用ID,可以用CSS,可以用XPATH,你为了点击这个Button,写了一个函数调用Selenium里的API,即WebElement里的click()或者submit(),那么另外一个Button怎么办?成百上千个Button又怎么办?

!V+W:Efb'f1L-V0

51Testing软件测试网~^/y0?*F.sBW }
51Testing软件测试网2zf;kl[X

所以,你需要有一套自己实现的算法或者封装,来根据项目页面的特点提供一套通用的元素定位方式。当你的通用定位逻辑能准确的找到任何一个元素的时候,剩下的事情就顺理成章了,交给Selenium WebElement的API就可以了。这一套定位逻辑笔者觉得才是使用Selenium做Web自动化工作量最大的部分。当然有的公司Web项目使用了自己开发的UI框架,例如笔者所在的公司,这样Web元素的定位规则和算法就比较容易设计。如果Web项目开发出来的页面代码比较杂乱无章,那么你就需要更加高明和严谨的逻辑去寻找你想要操作和查看的元素了!

E9yp[B%H,R0]^7jkh0

在笔者的项目里,笔者自己设计并封装了一套通用的API,去智能的定位页面中的各种类型的元素。比如项目里的页面有大量的dialog和wizard,都是用div+css实现的。我就提供了一个dialog组件,带有next(),save(),finish(),click(String buttonName),cancel()等方法,然后根据遮罩层和loading Icon的时间来追踪操作完成的进度。这里只是举个小小的例子,有机会再分享更多的细节。后续selenium的源码分析之webdriver

G ZW)e#a NH#pA0

注:出自公司一个好哥们整理51Testing软件测试网 QEX^d/z:RBd/GX;y-s-s


TAG:

 

评分:0

我来说两句

Open Toolbar