Ich versuche, eine komplizierte Javascript-Oberfläche mit Selenium zu testen (über die Python-Oberfläche und über mehrere Browser hinweg). Ich habe eine Reihe von Schaltflächen des Formulars:
<div>My Button</div>
Ich möchte in der Lage sein, nach Schaltflächen zu suchen, die auf "Meine Schaltfläche" basieren (oder nach nicht übereinstimmenden Teilübereinstimmungen wie "Meine Schaltfläche" oder "Schaltfläche").
Ich finde das erstaunlich schwierig, in dem Maße, in dem ich das Gefühl habe, etwas Offensichtliches zu vermissen. Das Beste, was ich bisher habe, ist:
driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')
Dies unterscheidet jedoch zwischen Groß- und Kleinschreibung. Das andere, was ich versucht habe, ist, alle Divs auf der Seite zu durchlaufen und die Eigenschaft element.text zu überprüfen. Jedes Mal, wenn Sie eine Situation des Formulars erhalten:
<div class="outer"><div class="inner">My Button</div></div>
div.outer hat auch "My Button" als Text. Um DAS zu beheben, habe ich versucht zu prüfen, ob div.outer das übergeordnete Element von div.inner ist, konnte jedoch nicht herausfinden, wie dies zu tun ist (element.get_element_by_xpath ('..') gibt das übergeordnete Element eines Elements zurück, aber es Tests ungleich div.outer). Außerdem scheint das Durchlaufen aller Elemente auf der Seite sehr langsam zu sein, zumindest mit dem Chrome-Webdriver.
Ideen?
Edit: Diese Frage kam etwas vage heraus. Hier wurde eine spezifischere Version gefragt (und beantwortet): Wie kann man Text eines Elements in Selenium WebDriver (über die Python-API) abrufen, ohne untergeordneten Elementtext einzuschließen?
Antworten:
Versuche Folgendes:
quelle
find_element(s)_by_link_text
undfind_element(s)_by_partial_link_text
MethodenSie könnten einen xpath versuchen wie:
quelle
.format
wird in meiner Sonnenfinsternis nicht erkannt. es gibt und Fehler. Irgendeine Idee, warum?Sie können es auch mit dem Seitenobjektmuster verwenden, z.
Versuchen Sie diesen Code:
quelle
// * sucht nach einem HTML-Tag. Wenn für Button- und Div-Tags Text gemeinsam ist und // * Kategorien sind, funktioniert dies nicht wie erwartet. Wenn Sie ein bestimmtes auswählen müssen, können Sie es durch Deklarieren des HTML-Element-Tags erhalten. Mögen:
quelle
Interessanterweise drehen sich praktisch alle Antworten um die Funktion von xpath und
contains()
vernachlässigen die Tatsache, dass zwischen Groß- und Kleinschreibung unterschieden wird - im Gegensatz zu OPs Fragen.Wenn Sie die Groß- und Kleinschreibung nicht berücksichtigen müssen, ist dies in xpath 1.0 (der Version, die moderne Browser unterstützen) möglich , obwohl es nicht schön ist - mithilfe der
translate()
Funktion. Mithilfe einer Übersetzungstabelle wird ein Quellzeichen durch die gewünschte Form ersetzt.Durch das Erstellen einer Tabelle mit allen Großbuchstaben wird der Text des Knotens effektiv in seine Kleinbuchstabenform () umgewandelt, sodass eine Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung möglich ist (hier nur das Vorrecht) :
Der vollständige Python-Aufruf:
Natürlich hat dieser Ansatz seine Nachteile - wie angegeben, funktioniert er nur für lateinischen Text. Wenn Sie Unicode-Zeichen behandeln möchten, müssen Sie sie der Übersetzungstabelle hinzufügen. Ich habe das im obigen Beispiel gemacht - das letzte Zeichen ist das kyrillische Symbol
"Й"
.Und wenn wir in einer Welt gelebt hätten, in der Browser xpath 2.0 und höher unterstützen (🤞, aber nicht in Kürze ☹️) , hätten wir die Funktionen
lower-case()
(noch nicht vollständig länderspezifisch) undmatches
(für Regex-Suchen mit Groß- und Kleinschreibung) verwenden können -insensitive ('i'
) flag).quelle
In dem von Ihnen bereitgestellten HTML:
Der Text
My Button
ist derinnerHTML
und hat keine Leerzeichen, sodass Sie ihntext()
wie folgt verwenden können:Text mit führenden / nachfolgenden Leerzeichen
Fügen Sie den relevanten Text mit Leerzeichen entweder am Anfang ein:
oder am Ende:
oder an beiden Enden:
In diesen Fällen haben Sie zwei Möglichkeiten:
Sie können eine
contains()
Funktion verwenden, die bestimmt, ob die erste Argumentzeichenfolge die zweite Argumentzeichenfolge enthält und wie folgt den booleschen Wert true oder false zurückgibt:Sie können eine
normalize-space()
Funktion verwenden, mit der führende und nachfolgende Leerzeichen von einer Zeichenfolge entfernt, Sequenzen von Leerzeichen durch ein einzelnes Leerzeichen ersetzt und die resultierende Zeichenfolge wie folgt zurückgegeben werden:xpath für die Variable Text
Wenn der Text eine Variable ist, die Sie verwenden können:
quelle
quelle
Ähnliches Problem: Finden
<button>Advanced...</button>
Vielleicht gibt Ihnen dies einige Ideen (bitte übertragen Sie das Konzept von Java auf Python):
quelle
Verwenden driver.find_elements_by_xpath und Streichhölzer REGEX für die passende Funktion Groß- und Kleinschreibung Suche des Elements durch den Text.
quelle
matches()
ist eine xpath 2.0-Funktion, und die Browser unterstützen leider nur 1.0.Versuche dies. Es ist sehr leicht:
Das hat bei mir im Selen-Webtreiber wirklich funktioniert.
quelle