在Safari和Webkit上测试有什么区别?

32

我在考虑使用Playwright编写一些端到端的测试。我知道该库允许针对Chromium、Firefox和Webkit运行测试。据我了解,Webkit是Safari的底层引擎,而Chromium是Chrome(和其他浏览器)的基础。

当进行针对Webkit / Chromium的测试时,它与针对使用底层引擎的用户面向浏览器的测试有多接近?我想象中,当用户在Safari上使用时会遇到一些问题,而在Webkit上运行测试时可能无法捕捉到这些问题。

谢谢

2个回答

34

像Google Chrome、Apple Safari这样的浏览器嵌入了渲染引擎(Chromium、WebKit)并在其之上添加了一些东西。特别是,它们添加了专有的媒体编解码器,注入了浏览器扩展等。它们还添加了周围的接口,如书签同步。但它们重用了底层的Web平台实现。

Chromium

Chromium是由Google Chrome、Opera、Microsoft Edge和其他浏览器使用的开源Web平台实现。它实现了Web规范,呈现内容,与网络协作等。Playwright使用一个可以通过Playwright API进行自动化端到端测试的默认Chromium构建。

对于Google Chrome而言,事情很简单:Chromium是一个安全的测试目标,除了专有的媒体编解码器和数字版权管理(DRM)。您可以将Playwright指向默认的Chrome Canary或Edge Canary以使用专有的媒体编解码器。

WebKit

WebKit是由Apple Safari和Epiphany使用的开源Web平台实现。从2020年6月开始,Playwright提供了一个可通过Playwright API进行自动化端到端测试的WebKit构建。Playwright WebKit适用于所有平台(macOS、Linux、Windows),可以在无头和有头模式下工作。

当 WebKit 运行在 macOS 上时,它是测试 Safari 的安全目标。但是,在 Linux 和 Windows 上,与 Apple Safari 不同之处在于:它使用非 macOS 网络堆栈,使用非 Core Animation 来合成场景和生成图像光栅。这意味着 Linux 和 Windows 上的屏幕截图将无法完全匹配 macOS 上的屏幕截图。在 Web 平台方面,相同的 WebKit 代码将布局页面并运行 JavaScript - 它将与 Safari 中 WebKit 的工作方式相匹配。

总而言之,我们认为 Playwright 提供的浏览器是进行端到端测试所能得到的最佳选择。在 Linux CI 上运行 WebKit 将使用不同的合成管道而非 macOS,但可以用于测试基于 WebKit 的浏览器中的 Web 应用程序。


2
这只是个人经历,但我在macOS上运行时遇到了Playwright的webkit和Safari之间的差异:这个bug 影响Safari,但我的测试在Playwright中不会失败。它可能是Safari问题(而非webkit),但对于Playwright来说肯定不是好消息:我不太确定我的UI测试是否真正覆盖了Safari。 - Robin Métral
@arjunattam,你的第二段的正确解释是,如果你不在Windows或Linux上进行视觉测试运行WebKit测试,那么与在macOS上运行它们相比,结果将是相同的吗? - undefined

2
我发现在测试不同版本的webkit和Safari时会有一些差异。我正在测试Safari 16.0,对于我的目的,Playwright 1v17似乎非常匹配。升级到Safari 16.2似乎没有影响到这一点。但是,将Playwright升级到1v28后,获取选择边界框的行为似乎发生了变化。它似乎更正确了,但与Safari 16.2不再一致。我认为WebKit比Safari领先了一点,在某个时候Safari会追上来,我们会看到它们再次表现相同,但到目前为止还没有发生这种情况(或者可能已经发生了,但我落后了几个版本)。我的解决方案是使用最新版本的Playwright来测试Chromium和Firefox,但使用旧版本来测试Safari。我现在也在测试Playwright 1v28中的webkit,但我希望Safari在某个时候也能开始显示该行为。请注意:从每个浏览器获取选择范围的边界框会得到不同的结果,因此目前在WebKit中进行了更改并不奇怪。这种变化似乎更接近Chrome的行为,但仍然不完全相同。如果有帮助的话,在我的package.json devDependencies中,我有:
"playwright1v17": "npm:playwright@~1.17.2",
"playwright1v28": "npm:playwright@~1.28.1",

然后在测试脚本中,我执行以下操作:

import { chromium, webkit, firefox } from 'playwright1v28';
import { webkit as safari16v1 } from 'playwright1v17';

这让我能够测试WebKit的两个版本并进行比较,还可以测试Chromium和Firefox。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接