selenium技术体系概述
l selenium技术体系
l 从代码中验证原理及研究
近来弄了一下chrome,工程确实庞大。不过收获颇丰。Selenium测试工具一直是测试团队的测试工具,不过一直没有仔细研究过。此次研究chrome时顺手看了看,比以前清晰和很多,也具备更多的修改基础。
全文以chrome为例子,IE及FF等,原理相同,我没在细究。再个也是随看随写,错误之处在所难免了。发现了就会及时更正的 :)
l selenium技术体系
大概流程和涉及到的技术用下图概述:
l 从代码中验证原理及研究
1. 简单示例
- public class Test {
- public static void main(String[] args) {
- System.out.println("-----chromedriver 启动了吗?----");
- //启动chromedriver.exe.
- WebDriver driver = new ChromeDriver();
- System.out.println("-----mark----");
- ((RemoteWebDriver) driver).setLogLevel(Level.WARNING);//设定日志级别,方便查看命令
- //简单查询
- final String strKeyWord="踏歌手机报解决方案";
- driver.get("http://www.baidu.com");
- driver.findElement(By.id("kw")).clear();
- driver.findElement(By.id("kw")).sendKeys(strKeyWord);
- driver.findElement(By.id("su")).click();
- //完成后退出浏览器
- driver.quit();
- }
- }
输出:
- -----chromedriver 启动了吗?----
- Started ChromeDriver
- port=9503
- version=23.0.1240.0
- log=E:\java\selenium-test\chromedriver.log
- -----mark----
- 十二月 30, 2012 9:30:33 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executing: get [68dea2759dab1f189adcb6ef01576bfa, get {"url":"http://www.baidu.com"}]
- 十二月 30, 2012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, get {"url":"http://www.baidu.com"}]
- 十二月 30, 2012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executing: findElement [68dea2759dab1f189adcb6ef01576bfa, findElement {"using":"id","value":"kw"}]
- 十二月 30, 2012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, findElement {"using":"id","value":"kw"}]
- 十二月 30, 2012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executing: clearElement [68dea2759dab1f189adcb6ef01576bfa, clearElement {"id":":wdc:1356874235675"}]
- 十二月 30, 2012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, clearElement {"id":":wdc:1356874235675"}]
- 十二月 30, 2012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executing: findElement [68dea2759dab1f189adcb6ef01576bfa, findElement {"using":"id","value":"kw"}]
- 十二月 30, 2012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, findElement {"using":"id","value":"kw"}]
- 十二月 30, 2012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executing: sendKeysToElement [68dea2759dab1f189adcb6ef01576bfa, sendKeysToElement {"id":":wdc:1356874235675","value":["踏歌手机报解决方案"]}]
- 十二月 30, 2012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, sendKeysToElement {"id":":wdc:1356874235675","value":["踏歌手机报解决方案"]}]
- 十二月 30, 2012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executing: findElement [68dea2759dab1f189adcb6ef01576bfa, findElement {"using":"id","value":"su"}]
- 十二月 30, 2012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, findElement {"using":"id","value":"su"}]
- 十二月 30, 2012 9:30:35 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executing: clickElement [68dea2759dab1f189adcb6ef01576bfa, clickElement {"id":":wdc:1356874235676"}]
- 十二月 30, 2012 9:30:36 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executed: [68dea2759dab1f189adcb6ef01576bfa, clickElement {"id":":wdc:1356874235676"}]
- 十二月 30, 2012 9:30:36 下午 org.openqa.selenium.remote.RemoteWebDriver log
- WARNING: Executing: quit [68dea2759dab1f189adcb6ef01576bfa, quit {}]
- [1230/213036:ERROR:ipc_sync_channel.cc(378)] Canceling pending sends
- [1230/213036:ERROR:ipc_sync_channel.cc(378)] Canceling pending sends
- [1230/213036:ERROR:ipc_sync_channel.cc(378)] Canceling pending sends
- 十二月 30, 2012 9:30:37 下午 org.openqa.selenium.remote.RemoteWebDriver log
- 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.java在selenium-chrome-driver.jar里
Eclipse中F3跟几下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服务
- WebDriver driver = new RemoteWebDriver(new URL(
- "http://localhost:9515"), DesiredCapabilities.chrome());
- ((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