Selenium Webdriver是如何工作的
Selenium是业内常用的web自动化测试框架,支持多种语言多种浏览器,被广泛应用到模拟用户在web平台上的行为,在自动化测试中应用得非常多,在爬虫领域偶尔也会被用到。
要追溯历史的话得回到2004年。selenium可以分为selenium IDE,selenium Grid,selenium RC(remote control, 或被称为selenium 1),selenium webdriver(2和3都被称为webdriver)。
IDE估计也没几个人在用了,Grid是做分布式的测试,以后可以再单独说明。这里主要介绍目前使用的selenium webdriver。
在好些年前用remote control时是需要先启动一个server,然后才可以用脚本控制浏览器并操作页面元素。这个主要是因为同源协议的限制。这个server就相当于是一个代理,脚本转换后的http请求通过这个server再发向浏览器注入js来操作,以代理的方式来绕过同源协议。
RC是不支持鼠标键盘事件,webdriver可以。
后来新的版本出来了,转向了webdriver,操作浏览器时需要对应的driver,比如chrome需要chromedriver,firefox需要geckodriver,乃至于headless浏览器。
原理步骤基本如下:
1)webdriver启动目标浏览器,并绑定到指定的端口,并以启动的浏览器实例作为一个http server;
2)客户端发送http请求到http server;
3)http server依赖源生的浏览器组件来转换为浏览器的源生调用。
这么看起来似乎也有个server啊,不过webdriver和之前的RC js注入有一些不同,它是直接利用了浏览器源生的支持来操作浏览器,相当于是直接交互了,所以对不同的平台和不同的浏览器,都必须依赖一个特定的浏览器的源生组件(还是类似刚才提到的driver,当我们下载chromedriver时也会有mac/windows/linux版本和浏览器支持版本)来实现把webdriver的API调用转化为浏览器的源生调用。
在http请求的交互中,有一个非常重要的协议:JSON Wire Protocol; 依据它来做各种操作比如点击、获取属性、拖拽、关闭等等。
基于webdriver的手机app自动化框架appium也是会用到这个协议。
部分参考:https://www.guru99.com/introduction-to-selenium.html ; https://www.quora.com/How-does-the-Selenium-WebDriver-work