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 选择该点。

如果你选择一个点(由 pathoffset 组成),光标将放置在该点。如果你选择一个范围(由 anchorfocus 组成),该范围将被选中。如果你选择一个路径,该路径下的整个节点将被选中。

确保在设置选区之前聚焦编辑器。使用 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

你可能希望将 getBlockAboveinsertNodes 等查询或转换导入到你的 Playwright 测试中并使用它。

很遗憾,这是不可能的。你只能在浏览器上下文中直接与 editor 实例交互(使用 evaluateevaluateHandle),无法将从 Playwright 作用域导入的函数传递到浏览器中。这是因为 editor 对象和 JavaScript 函数都无法被充分序列化。

最好的解决方法是像用户一样与编辑器交互,不使用任何导入的查询或转换。这样可以让你的 Playwright 测试更容易发现应用程序中的 bug。

如果这种方法不实用,你可以在 evaluateevaluateHandle 中调用 editor 对象上的方法。(如果你需要返回对 DOM 节点或浏览器中 JavaScript 对象的引用,请使用 evaluateHandle。如果你需要返回 JavaScript 对象的序列化副本,或者不需要返回任何值,请使用 evaluate。)

请注意,虽然这些查询和转换不能直接在 Playwright 测试中使用,但在应用程序代码中使用编辑器实例时是可用的。有关如何在应用程序中使用这些方法的更多信息,请参阅 编辑器方法 文档。

查看 Playwright 文档 了解更多关于 evaluateevaluateHandle 的信息。

await editorHandle.evaluate((editor) => {
  editor.insertNodes(/* ... */);
});

API

getEditorHandle

获取 Plate 编辑器实例的句柄。

Parameters

Collapse all

    Playwright 的 page 对象。

    可编辑元素的定位器。如果未提供,它将查找页面上的第一个 [data-slate-editor] 元素。

Returns

Collapse all

    Plate 编辑器实例的句柄。

getNodeByPath

获取指定路径的节点。

Parameters

Collapse all

    Playwright 的 page 对象。

    Plate 编辑器实例的句柄。

    节点的路径。

Returns

Collapse all

    指定路径节点的句柄。

getDOMNodeByPath

获取给定路径的 Slate 节点对应的 DOM 节点。

Parameters

Collapse all

    Playwright 的 page 对象。

    Plate 编辑器实例的句柄。

    节点的路径。

Returns

Collapse all

    对应 Slate 节点的 DOM 节点的 ElementHandle。

clickAtPath

模拟点击指定路径的节点。

Parameters

Collapse all

    Playwright 的 page 对象。

    Plate 编辑器实例的句柄。

    要点击的节点路径。

getSelection

获取当前编辑器选区。

Parameters

Collapse all

    Playwright 的 page 对象。

    Plate 编辑器实例的句柄。

Returns

Collapse all

    当前编辑器选区。

setSelection

将编辑器选区设置为指定范围。

Parameters

Collapse all

    Playwright 的 page 对象。

    Plate 编辑器实例的句柄。

    要设置选区的位置。

getTypeAtPath

获取指定路径节点的类型。

Parameters

Collapse all

    Playwright 的 page 对象。

    Plate 编辑器实例的句柄。

    节点的路径。

Returns

Collapse all

    指定路径节点的类型。