做的事情太少有时会导致一个疯狂的想法,而这一次;目的是通过嵌入 v8 引擎,用 Go 编写一个无头浏览器,具有完整的 DOM 实现和 JavaScript 支持。
这一切都是从编写 HTMX 应用程序开始的,测试它的需要让我很好奇是否有无头浏览器的纯 Go 实现。
搜索“go headless browser”只会导致搜索结果谈论自动化无头浏览器,即在无头模式下使用真正的浏览器,例如 Firefox 的 Chrome。
但是在纯 Go 中什么都没有。
所以我开始建造一个。
为什么 Go 中使用无头浏览器?
这可能看起来很愚蠢,因为编写无头浏览器永远不会像真正的浏览器一样工作;因此并不能真正验证您的应用程序是否在您决定支持的所有浏览器中正常工作。这也不允许您在停止工作时获得良好的功能,例如应用程序的屏幕截图。
那为什么呢?
极品速度!
为了在有效的 TDD 循环中工作,测试必须很快。缓慢的测试执行会阻碍 TDD,并且您会失去快速反馈循环提供的效率优势。
使用浏览器自动化进行此类验证会产生严重的开销,并且此类测试通常是在代码编写后编写;因此,它们不再有助于编写正确的实现;但事后却减少了维护负担;只是偶尔会在您的付费客户之前检测到错误。
目标是创建一个支持 TDD 流程的工具。为了可用,它需要在进程内运行。
需要用Go编写。
减少不稳定的测试
让 DOM 处于进程内可以在 DOM 之上编写更好的包装器;这可以帮助为您的测试提供一个不太不稳定的界面,就像测试库为 JavaScript 所做的那样。
您不用依赖 CSS 类名、元素 ID 或 DOM 结构,而是使用以用户为中心的语言编写测试,如下所示。
在带有“电子邮件”标签的文本框中输入“me@example.com”
或者用假设的代码。
testing.GetElement(Query{
role: "textbox",
// The accessibility "name" of a textbox _is_ the label
name: "Email",
}).type("me@example.com")
登录后复制
登录后复制
此测试不关心标签是否实现为
以上是Go-DOM - 用 Go 编写的无头浏览器。的详细内容。更多信息请关注PHP中文网其他相关文章!