关于chromedriver和selenium(webdriver)的调研和修改
首先需要修正一下标题,因为事实上关于这部分的东西有很多,本文描述的只是其中的一部分——上下文是这样的:博主负责的时一款双核浏览器产品的自动化部分,每次产品变动的时候都需要重新调研底层实现和接口的部分。Chrome内核升级之后,之前使用的关于一些驱动浏览器的部分已经被阉割掉了(类似于pyautolib),chromium中只留下了chromedriver.exe部分的可以用来使用,当然需要对它进行改造,以适应自己的需要——毕竟产品是浏览器本身而不是哪一个网站。
其他需要的东西有:
C++:chromedriver.exe是用C++写的,需要修改并重新编译
Selenium:一套webdriver的开源架构,关于它的介绍,任何一个搜索引擎或者招聘网站都可以找到很多;关于各个浏览器driver,实现原理不同,IE 相对简单,即使不使用selenium也可以比较轻松的控制IE,毕竟它继承于微软技术巅峰的一套技术,ole和com之上;火狐的driver没有搞过,不好进行评价,貌似是使用插件完成的
Python:由于代码的继承问题,使用上选择python语言驱动chromedriver.exe,简单一些
为了完成这部分修改,这几天修改了一下chromedriver的代码,编译出来的chromedriver在目前的自动化项目中可以正常使用,性能和压力部分貌似也可以,这块还未深入研究J。
Chromedriver原理和修改
Chromedriver是google为网站开发人员提供的自动化测试接口,是现在最火的网站测试架构selenium的chrome基础部分,主要是通过http通信实现的,不是pyautolib中的IPC方式。
除了selenium 提供的网站测试接口外,chromedriver还提供了更多有趣并且实用的功能,可以用在浏览器的测试中(如果需要,后续会进行封装)。
具体运行原理如下
1. Selenium 通过一套protocol 和远程的 chromedriver进行通信,selenium 实质上是对这套协议的底层封装,同时提供外部WebDriver的上层调用类库;关于协议的详细内容见The WebDriver Wire Protocol;
Selenium提供的操作包括:
Session相关
Element(页面)相关
Window相关
Alert相关
2. Selenium 通过指定的Port调用起 chromedriver的实例,具体实现见chromium/源码:src/third_party/webdriver/pylib/selenium/webdriver/chrome/service.py;
3. chromedriver在本地port端口打开一个http服务,Selenium通过网络编程与这个http服务进行通信,通信协议即1中提到的wire protocol;selenium对wire protocol的具体实现见:chromium//src/third_party/webdriver/pylib/selenium/webdriver/remote/remote_connection.py
4. chromedriver和外部(如selenium)的通信,通过session进行标识,selenium中每创建一个WebDriver实例,则chromedriver新建一个线程,通过包含唯一Port的命令启动一个chromebrowser 实例,并将其保存在一个session中,这个session保持selenium 和 对应的chromebrowser的通信,详情见chromium//src/chrome/test/chromedriver/session_commands.cc;
5. chromedriver中的session和chromebrowser通过socket进行TCP通信,即4中通过命令启动chromebrowser的同时,session中包含一个socket的client,和chromebrowser中的socket服务进行通信,进而控制chromebrowser;详情请见WaitForDevToolsAndCheckVersion的实现;
6. selenium中的WebDriver实例和chromedriver的关系为多对一,chromedriver和chromebrowser的关系为一对多;启用多个chromedriver的需求暂时没有。
修改如下
1. 修改的核心是屏蔽chromedriver对新browser的创建,而是将它attach到一个已经运行的browser实例上;
2. 修改方法是使用一个包含port的命令启动一个sebrowser实例,而在chromedriver代码中绕开CreateProcess的过程,在WaitForDevToolsAndCheckVersion中使用对应实例的port;
3. 修改后的chromedriver对browser和chromebrowser使用方法相同;
Chromedriver的使用
由于无法公开代码,这里只能简单介绍一下使用方法。和修改保持一致即可:
1、通过进程启动浏览器——启动命令需要指定port
2、启动chromedriver.exe进行,将port传入
3、通过selenium控制chromedriver.exe进行浏览器的各种操作
可以直接使用selenium操作chromedriver(推荐),也可以直接编写代码操作(不推荐)。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。