搞懂webdriver的底层原理,才敢说

搞懂webdriver的底层原理,才敢说自己懂自动化!

一:Selenium的历史

selenium1.x:这个时候的selenium,使用的是JavaScript注入技术与浏览器打交道。需要SeleniumRC启动一个Server,将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript。

Javascript可以获取并调用DOM的任何元素,自如的进行操作。由此才实现了Selenium的目的:自动化Web操作。这种Javascript注入技术的缺点是速度不理想,而且稳定性大大依赖于Selenium内核对API翻译成的Javascript质量高低。

selenium2.x:相比于selenium1.x,2.x版本整合了webdriver以及原版selenium。两个项目合二为一,虽然名字还叫selenium,但也可以叫Webdriver。这个版本的selenium是利用浏览器原生的API,封装成一套更加面向对象的SeleniumWebDriverAPI。

直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。由于使用的是浏览器原生的API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学。然而带来的一些副作用就是,不同的浏览器厂商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了SeleniumWebDriver要分浏览器厂商不同,而提供不同的实现。

二:结构

以下进入正题,要通过selenium实现自动化测试,最最主要是需要三种东西:测试需要用的代码、webdriver、浏览器。今天想要分享的也是这三者关系。

①代码

selenium支持多种语言(java/c#/python/ruby)。测试工程师通过编程语言,调用浏览器对应API实现需要的功能。

②webdriver

webdriver,就像是一个媒介。代码驱动webdriver。上文提过,不同浏览器有不同的webdriver。例如火狐的FirefoxDriver,谷歌的ChromeDriver。

③浏览器

不同的浏览器对应不同的webdriver。

从上图,测试代码输入操作给webdriver,webdriver再去控制浏览器,最终达到的效果就是代码实现对浏览器的操作。

三:查找元素

以查找元素为例,查看代码与webdriver的交互。以下python为例:

这里driver是webdriver.Chrome()的对象,我们查看webdriver.Chrome()的源码。发现本质是from.chrome.webdriverimportWebDriverasChrome

从目录名可知这来自chrome的webdriver,再次对这个WebDriver溯源,发现它是继承了一个RemoteWebDriver类。注释的含义是:控制ChromeDriver并允许驱动浏览器。

再次对继承的RemoteWebDriver类溯源。

发现其是:selenium.webdriver.remote.webdriver.WebDriver。

注释的含义是:通过向远程服务器发送命令来控制浏览器。该服务器应该运行WebDriver有线协议。这里先停一下,等会我们会再回来继续了解这个类。以python为例,我们在在selenium库中,通过ID获取界面元素的方法是这样的:

一个名为


转载请注明:http://www.aierlanlan.com/grrz/4957.html