I have a form that looks something like this:
<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>
...
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 {force: true}
inside my click. This allowed my test to pass, but never actually seemed to select the items.
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:
...
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();
});
...
I suppose there's two things I don't quite understand:
- Why wasn't an option actually selected?
- Why did the test pass despite this?
I provide a repo with my exact issue below:
git clone https://github.com/Atticus29/dataJitsu.git
cd dataJitsu
git checkout cypress-SO
Make an api-keys.ts file in /src/app and populate it with the text to follow
npm install
ng serve
(In a separate terminal tab)
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: ""
};
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
click()
like socypress gives the message
So, following this instruction and using
gives the following error message about visibility, which seems to be standard for a
select
using material design (both angular-material and materialize).so using
{ force: true }
option oncy.select()
fixes this problem.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).
For mat-select in Angular 7+ you have to use promises to wait for the options in the modal cdk-overlay to become available.
Here is a helper function for reuse:
Call function:
selectMaterialDropDown('myMatSelectControlName', 'OptionTextToSelect');