Selenium 工作原理:第一集 - 传输

一个描述 Selenium 如何在底层工作的系列

在 2020 年 1 月最后一个周末的一次互动中,有人在 Selenium 问题上说“为什么你不能直接...”,在我解释了问题之后,我想到我应该开始解释 Selenium WebDriver 中的命令,以及为什么我们最终选择了我们今天的这种设计。

我将在本系列的每一页重复这一点,但有时会令人恼火的是,在 Selenium 的每个小部分是如何工作的,背后都进行了大量的思考。

为什么?

Selenium,由于偶然和它擅长的事情,也被全世界数百万人使用。从微软和谷歌到小型初创公司,它们都通过它来确保他们的网站在每个浏览器中都能正常工作。

Selenium 如何与浏览器通信?

多年来,Selenium 决定使用 HTTP 与浏览器通信。我们构建了一个 REST 风格的 API,每个客户端绑定都可以使用,并希望获得相同的结果。

HTTP 和 REST 风格?真的吗?

是的……

让我们从 HTTP 部分开始。当我们开始时,我们必须根据与每个浏览器通信的最佳方式,为每个浏览器找到一种独特的通信方式。因此,对于 Internet Explorer,我们编写了 COM 代码。它很好,它工作了,但给我们带来了噩梦。对于 Firefox,我们编写了一个按行读取的庞然大物,谢天谢地,由于 Mozilla 的“让浏览器成为你的”态度,我们可以做很多事情。Opera 允许我们通过 DevTools 协议进入。

现在,这意味着,尤其是在 WebDriver 的早期,我们需要维护 N:M 绑定,其中 N 是语言绑定,M 是我们支持的浏览器。这不是通往好产品的道路。我们决定我们需要一种每种语言都能理解的东西。我们也需要一些相当稳健的东西。我们选择了 HTTP,并开始构建 JSONWireProtocol

JSONWireProtocol 是我们构建 REST 风格的接口的地方,该接口将使用 JSON 进行通信。我说 REST 风格是因为它没有遵循 REST 的所有原则,但足以满足我们的需求。

它现在与事物有何关系?

Web、互联网和世界都在前进。为什么 Selenium 没有?

这是一个好问题,问题是我们正在努力推动事情前进。不幸的是,Web 的状态是,除非它在工作,否则它就处于损坏状态。HTTP 作为一种协议相当稳健。它还可以让人们构建测试集群,而无需过多担心多路复用将如何工作。这就是创建 Selenium Grid 的原因,并且在将测试分发到多个设备和多台机器时,它仍然是一个不错的选择。

但是一些使用 Chrome 调试协议的自动化框架更像 Web,要像他们一样。

所以……有些工具使用 Chrome 的调试协议来驱动浏览器,它们比 Selenium 做得更好的一些事情归因于它们选择如何与浏览器通信。不幸的是,这是一个 Chrome 的专有协议,谷歌不感兴趣与其他浏览器合作,使其不成为专有协议。

此外,忽略谷歌团队有趣的的设计选择,我们还必须保持一个永久打开的连接。在这种情况下,它使用 WebSockets,但如果你还记得我之前关于互联网在启动之前是关闭的评论,WebSockets 会不断地重新建立连接。还有一个问题是,上下管道会传输多少流量。

对于 Puppeteer 来说,这很好,因为你只与本地计算机上的东西通信,但如果你将 CI 服务(如 Circle CI 或 TravisCI)与 AWS Device Farm、Sauce Labs 或 BrowserStack 等东西结合使用,那么你和运行器之间突然会有很多互联网,并且这些数据需要到达某个地方。

由浏览器供应商和 Selenium 人员组成的 W3C 浏览器测试和工具工作组正在尝试设计它的样子,以确保我们可以从一开始就使其跨浏览器,而无需对浏览器进行怪异的破解补丁并自己发布这些浏览器。

想了解更多吗?

这最初发布在 https://www.theautomatedtester.co.uk/

上次修改时间:2021 年 8 月 7 日:重命名目录 (e9895f27c26)