如何在 puppeteer 中正确使用 aria 选择器定义列表

How to properly use aria selectors for definition lists in puppeteer

我正在使用 puppeteer 编写一些 UI 功能测试。发现后"Puppetaria" article, I decided that whenever it's possible, I want to use aria selectors. This has been working OK in many cases, but I'm struggling to figure out how to properly do this using a <dl/> definition list。我正在使用 <dl/> 来显示有关对象的详细信息,希望它是一种可访问的呈现方式。例如:

<dl>
  <dt>ID</dt>
  <dd>6234</dd>

  <dt>Name</dt>
  <dd>Yo Mama</dd>
</dl>

语义上<dt/> 元素 label <dd/>。但是,当我使用人偶选择器 aria/ID 时,我返回 nothing 并且等待选择器超时。

我确实看到,如果我 明确地 描述一个元素标记另一个元素:

<dl>
  <dt id="id-label">ID</dt>
  <dd aria-labelledby="id-label">6234</dd>
</dl>

...然后 aria/ID 选择器起作用。

我假设 dtdd 在没有显式注释的情况下在语义上对齐,我是否做错了可访问性?我是否错误地使用了 Puppeteer?或者这是 Chrome 的辅助功能树的错误?

定义列表在可访问性方面有点糟糕。在您的示例中,您有两个术语和两个定义。当您使用屏幕 reader 浏览列表时,某些屏幕 reader 会说该列表有 2 个项目,有些会说它有 4 个项目,有些会说没有列表。

从技术上讲,<dl> 没有 list 角色 by default 所以屏幕 reader 说没有列表是正确的。

我没有使用过 puppeteer,但据我了解,aria selector is looking for the accessible name. The accessible name calculation 遵循一套规则(本质上是一个大的 if-then-else 语句)。 <dt><dd> 元素没有可访问的名称,除非您使用 aria-labelaria-labelledby。它们不像 <button> 元素,其中按钮可以从按钮的“内容”(<button></button> 之间的文本)获取其可访问的名称,步骤 2.F 在计算中。因此 <dt></dt> 之间的文本是 而不是 可访问的名称,因此不会在 puppeteer aria 选择器中返回。