selenium技术体系概述

l  selenium技术体系

l  从代码中验证原理及研究

 

近来弄了一下chrome,工程确实庞大。不过收获颇丰。Selenium测试工具一直是测试团队的测试工具,不过一直没有仔细研究过。此次研究chrome时顺手看了看,比以前清晰和很多,也具备更多的修改基础。

全文以chrome为例子,IEFF等,原理相同,我没在细究。再个也是随看随写,错误之处在所难免了。发现了就会及时更正的 :) 

l  selenium技术体系

大概流程和涉及到的技术用下图概述:

 l  从代码中验证原理及研究

1.     简单示例 

 
  
  1. public class Test { 
  2.     public static void main(String[] args) { 
  3.         System.out.println("-----chromedriver 启动了吗?----"); 
  4.         //启动chromedriver.exe.        
  5.         WebDriver driver = new ChromeDriver(); 
  6.         System.out.println("-----mark----"); 
  7.          
  8.          
  9.         ((RemoteWebDriver) driver).setLogLevel(Level.WARNING);//设定日志级别,方便查看命令 
  10.          
  11.          
  12.         //简单查询 
  13.         final String strKeyWord="踏歌手机报解决方案"
  14.         driver.get("http://www.baidu.com"); 
  15.         driver.findElement(By.id("kw")).clear(); 
  16.         driver.findElement(By.id("kw")).sendKeys(strKeyWord); 
  17.         driver.findElement(By.id("su")).click(); 
  18.  
  19.         //完成后退出浏览器 
  20.         driver.quit(); 
  21.     } 

输出: 

 
  
  1. -----chromedriver 启动了吗?---- 
  2. Started ChromeDriver 
  3. port=9503 
  4. version=23.0.1240.0 
  5. log=E:\java\selenium-test\chromedriver.log 
  6. -----mark---- 
  7. 十二月 302012 9:30:33 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  8. WARNING: Executing: get [68dea2759dab1f189adcb6ef01576bfa, get {"url":"http://www.baidu.com"}] 
  9. 十二月 302012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  10. WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, get {"url":"http://www.baidu.com"}] 
  11. 十二月 302012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  12. WARNING: Executing: findElement [68dea2759dab1f189adcb6ef01576bfa, findElement {"using":"id","value":"kw"}] 
  13. 十二月 302012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  14. WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, findElement {"using":"id","value":"kw"}] 
  15. 十二月 302012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  16. WARNING: Executing: clearElement [68dea2759dab1f189adcb6ef01576bfa, clearElement {"id":":wdc:1356874235675"}] 
  17. 十二月 302012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  18. WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, clearElement {"id":":wdc:1356874235675"}] 
  19. 十二月 302012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  20. WARNING: Executing: findElement [68dea2759dab1f189adcb6ef01576bfa, findElement {"using":"id","value":"kw"}] 
  21. 十二月 302012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  22. WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, findElement {"using":"id","value":"kw"}] 
  23. 十二月 302012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  24. WARNING: Executing: sendKeysToElement [68dea2759dab1f189adcb6ef01576bfa, sendKeysToElement {"id":":wdc:1356874235675","value":["踏歌手机报解决方案"]}] 
  25. 十二月 302012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  26. WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, sendKeysToElement {"id":":wdc:1356874235675","value":["踏歌手机报解决方案"]}] 
  27. 十二月 302012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  28. WARNING: Executing: findElement [68dea2759dab1f189adcb6ef01576bfa, findElement {"using":"id","value":"su"}] 
  29. 十二月 302012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  30. WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, findElement {"using":"id","value":"su"}] 
  31. 十二月 302012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  32. WARNING: Executing: clickElement [68dea2759dab1f189adcb6ef01576bfa, clickElement {"id":":wdc:1356874235676"}] 
  33. 十二月 302012 9:30:36 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  34. WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, clickElement {"id":":wdc:1356874235676"}] 
  35. 十二月 302012 9:30:36 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  36. WARNING: Executing: quit [68dea2759dab1f189adcb6ef01576bfa, quit {}] 
  37. [1230/213036:ERROR:ipc_sync_channel.cc(378)] Canceling pending sends 
  38. [1230/213036:ERROR:ipc_sync_channel.cc(378)] Canceling pending sends 
  39. [1230/213036:ERROR:ipc_sync_channel.cc(378)] Canceling pending sends 
  40. 十二月 302012 9:30:37 下午 org.openqa.selenium.remote.RemoteWebDriver log 
  41. WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, quit {}] 

 

一些分析:

结合代码:

System.out.println("-----chromedriver 启动了吗?----");

//启动chromedriver.exe.    

WebDriver driver = new ChromeDriver();

System.out.println("-----mark----");

输出:

-----chromedriver 启动了吗?----

Started ChromeDriver

port=9503

version=23.0.1240.0

log=E:\java\selenium-test\chromedriver.log

-----mark----

 

依据上述的源码和输出,可以知道chromedriver.exe是有new chromedriver代码行启动的。

WebDriver.java selenium-api.jar 里。

Chromedriver.javaselenium-chrome-driver.jar

EclipseF3跟几下new chromedriver() 代码的话,没两下就会到DriverService.java,此代码在selenium-remote-driver.jar里。

大致就体现了: 

 

通过简单的代码分析,可以验证文章开始时给出的图是正确的。

更复杂的分析和调试下次进行。

计划:

Vc2010调试chrome.exe chromedriver.exe

Eclipse 调试selenium

结合起来就能弄的更明白。

 

1.    另外一个例子

说例子前说一个感觉,一直以来觉得selenium这种测试方式,每次启动时很慢。经过分析后,发现chromedriver.exe其实就是一个服务中转程序,内部是用mongoose(一个嵌入式web server)实现的http 端口服务。所以就考虑能否启动一个公用的chromedriver.exe  这样不用每次都启动,可以精简一点时间。通过看源码,有点门路:

a.启动chromedriver.exe

b. 写代码调用这个driver服务 

 
  
  1. WebDriver driver = new RemoteWebDriver(new URL( 
  2.                     "http://localhost:9515"), DesiredCapabilities.chrome()); 
  3.             ((RemoteWebDriver) driver).setLogLevel(Level.WARNING); 

通过上述代码,就可以创建driver,后续工作和示例1中基本一样了。

 

总结以上:

1.    通过代码浅层次的证明了结构图的正确性

2.    通过启动一个chromedriver 可以节省一些时间

3.    Chromedriver 是通过内部包装mongoose ,提供服务的。一些调用命令可以从上述日志中看到一二。后续会详加分析。

 

参考文献:

http://code.google.com/p/selenium/wiki/JsonWireProtocol

http://seleniumhq.org/docs/

 

by nino