Reactjs 为什么Cypress不能识别react-datepicker元素的testid?
目标Reactjs 为什么Cypress不能识别react-datepicker元素的testid?,reactjs,cypress,e2e-testing,react-datepicker,Reactjs,Cypress,E2e Testing,React Datepicker,目标 it('Displays the edit fields', () => { cy.get('[data-testid="accountButton"]') .click(); cy.get('[data-testid="editUserDetailsButton"]') .click(); cy.get('[data-testid="user_email"]')
it('Displays the edit fields', () => {
cy.get('[data-testid="accountButton"]')
.click();
cy.get('[data-testid="editUserDetailsButton"]')
.click();
cy.get('[data-testid="user_email"]')
.should('not.be.visible');
cy.get('[data-testid="edit_full_name"]')
.should('be.visible');
cy.get('[data-testid="edit_dob"]')
.should('be.visible');
cy.get('[data-testid="edit_email"]')
.should('be.visible')
.should('have.value', 'test@editdetails.com');
})
使Cypress识别和操作日期选择器元素
问题
我无法让Cypress识别DatePicker元素的数据testid,因此无法对其进行测试
错误
Timed out retrying: Expected to find element: [data-testid="edit_dob"], but never found it.
尝试
我曾尝试将DatePicker元素放在input和div元素中,以作为目标,但由于其他原因,它们没有达到预期的效果
我还查阅了DatePicker和Cypress的文档,其中提到了另一个,以及这里类似的问题
代码
下面的代码按预期工作,只是Cypress似乎与DatePicker输入不兼容
function displayEditDetails() {
let listOfForms = [];
for (const detail in details) {
listOfForms.push(
<FormGroup controlId={detail} key={`key_edit_${detail}`}>
<FormLabel>{detail.charAt(0).toUpperCase() + detail.slice(1).replace('_', ' ')}</FormLabel>
<FormControl
data-testid={`edit_${detail}`}
type={detail}
value={details[detail] || ''}
onChange={handleDetailsChange}
/>
</FormGroup>
)
}
listOfForms.push(
<DatePicker
data-testid={'edit_dob'}
selected={dob}
onChange={setDob}
maxDate={new Date()}
/>
);
return(
listOfForms
)
}
一旦我可以确定目标,我计划测试清除当前输入并在中键入新日期。任何针对拾荒者的帮助和进一步潜在陷阱的警告都将受到感谢
编辑:这里是表单生成的HTML
<form>
<div class="form-group">
<label class="form-label" for="email">Email</label>
<input data-testid="edit_email" type="email" id="email" class="form-control" value="admin@example.com" style="background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVQ4EaVTO26DQBD1ohQWaS2lg9JybZ+AK7hNwx2oIoVf4UPQ0Lj1FdKktevIpel8AKNUkDcWMxpgSaIEaTVv3sx7uztiTdu2s/98DywOw3Dued4Who/M2aIx5lZV1aEsy0+qiwHELyi+Ytl0PQ69SxAxkWIA4RMRTdNsKE59juMcuZd6xIAFeZ6fGCdJ8kY4y7KAuTRNGd7jyEBXsdOPE3a0QGPsniOnnYMO67LgSQN9T41F2QGrQRRFCwyzoIF2qyBuKKbcOgPXdVeY9rMWgNsjf9ccYesJhk3f5dYT1HX9gR0LLQR30TnjkUEcx2uIuS4RnI+aj6sJR0AM8AaumPaM/rRehyWhXqbFAA9kh3/8/NvHxAYGAsZ/il8IalkCLBfNVAAAAABJRU5ErkJggg=="); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%; cursor: auto;">
</div>
<div class="form-group">
<label class="form-label" for="full_name">Full name</label>
<input data-testid="edit_full_name" type="full_name" id="full_name" class="form-control" value="Jareth">
</div>
<div class="form-group">
<label class="form-label" for="address">Address</label>
<input data-testid="edit_address" type="address" id="address" class="form-control" value="">
</div>
<div class="form-group">
<label class="form-label" for="postcode">Postcode</label>
<input data-testid="edit_postcode" type="postcode" id="postcode" class="form-control" value="">
</div>
<div data-testid="edit_dob">
<div class="react-datepicker-wrapper">
<div class="react-datepicker__input-container">
<input type="text" class="" value="04/03/1999">
</div>
</div>
</div>
<button data-testid="confirmChangesButton" type="submit" class="LoaderButton btn btn-primary btn-block">Confirm Changes</button></form>
电子邮件
全名
地址
邮政编码
确认更改
查看通过运行应用程序生成的HTML时,问题是显而易见的
日期选择器HTML
<div data-testid="edit_dob">
<div class="react-datepicker-wrapper">
<div class="react-datepicker__input-container">
<input type="text" class="" value="04/03/1999">
</div>
</div>
</div>
DatePicker在几个div中呈现为输入元素,测试id不以输入为目标
解决方案
Cypress的选择器API建议使用输入的父div类cy.get('.react-datepicker\uu input-container>input')
。有了这个,我可以将日期选择器作为目标,清除它,然后键入新的输入
下次注意事项
请参考中的命令中使用的概念。是的
在命令的代码中,您会发现有必要检查生成的HTML,并根据您的需要对其进行适当的遍历。您可以共享生成的目标HTML吗?发布HTML让我走上了正确的轨道。我刚刚了解了选择器操场,它正在按预期工作。