chrome 驱动程序如何与 Chrome 浏览器交互?

How does chrome driver interact with Chrome browser?

提问人:Jcyrss 提问时间:1/25/2020 最后编辑:undetected SeleniumJcyrss 更新时间:3/21/2021 访问量:21188

问:

它说

ChromeDriver 是实现 W3C WebDriver 标准的独立服务器

看起来 W3C WebDriver 标准只定义了自动化程序和 Chromedriver 之间的接口。Chromedriver 充当 HTTP 服务器,从自动化程序获取命令。

但是 ChromeDriver 如何与 Chrome 通信?

还是通过HTTP协议?

如果是,我们从哪里可以获得有关详细信息的文档?Chrome 内部的哪个组件负责处理来自 Chromedriver 的命令?它是内置于 chrome 还是只是 Chrome 的扩展?

Selenium Google-chrome webdriver selenium-chromedriver

评论


答:

5赞 undetected Selenium 1/27/2020 #1

Selenium 的核心是 WebDriver,它是远程控制界面,可以对用户代理进行内省和控制。WebDriver 提供了一个平台和语言中立的线路协议,作为进程外程序远程指示 Web 浏览器行为的一种方式,因此指令集可以在许多浏览器中互换运行。


Selenium WebDriver 是指语言绑定和各个浏览器控制代码的实现,通常称为 WebDriverWebDriver 是一个 API 和协议,它定义了一个与语言无关的接口,用于控制 Web 浏览器的行为。每个浏览器都由特定的 WebDriver 实现(称为驱动程序)提供支持。驱动程序是负责委派给浏览器的组件,并处理与 Selenium 和浏览器之间的通信。


零件和零件

在最低要求下,WebDriver 通过驱动程序与浏览器通信,通信是双向的:

  • WebDriver 通过驱动程序将命令传递给浏览器
  • 通过相同的路由接收信息。

Chrome驱动程序

ChromeDriver 是实现 W3C WebDriver 标准的独立服务器。ChromeDriver 适用于 Android 版 Chrome 和桌面版 Chrome(Mac、Linux、Windows 和 ChromeOS)。驱动程序与浏览器在同一系统上运行。这可能是也可能不是测试本身执行的同一系统,并且是直接通信的示例。

basic_comms.png


远程 WebDriver

但是,与浏览器的通信也可以是通过Selenium Server或RemoteWebDriver进行远程通信。RemoteWebDriver 与驱动程序和浏览器在同一系统上运行。

basic_comms_driver_webdriver.png


硒网格

远程通信也可以使用 Selenium Server 或 Selenium Grid 进行,这两者又与主机系统上的驱动程序通信。

remote_comms_server.png


通过命令进行通信

WebDriver 协议被组织成命令。每个具有规范中定义的方法和模板的 HTTP 请求都代表一个命令,因此每个命令都会生成一个 HTTP 响应。为了响应命令,远程端将运行一系列称为远程端步骤的操作。它们提供远程端在接收特定命令时执行的一系列操作。


命令处理

远程端是 HTTP 服务器,通常通过 TCP 套接字读取来自客户端的请求并写入响应。在规范中,通信被建模为特定本地端和远程端之间的数据传输,远程可以写入字节和读取字节。这种连接如何工作以及如何建立的确切细节是一个更大的话题,超出了这个问题的范围。建立连接后,远程端必须从连接中读取字节,直到可以从数据中构造完整的 HTTP 请求。如果无法构造完整的 HTTP 请求,则远程端必须关闭连接,返回状态代码为 500 的 HTTP 响应,或返回错误代码为 unknown error 的错误。

评论

0赞 undetected Selenium 1/27/2020
@Jcyrss 查看更新的答案,如果您有任何问题,请告诉我。
1赞 Jcyrss 1/28/2020
谢谢。但似乎这一切都与WebDriver和Driver(如ChromeDriver)之间的接口有关,而不是Driver(如ChromeDriver)和浏览器(如Chrome)之间的接口,为什么我对此感到好奇?MicroSoft 为我们带来了基于 Chromium 的 Edge Browser,我们需要使用 Selenium 实现自动化。据我所知,Chromium 具有内置的 Web 自动化支持(这是真的,因为我们可以使用 Chromedriver 自动化 Electron App)。我想知道如果现有的 ChromeDriver 已经可以驱动基于 Chromium 的浏览器,为什么还要打扰 MS 提供 Edge 驱动程序?
0赞 undetected Selenium 1/28/2020
@Jcyrss 我相信你还没有读过完整的答案。但是,根据 stackoverflow 标准,您涉及 Chromedriver 充当 HTTP 服务器ChromeDriver 与 ChromeHTTP 协议通信的问题过于宽泛,我一开始就不应该回答。现在,由于您添加了有关驱动程序(如ChromeDriver)和浏览器(如Chrome)之间的接口,基于Chromium的Edge浏览器Electron应用程序之间的接口的更多问题,并且根据SO提供的空间,答案太大了。
1赞 Jcyrss 5/20/2020
我不认为我问了太宽泛的问题。再说一次,我不认为这篇文章解决了我的问题。因为我终于找到了真正的anwser。Chrome 驱动程序通过基于 websocket 的 Chrome DevTools 协议控制 chrome。本文提供了更多详细信息
5赞 Jcyrss 9/14/2020 #2

为了便于查找,我将注释移到此处。

Chrome 驱动程序通过基于 websocket 的 Chrome DevTools 协议控制 Chrome 浏览器。本文提供了更多详细信息