项目自动化测试要用到WebDriver,这里网摘一些和WebDriver相关的知识供自己参考。
1.什么是Selenium 和WebDriver?
Selenium 是一个浏览器的自动化操作框架。它主要由3个工具组成。1.Selenium IDE,是Firefox插件,支持用户的录制和回放。2.Selenium WebDriver,它提供了各种语言环境的API 来支持编写自动化应用程序。
3.SeleniumGrid,它可以让engineer用Selenium API 来控制分布在一系列机器上的浏览器实例,支持并发的运行更多的测试。
WebDriver针对各个浏览器开发,它取代了嵌入到被测的Web应用中的js,从而与浏览器紧密的联系从而创建更高级的测试,而避免了JS安全模型的限制。它不仅有浏览器厂商的支持,还利用操作系统级的调用来模拟用户输入。从支持的浏览器看,它支持Firefox(FirefoxDriver), IE(InternaetExplorerDriver),Opera(OperaDriver)和Chrome(ChromeDriver),此外,它还支持Android(AndroidDriver)和iPhone(iPhoneDriver)的移动应用测试。WebDriver支持各种语言,比如Python,Ruby,Java ,C#.
2.如何使用WebDriver.
对于各种浏览器,WebDriver的使用方法是不一致的。
对于Firefox, 只要写code为 Webdriver driver = new FirefoxDriver()就可以了,这时候它就会从默认的安装位置去找Firefox. 如果默认位置没有,那么可以设置webdriver.firefox.bin 环境变量来指定它的位置。然后用System.setProperty("webdriver.firefox.bin","/./../some location")
对于Chrome会麻烦点,首先要下载一个ChromeDriver(http://code.google.com/p/chromedriver/downloads/list)位置,然后它用来充当WebDriver和Chrome浏览器的桥梁,然后启动ChromeDriver会得到一个url和一个监听端口,这时候我们代码是 webDriver = new RemoteWebDriver(url, DesiredCapabilities.chrome())
3.WebDriver的工作原理
WebDriver是一个W3C的标准,见http://code.google.com/p/selenium/wiki/JsonWireProtocol#Command_Reference,
从这里可以看出,WebDriver可以和浏览器交互的原因在于浏览器实现了一组wire协议。它使用了经典的client-server模式,客户端发送一个request,服务器端返回一个response
这里的Client是调用WebDriverAPI 的机器。(比如我们的自动化测试代码所运行的机器)
这里的Server是运行浏览器的机器。
通信模式是,Firefox浏览器直接实现了WebDriver的通信协议,而Chrome和IE要通过ChromeDriver和InternetExplorerDriver充当桥梁来实现。
所以这里有2种情况,一种是LocalWebDriver,这就是我们的WebDriverAPI 机器和浏览器在同一个JVM中,我们在本地测试都是这种情况,因为都在同一个LinuxBox中。
第二种情况是RemoteWebDriver,这是WebDriverAPI 和浏览器在不同的JVM中的情况,因为我们代码在CIServer上,但是我们的浏览器在Selenium Hub,是另外机器上。
4.WebElement
这是WebDriverAPI 中的对象,代表页面上的一个DOM元素。
当执行WebDriver driver = new FirefoxDriver()
driver.get("http://www.google.com")
代码的时候,client(我们测试代码)向着server(浏览器所在机器)发送了如下的请求:
POSTsession/285b12e4-2b8a-4fe6-90e1-c35cba245956/url post_data{"url":"http://google.com"}
因为前面已经说过了,WebDriver实现了W3C 的wire协议。它会请求浏览器完成跳转url的操作。
假设remote server实现这个接口(Firefox已经实现了W3C,因此没问题),则会跳转,并且返回如下response:
{"name":"get","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":""}
其中status code为0 表示已经正确执行。