Quelqu'un sait-il comment sélectionner une option dans une liste déroulante React-Select dans un test de cyprès?
J'ai essayé plein de trucs mais en vain.
Il semble que React-Select utilise une entrée cachée. Ce cyprès ne peut pas y écrire. Et les divs sur lesquels le cyprès ne peut pas non plus écrire.
Cela n'aide pas non plus que je ne sache pas comment inspecter la liste déroulante réelle dans les outils de développement car elle ne reste pas ouverte.
J'utilise:
La réponse de @ bkucera fonctionne. Le code de travail que j'ai fini était:
it('updates Person', () => {
cy.get('[data-id=bearbeiter]')
.find('.css-10nd86i')
.click()
.find('input')
.eq(1)
.focus()
cy.contains('Test Tester').click({ force: true })
})
J'ai dû ajouter une .eq(1)
après find
car il semble y avoir deux entrées.
La solution ci-dessus a fini par cliquer sur les éléments de l'arborescence de navigation de mon site qui contenaient le même texte. Donc pas de cigare :-(
J'ai également essayé cette solution:
Cypress.Commands.add('setSelectOption', ({ selector, option, value }) => {
cy.get(selector)
.find('.css-10nd86i input')
.eq(1)
.focus()
.type(value, { force: true })
})
... mais même si force: true
est utilisé, j'obtiens cette erreur:
The element typed into was:
> <input name="aeId" type="hidden" value="862333db-31cf-444c-b8ea-021c640c7a44">
Cypress considers the 'body', 'textarea', any 'element' with a 'tabindex' or 'contenteditable' attribute, or any 'input' with a 'type' attribute of 'text', 'password', 'email', 'number', 'date', 'week', 'month', 'time', 'datetime', 'datetime-local', 'search', 'url', or 'tel' to be valid typeable elements.
Jusqu'à présent, cela a fonctionné le mieux:
Cypress.Commands.add('setSelectOption', ({ selector, option, value }) => {
cy.get(selector)
.find('.css-10nd86i input:text')
.focus()
.type(option, { force: true, delay: 600, timeout: 330000 })
.type('{enter}', { force: true })
cy.get(selector)
.find('.css-10nd86i')
.find('input')
.eq(1)
.should('have.value', value)
})
Au moins, cela fonctionne pour les listes restreintes. Le texte est entré lentement. Pour notre liste d'espèces (7000 de long), j'ai ajouté ces options delay
et timeout
. Le délai semble aider, mais je n'ai pas pu comprendre exactement comment ces options influencent le comportement. Et parfois, le cyprès expire :-(
Pendant ce temps (react-select v3.0.4, cypress v3.3.2) tous les tests échouent car:
Expected to find element '.css-10nd86i' but never found it
Je suppose que la classe a changé. Pas étonnant avec une solution aussi fragile :-(
Vous devez d'abord cliquer pour ouvrir la liste déroulante React-Select, puis cliquer sur l'élément réel que vous souhaitez ouvrir. Nous utilisons cette syntaxe pour cela:
cy.get('.s3p-react-select__indicator').eq(1)
.click()
cy.get('[id^="react-select-"]').contains('<value_dropdownbox>')
.click()
Et il utilise en effet des champs de saisie cachés. Pour trouver le champ de saisie caché, ouvrez vos outils de développement, choisissez les éléments et recherchez "input [type = 'hidden']".
Enfin une réponse à votre dernière question:
Cela n'aide pas non plus que je ne sache pas comment inspecter la liste déroulante réelle dans les outils de développement car elle ne reste pas ouverte.
Essayez de télécharger le React sélectionnez le plug-in de développeur pour Chrome: https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi
Si vous avez ouvert vos outils de développement Chrome Chrome, cliquez sur l'onglet React. Maintenant, cliquez avec le bouton droit sur votre élément React et choisissez inspecter l'élément. Vous voyez toutes les options que vous pouvez faire pour cet élément. Mais il ne sélectionnera probablement pas l'élément correct à la fois, alors recherchez l'élément avec la case à cocher "menuIsOpen", et vérifiez-le. La liste déroulante restera ouverte jusqu'à ce que quelque chose change la page
Sur Cypress 4.2.0 et react-select 3.0.8, appuyer deux fois sur Entrée fonctionne pour moi:
cy.get('#react-select-component-id').type('Something{enter}{enter}');
Passez l'ID pour réagir-sélectionnez et trouvez-le comme:
cy.get('#country').within($el => {
cy.wrap($el)
.click()
.find('div[tabindex*="-1"]')
.first()
.click();
});
Donc, commencez par interroger l'élément, enveloppez-le et déclenchez l'événement click, puis utilisez simplement l'un des accessoires de données que chaque élément possède, je suis allé avec tabindex -1 puisque chaque élément l'a, utilisez eq (x) si vous avez besoin de élément.
Dans mon cas, cela a aidé:
cy.get("[for=country]")
.click()
.type("Poland{enter}");
Mais n'oubliez pas que je clique sur l'étiquette, qui se concentre bien sur l'entrée de sélection de réaction.
J'utilise Cypress 4.2.0, je suis capable de faire les commandes de chaîne suivantes:
Cypress.Commands.add('selectDropdownlist', (dropDownSelectionId) => {
cy.get('[data-id=bearbeiter]').click({force: true})
.get(`[id="${dropDownSelectionId}"]`).click() //the id or any selector of the value 'Test Tester'
})
Hé les gars, j'ai cette solution ici:
"cypress": "^3.4.1"
"react-select": "^2.4.3"
cy
.get('[class*="-control"]')
.click(0, 0, { force: true })
.get('[class*="-menu"]')
.find('[class*="-option"]')
.eq(2)
.click(0, 0, { force: true })