ic3*_*ic3 27 javascript reactjs material-ui cypress github-actions
在 github 操作中运行 cypress 测试时,我们有一个奇怪的行为。MUI datepicker 日期选择器处于只读模式,我们无法输入任何日期(在其他环境中没问题)。
赛普拉斯的错误
CypressError:4000 毫秒后超时重试:cy.clear()失败,因为该元素是只读的:
<input aria-invalid="false" readonly="" type="text" aria-readonly="true" aria-label="Choose date" class="MuiOutlinedInput-input MuiInputBase-input css-1x5jdmq" value="">
从视觉上看,日期选择器没有任何按钮(正在发生某些事情):
在其他环境(Windows/Linux)上,即使我们以无头模式(所有带有 UI 的桌面)启动测试,测试也能正常工作。MUI 日期选择器看起来与 MUI 文档(链接)中的一样好。
Github 操作如下所示:
on:
workflow_dispatch:
defaults:
run:
working-directory: ic3-test
jobs:
build:
runs-on: ubuntu-latest
container: cypress/included:8.6.0
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16'
- name: Install dependencies
run: npm install
working-directory: ic3-test
- name: Cypress run with env
uses: cypress-io/github-action@v2
with:
# headless: true
browser: chrome
record: true
working-directory: ic3-test
Run Code Online (Sandbox Code Playgroud)
生成错误的 Cypress 线路:
cy.getWidget(widgetId). // this is getting a div with wid = widgetId , works fine
.find("input.MuiInputBase-input")
.clear()
.type(date). // date is a string
Run Code Online (Sandbox Code Playgroud)
欢迎一些提示
这背后的原因是 Material UI 渲染MobileDatePicker组件,因为查询@media (pointer: fine)与我们的 Github Actions 工作流程使用的无头 Chrome 不匹配。移动组件仅具有只读输入,因此无法使用 和 对其进行清除或键入.type()(与具有可键入和可清除输入的组件.clear()相反)。DesktopDatePicker
由于我们不想删除该MobileDatePicker组件,因此我们创建了一个自定义命令,以便它检查当前是否正在呈现移动日期选择器。如果在移动设备上,测试将打开日期选择器,单击编辑按钮,从而打开移动输入视图。
在该输入视图中,输入字段不再存在readonly。使用该命令,无论是桌面还是移动设备,都可以清除输入字段并输入内容。
Cypress.Commands.add(
'chooseDatePicker',
(selector: string, value: string) => {
cy.get('body')
.then(($body) => {
const mobilePickerSelector = `${selector} input[readonly]`;
const isMobile = $body.find(mobilePickerSelector).length > 0;
if (isMobile) {
// The MobileDatePicker component has readonly inputs and needs to
// be opened and clicked on edit so its inputs can be edited
cy.get(mobilePickerSelector)
.click();
cy.get('[role="dialog"] [aria-label="calendar view is open, go to text input view"]')
.click();
cy.get(`[role="dialog"] ${selector}`)
.find('input')
.clear()
.type(value);
cy.contains('[role="dialog"] button', 'OK')
.click();
} else {
cy.get(selector)
.find('input')
.clear()
.type(value);
}
});
},
);
// Usage:
const datePickerValue = '2021-01-03';
cy.chooseDatePicker('[data-testid="my-datepicker"]', datePickerValue);
Run Code Online (Sandbox Code Playgroud)
由于我还没有看到所有代码,我将尝试尽可能具体地进行评论,我希望您回顾一些主题。
1- 检查转换后的代码中的属性。确保不应设置诸如 helperText={null} 之类的属性。
2-您可能需要安装polyfills。例如 popper.js (传递依赖)。尽管MUI声称它是(polly)不需要的。技术每天都在进步,可能会有他们无法捕捉到的变化。
3- 确保工作模式正确。甚至用 Jest 来测试它。比如window.matchMedia。
| 归档时间: |
|
| 查看次数: |
6723 次 |
| 最近记录: |