Playwright Testing
学习如何编写与 Plate 集成的 Playwright 测试。
Playwright 支持在无头浏览器中进行端到端测试。本指南介绍如何使用 @udecode/plate-playwright
将 Playwright 与 Plate 集成。
设置
安装依赖
按照 Playwright's guide 在你的应用中安装 Playwright,并确保你可以编写基本的端到端测试。
npm install @udecode/plate-playwright playwright
Add PlaywrightPlugin
为了使 Playwright 测试能够访问和与编辑器交互,你需要将 PlaywrightPlugin
添加到你的编辑器中:
const editor = createPlateEditor({
plugins: [
// other plugins...
PlaywrightPlugin.configure({ enabled: process.env.NODE_ENV !== 'production' }),
]
})
这会在 window.platePlaywrightAdapter
上暴露各种实用程序。
获取编辑器句柄
在你的 Playwright 测试中,在与 Plate 交互之前获取编辑器句柄:
const editorHandle = await getEditorHandle(page);
// ...
对于多个编辑器,指定可编辑元素:
const editable = getEditable(page.getByTestId('my-editor-container'));
const editorHandle = await getEditorHandle(page, editable);
locator 必须完全匹配一个 [data-slate-editor]
元素。
开始编写测试
有了 editorHandle
,你现在可以为你的编辑器编写 Playwright 测试。
Examples
获取节点句柄
使用 getNodeByPath
获取对特定路径的节点句柄。为了对节点的值进行断言,使用 .jsonValue()
将其转换为 JSON。
const nodeHandle = await getNodeByPath(page, editorHandle, [0]);
expect(await nodeHandle.jsonValue()).toBe({
type: 'p',
children: [{ text: 'My paragraph' }],
});
获取节点的类型
const firstNodeType = await getTypeAtPath(page, editorHandle, [0]);
expect(firstNodeType).toBe('h1');
获取节点的 DOM 节点
在 Playwright 中,你通常需要引用特定的 DOM 元素来对其状态或涉及它的操作进行断言。
getDOMNodeByPath
returns an ElementHandle for the DOM node corresponding to the Slate node at a given path.
const firstNodeEl = await getDOMNodeByPath(page, elementHandle, [0]);
await firstNodeEl.hover();
点击节点
await clickAtPath(page, elementHandle, [0]);
获取选区
const selection = await getSelection(page, editorHandle);
expect(selection).toBe({
anchor: { path: [0, 0], offset: 0 },
focus: { path: [0, 0], offset: 7 },
});
选择一个点或范围
为了在编辑器中输入特定点,你需要使用 setSelection
选择该点。
如果你选择一个点(由 path
和 offset
组成),光标将放置在该点。如果你选择一个范围(由 anchor
和 focus
组成),该范围将被选中。如果你选择一个路径,该路径下的整个节点将被选中。
确保在设置选区之前聚焦编辑器。使用 editable.focus()
聚焦编辑器可能无法在 WebKit 中正常工作,因此最好使用 clickAtPath
。
// 点击第一个段落以聚焦编辑器
await clickAtPath(page, editorHandle, [0]);
await setSelection(page, editorHandle, {
path: [0, 0],
offset: 2,
});
await page.keyboard.type('Hello world!');
Imported queries and transforms
你可能希望将 getBlockAbove
或 insertNodes
等查询或转换导入到你的 Playwright 测试中并使用它。
很遗憾,这是不可能的。你只能在浏览器上下文中直接与 editor
实例交互(使用 evaluate
或 evaluateHandle
),无法将从 Playwright 作用域导入的函数传递到浏览器中。这是因为 editor
对象和 JavaScript 函数都无法被充分序列化。
最好的解决方法是像用户一样与编辑器交互,不使用任何导入的查询或转换。这样可以让你的 Playwright 测试更容易发现应用程序中的 bug。
如果这种方法不实用,你可以在 evaluate
或 evaluateHandle
中调用 editor
对象上的方法。(如果你需要返回对 DOM 节点或浏览器中 JavaScript 对象的引用,请使用 evaluateHandle
。如果你需要返回 JavaScript 对象的序列化副本,或者不需要返回任何值,请使用 evaluate
。)
请注意,虽然这些查询和转换不能直接在 Playwright 测试中使用,但在应用程序代码中使用编辑器实例时是可用的。有关如何在应用程序中使用这些方法的更多信息,请参阅 编辑器方法 文档。
查看 Playwright 文档 了解更多关于 evaluate
和 evaluateHandle
的信息。
await editorHandle.evaluate((editor) => {
editor.insertNodes(/* ... */);
});
API
getEditorHandle
获取 Plate 编辑器实例的句柄。
Parameters
Playwright 的 page 对象。
可编辑元素的定位器。如果未提供,它将查找页面上的第一个 [data-slate-editor]
元素。
Returns
Plate 编辑器实例的句柄。
getNodeByPath
获取指定路径的节点。
Parameters
Playwright 的 page 对象。
Plate 编辑器实例的句柄。
节点的路径。
Returns
指定路径节点的句柄。
getDOMNodeByPath
获取给定路径的 Slate 节点对应的 DOM 节点。
Parameters
Playwright 的 page 对象。
Plate 编辑器实例的句柄。
节点的路径。
Returns
对应 Slate 节点的 DOM 节点的 ElementHandle。
clickAtPath
模拟点击指定路径的节点。
Parameters
Playwright 的 page 对象。
Plate 编辑器实例的句柄。
要点击的节点路径。
getSelection
获取当前编辑器选区。
Parameters
Playwright 的 page 对象。
Plate 编辑器实例的句柄。
Returns
当前编辑器选区。
setSelection
将编辑器选区设置为指定范围。
Parameters
Playwright 的 page 对象。
Plate 编辑器实例的句柄。
要设置选区的位置。
getTypeAtPath
获取指定路径节点的类型。
Parameters
Playwright 的 page 对象。
Plate 编辑器实例的句柄。
节点的路径。
Returns
指定路径节点的类型。