跳到主要内容

data 属性(agent 与测试钩子)

每个可交互元素都带稳定的 data-rios-* 属性。这是 Playwright、cursor agent 和任何 DOM 驱动器定位并驱动组件的受支持方式——不要依赖文字内容或 DOM 位置(它们会 变)。

选择器参考

选择器元素额外状态
[data-rios-select-trigger]触发器按钮data-state="open|closed"
[data-rios-option-value="<value>"]任意选项行data-selected="true|false"
[data-rios-sheet]sheetdata-open="true|false"
[data-rios-overlay]遮罩/背景容器data-open
[data-rios-backdrop]点击关闭的遮罩
[data-rios-search-input]搜索框
[data-rios-clear-search]清除搜索按钮
[data-rios-confirm]蓝色 ✓ 提交按钮(多选)
[data-rios-cancel]✕ 关闭按钮
备注

data-rios-option-value 出现在每个选项行上(值来自 option.value)。 data-selected 镜像当前选中态,你无需自己计算选中就能断言。

Playwright 示例

import { test, expect } from "@playwright/test";

test("多选在确认时提交草稿", async ({ page }) => {
await page.goto("/your-page");

// 打开
await page.click('[data-rios-select-trigger]');
await expect(page.locator('[data-rios-select-trigger]')).toHaveAttribute(
"data-state", "open"
);

// 在草稿里切换两行
await page.click('[data-rios-option-value="AAPL"]');
await page.click('[data-rios-option-value="NVDA"]');
await expect(page.locator('[data-rios-option-value="AAPL"]')).toHaveAttribute(
"data-selected", "true"
);

// 确认提交草稿并关闭 sheet
await page.click('[data-rios-confirm]');
await expect(page.locator('[data-rios-select-trigger]')).toHaveAttribute(
"data-state", "closed"
);
});

ARIA 语义

data-rios-* 钩子外,组件还暴露标准 ARIA,让无障碍工具和屏幕阅读器开箱即用:

  • 触发器:aria-haspopup="dialog"aria-expanded
  • sheet:role="dialog"aria-modal="true"
  • 选项列表:role="listbox"aria-multiselectable(仅多选)。
  • 每个选项行:role="option"aria-selectedaria-posinsetaria-setsize, 以及 "label""label — description" 形式的 aria-label

测试 iOS 键盘行为

「键盘保持打开」的行为是 iOS 触屏特有的,headless 浏览器(无软键盘)测不出来。 它由 select-interaction.ts 里纯手势策略的单元测试覆盖 (tests/select-interaction.test.ts)。要端到端验证该行为,请在真机 iPhone Safari 上测。