Cypress – wie findet man nach Textinhalten?

Lesezeit: 4 Minuten

Phils Benutzeravatar
Phil

In Cypress möchte ich eine Schaltfläche aus einer Gruppe von Schaltflächen basierend auf ihrem Textinhalt auswählen. Wie kann ich es tun? Hier ist mein Ansatz:

export const getCustomerButton = () => getNavigationSidenav()
  .find('mat-expansion-panel-header')
  .each(($el, index, $list) => {
    const text = $el.find('.mat-content > mat-panel-title').text();
    if (text === 'Customer') {
      return $el;
    }
    return null;
  });

Das Problem, das ich jetzt habe, ist, dass ich die Nullen aus dem Elementarray herausfiltern muss. Gibt es einen weniger komplizierten Weg?

  • Haben Sie HTML, das Sie anzeigen können? Wie ich sehe, haben Sie Ihre Antwort bereits erhalten, aber ein bisschen von dem, was Sie auswählen wollten, würde helfen.

    – Maccurt

    19. August 2019 um 16:02 Uhr

Benutzeravatar von DurkoMatko
DurkoMatko

Dieser Code ergibt das DOM-Element mit YOUR_BUTTON_CLASS welches den Text „Kunde“ enthält. Ist es das, wonach Sie suchen?

cy.get('.YOUR_BUTTON_CLASS').contains('Customer');

Hier die Dokumentation für .contains Cypress-Befehl.

  • Beachten Sie, dass das Verketten von Befehlen wie diesem zu Flakes führen kann, da die get wird nicht erneut versucht, nachdem etwas gefunden wurde, auch wenn keines der gefundenen Elemente „Customer“ enthält (siehe die Dokumente)

    – JessefSpecialisterren

    6. November 2020 um 9:39 Uhr

  • Mach einfach cy.get('Customer') würde versuchen, ein Element zu ergeben Kunde stattdessen was ist nicht was wir brauchen.

    – uninstinktiv

    25. Dezember 2020 um 6:48

  • Wenn Sie die Anzahl der Elemente ermitteln möchten, verwenden Sie besser diese Methode (stackoverflow.com/a/67699386/7469302).

    – Prasad Kavinda

    7. August 2021 um 19:46 Uhr

Oder vielleicht ist es eine noch raffiniertere Lösung, Folgendes zu verwenden:

cy.contains('YOUR_BUTTON_CLASS', 'Customer');

Dies ist seitdem möglich contains() kann 2 Argumente enthalten. Und wenn es zwei Argumente erhält, ist das erste immer das Element und das zweite der Text.

  • Die Methode „enthält“ gibt nur das erste gefundene Element zurück

    – TheTanadu

    24. November 2021 um 11:28

  • und noch einfacher ist das: cy.contains(‘Customer’)

    – JohnP2

    23. Dezember 2021 um 22:39 Uhr

  • Dies sollte aufgrund der Art und Weise, wie Cypress Abfragewiederholungen verarbeitet, die Standardantwort sein: „Wir empfehlen die Verwendung von cy.contains(selector, text), das automatisch als einzelner Befehl erneut versucht wird.“ docs.cypress.io/guides/core-concepts/…

    – TotomInc

    1. Juli 2022 um 10:30 Uhr


Joshuas Benutzeravatar
Joshua

Eine weitere Option, die in den vorherigen Antworten hier nicht erwähnt wurde.

Verwenden Testbibliothek/Cypress-Testbibliothek

Nach der Installation einfach in Cypress importieren commands.js:

import '@testing-library/cypress/add-commands'

Und in deinen Tests

cy.findAllByText("Jackie Chan").click();
cy.findByText("Button Text").should("exist");
cy.findByText("Non-existing Button Text").should("not.exist");
cy.findByLabelText("Label text", { timeout: 7000 }).should("exist");
cy.get("form").within(() => {
  cy.findByText("Button Text").should("exist");
});
cy.get("form").then((subject) => {
  cy.findByText("Button Text", { container: subject }).should("exist");
});

Das ist ziemlich einfach und einfach zu bedienen. Wir verwenden dies in unserer Produktionsstätte zusammen mit der Reaktionstestbibliothek. Sehr empfehlenswert 🙂

  • Das werde ich verwenden – danke für den Tipp!

    – Mike Harrison

    24. Februar 2021 um 18:30 Uhr

  • Ich habe mich nur gefragt, bevor ich dieses Plugin installiere cy.findByText('Button').click() liefert die gleichen Ergebnisse wie der integrierte Befehl cy.contains('Button').click(). Wenn nein, was ist der Unterschied?

    – Ebanster

    1. Mai 2021 um 12:24

  • Ich habe einen kurzen Test durchgeführt und es sieht so aus, als ob die zurückgegebenen Knöpfe etwas anders sind, sehen Sie sich das an Bildschirmfoto aber beide funktionieren wie sie sollten

    – Josua

    3. Mai 2021 um 2:04

  • Gibt es einen Weg dafür? findAllByText() nur auf sichtbare Elemente abzielen?

    – kano

    16. August 2022 um 12:06 Uhr

  • Habe es nicht getestet, aber ich denke, Sie können es tun .filter(':visible')?

    – Josua

    17. August 2022 um 0:16

Benutzeravatar von madflow
Madflow

Die akzeptierte Antwort „kann“ funktionieren. Allerdings: Wenn das Element beim ersten Versuch nicht sichtbar ist, kann das Element bei nachfolgenden Wiederholungsversuchen nicht gefunden werden.

Sehen: https://github.com/cypress-io/cypress/issues/3745

Cypress verwendet „Sizzle“ als Selektorbibliothek – also Folgendes:

cy.get('button:contains("FooBar")')

würde in Wiederholungsversuchen funktionieren.

Dafür gibt es mehrere Möglichkeiten

Syntaxen:

cy.contains(content)
cy.contains(content, options)
cy.contains(selector, content)
cy.contains(selector, content, options)

Beispiele:

cy.contains('button', 'Customer')
cy.contains('.buttonClass', 'Customer')
cy.get('button:contains("Customer")')
cy.contains('Customer')

Der einfachste Weg, dies zu tun, wäre:

cy.get('Button_Class').contains('Button_Text')

In Ihrem Fall wäre die Lösung:

cy.get('.mat-content > mat-panel-title').contains('Customer')

Hierzu gibt es eine Dokumentation Hier.

1453120cookie-checkCypress – wie findet man nach Textinhalten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy