关于对Selenium的理解 .

上一篇 / 下一篇  2012-11-26 14:06:06 / 个人分类:Selenium

51Testing软件测试网 j?(ls3A LA4U

使用SeleniumWeb自动化测试也不是一天两天了。直到最近看到TW内部的一位哥们的博客,才真的理解Selenium的发展历史。由于笔者开始使用的时候,已经是2.20.x,直接就上了WebDriver。其实有一些疑问还是一直在心中萦绕,不过现在清楚了。特此总结一下。51Testing软件测试网 C U+yuY?;m4X]5{:Y

2Y-L!n4W\p0参考博客:http://tuohuang.thoughtworkers.org/?p=15751Testing软件测试网"b hYK9G7e

51Testing软件测试网!s P#n(eE-K6^

51Testing软件测试网[ duaa

(e*X)B:YM0gi/{Y051Testing软件测试网 cdl:w-jPWk

Selenium RC

[#P{+P0p!yk0

4Ze{f0N:b9p5oSV8Q051Testing软件测试网)k0^.l$S x}~

4o0f1i0k(uP@J0G051Testing软件测试网-Co1} m5i oK.r]_

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

"X2p&Q,j%` ? L051Testing软件测试网 XODOK^a{3\
51Testing软件测试网:NC i })`L.O

51Testing软件测试网C1N6NsJ,X3f

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

}&J b{ j0s4|1j q)Gr051Testing软件测试网z5k;v8I*}dv

51Testing软件测试网9S.uOT9P

[plain]view plaincopyprint?
  1. java -jar selenium-server-standalone-2.14.0.jar -role hub  
  2. java -jar selenium-server-standalone-2.14.0.jar -role node  -hub http://localhost:4444/grid/register  

v,P WdUc4CW [0
51Testing软件测试网2tI{ N7LFp)A0Y T

WebDriver51Testing软件测试网'M+a W|[9W1w`

51Testing软件测试网!r7V2s#L&T


D P+H za\2@ U0
51Testing软件测试网U$@2O)mG&cc O6Jc+I

51Testing软件测试网Z{%E8v#XM

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

:k z&Bsmy051Testing软件测试网~~jWztuE4l
51Testing软件测试网 c f{1i3I5DU

6^e~0S0y{0引用一句个人赞同的原文:如果你使用的是WebDriver,你就可以直接抛弃Selenium Server。因为你根本不需要启动一个服务器来处理浏览器交互。51Testing软件测试网 K\x3D's)a^"Yw

rt1P&~G4`}8|1H`|0
8l7gq)\N)\'n.N0
51Testing软件测试网7}z0@ L ld2P

51Testing软件测试网\4DRng [F3lD

一个简答的使用WebDriver的例子:

#b%^+HXk pT051Testing软件测试网!I.z0Q;p8d$UD+Z

9d:X7f9]\ t$W0
[java]view plaincopyprint?
  1. static{System.setProperty("webdriver.firefox.bin","C:/Program Files (x86)/Mozilla Firefox/firefox.exe");}  
  2. FirefoxDriver driver = new FirefoxDriver();  
  3. String url = "http://ap13933:8080";  
  4. driver.manage().window().setSize(new Dimension(1440,1000));  
  5. driver.get(url);  
  6.   
  7. WebElement name = driver.findElement(By.id("UserName"));  
  8. WebElement pwd = driver.findElement(By.id("OldPassword"));  
  9. while(!name.isDisplayed() || !pwd.isDisplayed())  
  10.     sleep(100);  
  11.                   
  12. name.clear();  
  13. pwd.clear();  
  14. name.sendKeys(username);  
  15. pwd.sendKeys(password);  
  16. pwd.submit();  
51Testing软件测试网_!?'K#VG W.O
51Testing软件测试网)g3HaQ9] ?,t*H/q&z4K

使用WebDriver的心得

"z@7M2BVi|S0

/jsFR`/Ma0
/ws.b,z%\8nt o0

'[ rJ.T!`QT)~051Testing软件测试网!Xvs U"g$r3K$mXP

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

C&U3Ni$U8B&a051Testing软件测试网r3W#N:lGO8w+y
51Testing软件测试网!U&O o|a2|6y!Q

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

51Testing软件测试网+E Dh3lHZ&Q


s E%KNdZ;@O0

n XRF[)I&u9d)r0

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

i Z N%ewu`&z0

TAG:

 

评分:0

我来说两句

Open Toolbar