关于对Selenium的理解 .
上一篇 / 下一篇 2012-11-26 14:06:06 / 个人分类:Selenium
使用Selenium做Web自动化测试也不是一天两天了。直到最近看到TW内部的一位哥们的博客,才真的理解Selenium的发展历史。由于笔者开始使用的时候,已经是2.20.x,直接就上了WebDriver。其实有一些疑问还是一直在心中萦绕,不过现在清楚了。特此总结一下。51Testing软件测试网 CU+yu Y ?;m4X]5{:Y
2Y-L!n4W\p0参考博客:http://tuohuang.thoughtworkers.org/?p=15751Testing软件测试网"bhYK9G7e
51Testing软件测试网!s P#n(eE-K6^51Testing软件测试网[ duaa
Selenium RC
[#P{+P0p!yk04Ze{f0N:b9p5oSV8Q051Testing软件测试网)k0^.l$S x}~
早期的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软件测试网:NCi
})`L.O
启动Selenium Server以及RC至今为止还保留着,应该是考虑到向前兼容吧,命令如下:
}&Jb{ j0s4|1j q)Gr051Testing软件测试网z5k;v8I*}dv51Testing软件测试网9S.uOT9P
- java -jar selenium-server-standalone-2.14.0.jar -role hub
- java -jar selenium-server-standalone-2.14.0.jar -role node -hub http://localhost:4444/grid/register
java -jar selenium-server-standalone-2.14.0.jar -role hub java -jar selenium-server-standalone-2.14.0.jar -role node -hub http://localhost:4444/grid/register
v,P WdUc4CW [051Testing软件测试网2tI{N7LFp)A0Y T
WebDriver51Testing软件测试网'M+aW|[9W1w`
51Testing软件测试网!r7V2s#L&T
D P+H
za\2@
U051Testing软件测试网U$@2O)mG&cc
O6Jc+I
当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&Bs my051Testing软件测试网~~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.N051Testing软件测试网7}z0@L
ld2P
一个简答的使用WebDriver的例子:
#b%^+HXk pT051Testing软件测试网!I.z0Q;p8d$UD+Z9d:X7f9]\ t$W0
- static{System.setProperty("webdriver.firefox.bin","C:/Program Files (x86)/Mozilla Firefox/firefox.exe");}
- FirefoxDriver driver = new FirefoxDriver();
- String url = "http://ap13933:8080";
- driver.manage().window().setSize(new Dimension(1440,1000));
- driver.get(url);
- WebElement name = driver.findElement(By.id("UserName"));
- WebElement pwd = driver.findElement(By.id("OldPassword"));
- while(!name.isDisplayed() || !pwd.isDisplayed())
- sleep(100);
- name.clear();
- pwd.clear();
- name.sendKeys(username);
- pwd.sendKeys(password);
- pwd.submit();
static{System.setProperty("webdriver.firefox.bin","C:/Program Files (x86)/Mozilla Firefox/firefox.exe");} FirefoxDriver driver = new FirefoxDriver(); String url = "http://ap13933:8080"; driver.manage().window().setSize(new Dimension(1440,1000)); driver.get(url); WebElement name = driver.findElement(By.id("UserName")); WebElement pwd = driver.findElement(By.id("OldPassword")); while(!name.isDisplayed() || !pwd.isDisplayed()) sleep(100); name.clear(); pwd.clear(); name.sendKeys(username); pwd.sendKeys(password); pwd.submit();51Testing软件测试网_!?'K#VGW.O
51Testing软件测试网)g3HaQ9]?,t*H/q&z4K
使用WebDriver的心得
"z@7M2BVi|S0/jsFR`/Ma0
/ws.b,z%\8nt
o0
其中WebDriver的更加面向对象的方式大大降低了Selenium的入门门槛,对Web元素的操作也非常之简单易学。实际项目用起来,工作量最大的部分就是你如何解析定位到你的目标项目页面中的各种元素。好比你要定位一个Button,你可以用ID,可以用CSS,可以用XPATH,你为了点击这个Button,写了一个函数调用Selenium里的API,即WebElement里的click()或者submit(),那么另外一个Button怎么办?成百上千个Button又怎么办?51Testing软件测试网_T7T;kV/m4Q&b6B