**
我们常说的selenium是什么?
**
1. Selenium 1.0:
诞生于2004年,最初是由ThoughtWorks的工程师们为了实现自动操控浏览器的功能,用js封装了一套类库,被称为:selenium core,这也是Selenium 1.0的核心
Selenium IDE:
他是存在于Firefox浏览器上的一个插件,可以用它来实现对浏览器的录制与回放操作
Selenium Grid:
他是一个自动化测试的辅助工具,以分布式为基础,实现在多台机器上运行同一份测试脚本
Selenium RC(remote control):
他是Selenium家族的核心:
Selenium RC=Client Libraries+Selenium Server
Client Libraries用来编写测试脚本,Selenium Server用来执行从客户端发来的请求,控制浏览器行为,其中服务端用来控制浏览器的类库,便是用js编写的selenium core
2. Selenium 2.0:
但用js操作有诸多麻烦,毕竟不是长久之计,在2006年的时候,Google工程师们发起了Webdriver项目,Webdriver是通过原生浏览器的支持来直接控制浏览器,Webdriver支持各个浏览器,例如Chrome的chromedriver,并且可以调用OS级别的操作,它的出现使得Selenium 2.0诞生
3. Selenium 3.0:
时间到了2016年,Selenium 3.0诞生,在此之前已经过了10年的时间,本次Selenium 3.0为我们带来的改变有:
1.去掉了Selenium RC
2.JAVA只支持8版本及以上
3.Firefox驱动独立,类似于Chrome的chromedriver
4.MAC OS 集成Safari的浏览器驱动,默认在/usr/bin/safaridriver 目录下
5.只支持IE 9.0版本及以上
Selenium 3.0重写了webdriver驱动,产生了 The WebDriver Wire Protocol协议
webdriver实现原理:
以下面这段代码的执行过程为例:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw")
driver.quit()
从selenium包中倒入webdriver包:
_init_会自动帮我们载入from .chrome.webdriver import WebDriver as Chrome
class WebDriver(RemoteWebDriver):
Chrome的webdriver实现,继承了RemoteWebDriver,而RemoteWebDriver是来自:
from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver
我们在源码解析有讲解RemoteWebDriver:
通过将命令发送到远程服务器来控制浏览器。
该服务器预期正在运行WebDriver有线协议,在
https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
driver.find_element_by_id("kw")
最终通过find_element_by_id发现,调用的是这个方法
self.execute(Command.FIND_ELEMENT, {
'using': by,
'value': value})['value']
response = self.command_executor.execute(driver_command, params)
command_executor=RemoteConnection(command_executor, keep_alive=keep_alive)
command_executor在webdriver中有默认值为:command_executor='http://127.0.0.1:4444/wd/hub
所以调用find_element_by_id方法时:
会先通过Command.FIND_ELEMENT取得对应值
调用RemoteConnection类的execute方法向远程服务器发送命令,执行后给出response
总结一下:
webdriver通过对RemoteConnection类的调用,执行http请求,将参数转化成json格式,作为请求体发送到remote server上,remote server在执行完对浏览器的操作后得到response传回客户端,最后解析成自己想要的数据