如果您使用的是材料形式,请在Angular中使用cypress进行选择 [英] Make selection using cypress in Angular if you're using material forms
问题描述
我有一个看起来像这样的表格:
<form class="col s12" materialize [formGroup]="newUserForm">
...
<div class="row">
<div class="input-field col m4 s12">
<select formControlName="genderBound" materialize="material_select" id="gender" name="test">
<option value="" disabled selected name="chooseGender">Choose gender</option>
<option *ngFor="let gender of genders">{{gender}}</option>
</select>
<label for="gender">Gender</label>
</div>
...
当我尝试使用cypress选择下拉菜单时,它告诉我它不可见.当我遵循cypress提供的说明性URL时,它建议我在单击内使用{force: true}
.这允许我的测试通过,但实际上似乎从未选择过这些项目.
我还遵循了此处所提供的解决方案,并实现了jQuery单击实际选项(请注意,我的select和option标记不是md-select和md-option标记)
cypress目录中的sample.spec.js:
...
it('signs up a new user', () =>{
cy.get('button[id=new-account-button]').click();
cy.get('input[id=affiliation]').type(affiliation);
cy.get('input[id=password]').type(pass);
cy.get('input[id=userName]').type(name);
cy.get('input[id=email]').type(email);
//Now the options
cy.get('[name="chooseGender"]').click({force: true});
cy.get('option').contains("Female").then(option =>{
cy.wrap(option).contains("Female");
option[0].click();
});
...
我想有两件事我不太了解:
- 为什么没有真正选择一个选项?
- 尽管如此,为什么测试仍通过了?
我在下面提供与我的确切问题有关的回购信息:
git clone https://github.com/Atticus29/dataJitsu.git
cd dataJitsu
git checkout cypress-SO
在/src/app中制作一个api-keys.ts文件,并在其中填充要跟随的文本
npm install
ng serve
(在单独的终端标签中)
npm run e2e
api-keys.ts:
export var masterFirebaseConfig = {
apiKey: "AIzaSyCaYbzcG2lcWg9InMZdb10pL_3d1LBqE1A",
authDomain: "dataJitsu.firebaseapp.com",
databaseURL: "https://datajitsu.firebaseio.com",
storageBucket: "",
messagingSenderId: "495992924984"
};
export var masterStripeConfig = {
publicApiTestKey: "pk_test_NKyjLSwnMosdX0mIgQaRRHbS",
secretApiTestKey: "sk_test_6YWZDNhzfMq3UWZwdvcaOwSa",
publicApiKey: "",
secretApiKey: ""
};
我发现以下测试可与您的存储库一起使用(最新提交353633c),
describe('Test Gender Select', () => {
before(function () {
cy.visit('http://localhost:4200/')
})
it('signs up a new user', () => {
cy.get('button').contains('Create New Account').click();
cy.get('#gender').select('Female', {
force: true
});
cy.get('#gender').contains('Female')
});
});
您可以从Cypress测试运行器中看到它确实选择了 Female 选项,所以我相信它可以满足您原始测试的目的.
如果我尝试像这样使用click()
cy.get('#gender').click({
force: true
});
柏树发出消息
CypressError:不能在元素上调用cy.click().改用cy.select()命令更改该值.
因此,遵循此说明并使用
cy.get('#gender').select('Female');
给出以下有关可见性的错误消息,这对于select
使用材质设计(角度材料和实体化)都是标准的.
CypressError:超时,重试:cy.select()失败,因为此元素不可见...解决此问题,或使用{force:true}禁用错误检查.
,因此在cy.select()
上使用{ force: true }
选项可解决此问题.
我了解发生可见性问题的原因是,材料设计通过选项列表覆盖了父项,赛普拉斯基于父项使用了可见性标准(请参见 When I try to use cypress to select the dropdown menu, it tells me that it's not visible. When I follow the explanatory URL that cypress provides, it suggest that I use I also followed the solutions provided here, and implemented a jQuery click on the actual option (Note that my select and option tags are not md-select and md-option tags) sample.spec.js in my cypress directory: I suppose there's two things I don't quite understand: I provide a repo with my exact issue below: Make an api-keys.ts file in /src/app and populate it with the text to follow (In a separate terminal tab) api-keys.ts:
I found the following test to work with your repository (Latest commit 353633c), You can see from the Cypress test runner that it has indeed selected the Female option, so I believe it covers the aim of your original test. If I try to use cypress gives the message CypressError: cy.click() cannot be called on a element. Use cy.select() command instead to change the value. So, following this instruction and using gives the following error message about visibility, which seems to be standard for a CypressError: Timed out retrying: cy.select() failed because this element is not visible ... Fix this problem, or use {force: true} to disable error checking. so using I understand the visibility issue occurs because material design covers the parent with the options list, and Cypress uses criteria for visibility based on the parent (see this question), although now the force option works (with Cypress v3.0.3). 这篇关于如果您使用的是材料形式,请在Angular中使用cypress进行选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!{force: true}
inside my click. This allowed my test to pass, but never actually seemed to select the items....
it('signs up a new user', () =>{
cy.get('button[id=new-account-button]').click();
cy.get('input[id=affiliation]').type(affiliation);
cy.get('input[id=password]').type(pass);
cy.get('input[id=userName]').type(name);
cy.get('input[id=email]').type(email);
//Now the options
cy.get('[name="chooseGender"]').click({force: true});
cy.get('option').contains("Female").then(option =>{
cy.wrap(option).contains("Female");
option[0].click();
});
...
git clone https://github.com/Atticus29/dataJitsu.git
cd dataJitsu
git checkout cypress-SO
npm install
ng serve
npm run e2e
export var masterFirebaseConfig = {
apiKey: "AIzaSyCaYbzcG2lcWg9InMZdb10pL_3d1LBqE1A",
authDomain: "dataJitsu.firebaseapp.com",
databaseURL: "https://datajitsu.firebaseio.com",
storageBucket: "",
messagingSenderId: "495992924984"
};
export var masterStripeConfig = {
publicApiTestKey: "pk_test_NKyjLSwnMosdX0mIgQaRRHbS",
secretApiTestKey: "sk_test_6YWZDNhzfMq3UWZwdvcaOwSa",
publicApiKey: "",
secretApiKey: ""
};
describe('Test Gender Select', () => {
before(function () {
cy.visit('http://localhost:4200/')
})
it('signs up a new user', () => {
cy.get('button').contains('Create New Account').click();
cy.get('#gender').select('Female', {
force: true
});
cy.get('#gender').contains('Female')
});
});
click()
like socy.get('#gender').click({
force: true
});
cy.get('#gender').select('Female');
select
using material design (both angular-material and materialize).
{ force: true }
option on cy.select()
fixes this problem.