Próbuję przetestować skomplikowany interfejs javascript z Selenium (przy użyciu interfejsu Python i wielu przeglądarek). Mam kilka przycisków formularza:
<div>My Button</div>
Chciałbym móc wyszukiwać przyciski na podstawie „Mojego przycisku” (lub nie uwzględniających wielkości liter, częściowych dopasowań, takich jak „mój przycisk” lub „przycisk”)
Uważam to za niezwykle trudne do tego stopnia, że wydaje mi się, że brakuje mi czegoś oczywistego. Najlepsze, co do tej pory mam, to:
driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')
Uwzględnia to jednak wielkość liter. Inną rzeczą, której próbowałem, jest iterowanie przez wszystkie elementy div na stronie i sprawdzanie właściwości element.text. Jednak za każdym razem, gdy pojawia się sytuacja w formularzu:
<div class="outer"><div class="inner">My Button</div></div>
div.outer ma również „My Button” jako tekst. Aby to naprawić, próbowałem sprawdzić, czy div.outer jest rodzicem div.inner, ale nie mogłem dowiedzieć się, jak to zrobić (element.get_element_by_xpath ('..') zwraca element nadrzędny elementu, ale testy nie są równe div.outer). Również iteracja po wszystkich elementach strony wydaje się być bardzo powolna, przynajmniej przy użyciu webdrivera Chrome.
Pomysły?
Edycja: To pytanie było trochę niejasne. Zapytano (i odpowiedział) o bardziej szczegółową wersję tutaj: Jak uzyskać tekst elementu w Selenium WebDriver (za pośrednictwem interfejsu API Python) bez dołączania tekstu elementu potomnego?
Odpowiedzi:
Spróbuj wykonać następujące czynności:
źródło
find_element(s)_by_link_text
ifind_element(s)_by_partial_link_text
metodymożesz wypróbować xpath:
źródło
.format
nie jest rozpoznawany w moim zaćmieniu. daje i błąd. jakiś pomysł, dlaczego?Możesz go również używać z Wzorem Obiektów Strony, np .:
Wypróbuj ten kod:
źródło
// * będzie szukał dowolnego tagu HTML. Gdzie, jeśli jakiś tekst jest wspólny dla przycisku i znacznika div, a jeśli // * to kategorie, nie będzie działać zgodnie z oczekiwaniami. Jeśli musisz wybrać jakiś konkretny, możesz go uzyskać, deklarując znacznik HTML Element. Lubić:
źródło
Co ciekawe, praktycznie wszystkie odpowiedzi dotyczą funkcji xpath
contains()
, pomijając fakt, że rozróżnia duże i małe litery - w przeciwieństwie do zapytania OP.Jeśli potrzebujesz rozróżniać małe i wielkie litery, jest to możliwe w Xpath 1.0 (wersja obsługująca współczesne przeglądarki) , choć nie jest to ładne - za pomocą tej
translate()
funkcji. Zastępuje znak źródłowy pożądaną formą za pomocą tabeli translacji.Konstruowanie tabeli zawierającej wszystkie wielkie litery skutecznie przekształci tekst węzła w jego niższą () formę - umożliwiając dopasowanie bez rozróżniania wielkości liter (oto tylko przywilej) :
Pełne wywołanie Pythona:
Oczywiście takie podejście ma swoje wady - jak podano, będzie działać tylko w przypadku tekstu łacińskiego; jeśli chcesz zakryć znaki Unicode - musisz dodać je do tabeli tłumaczeń. Zrobiłem to w powyższym przykładzie - ostatnim znakiem jest cyrylica
"Й"
.A gdybyśmy żyli w świecie, w którym przeglądarki obsługiwały xpath 2.0 i nowsze wersje (🤞, ale nie dzieje się to w najbliższym czasie ☹️) , moglibyśmy korzystać z funkcji
lower-case()
(jeszcze nie w pełni świadomych ustawień regionalnych) imatches
(do wyszukiwania wyrażeń regularnych, z uwzględnieniem wielkości liter -insensitive ('i'
) flag).źródło
W dostarczonym pliku HTML:
Tekst
My Button
jestinnerHTML
i nie ma wokół niego żadnych białych znaków, dzięki czemu można łatwo używaćtext()
w następujący sposób:Tekst ze spacjami wiodącymi / końcowymi
Dodaj odpowiedni tekst zawierający białe spacje na początku:
lub na końcu:
lub na obu końcach:
W takich przypadkach masz 2 opcje:
Możesz użyć
contains()
funkcji, która określa, czy pierwszy ciąg argumentu zawiera drugi ciąg argumentu i zwraca wartość logiczną true lub false w następujący sposób:Możesz użyć
normalize-space()
funkcji, która usuwa początkowe i końcowe białe znaki z ciągu, zastępuje ciąg znaków białych znaków pojedynczą spacją i zwraca wynikowy ciąg w następujący sposób:xpath dla zmiennej Text
Incase tekst jest zmienną, której możesz użyć:
źródło
źródło
Podobny problem: Znajdź
<button>Advanced...</button>
Może da ci to kilka pomysłów (proszę przenieść koncepcję z Javy do Pythona):
źródło
Zastosowanie driver.find_elements_by_xpath i mecze regex funkcji dopasowania do sprawy niewrażliwego wyszukiwania elementu przez jego tekstu.
źródło
matches()
jest funkcją xpath 2.0, a przeglądarki niestety obsługują tylko wersję 1.0.Spróbuj tego. To jest bardzo łatwe:
To naprawdę działało dla mnie w sterowniku sieci selenium.
źródło