Forum Testowania i AutomatyzacjiKategoria: Pytanieproblem z xpath: //*[@class='list-unstyled']// *[text()="Singin' in the Rain"]
AvatarŁukasz Błaszkowski zapytał 5 lat temu

Witam,
 
mam mały problem w testach, a mianowicie z xpath: //*[@class=’list-unstyled’]// *[text()=”Singin’ in the Rain”]. W konsoli, to działa, ale w teście mam podkreślone na czerwoni i nie wiem jak to inaczej zrobić:
W konsoli:

View post on imgur.com


W teście:

View post on imgur.com


 
 
Strona testowana, to:
http://sweetsoundtrack.com/
szukana piosenka, to:
Singin’ in the Rain
 
 

3 odpowiedzi
Best Answer
Krzysiek KijasKrzysiek Kijas Personel odpowiedział 5 lat temu

Hej,
Problemem są cudzysłowy i apostrofy 😉 Zasadą jest że jeśli napis posiada zewnątrz podwójne cudzysłowy (czyli ") to w zawartości nie może by ani jednego podwójnego. I tak samo z pojedynczym (czyli ') – jeśli na zewnątrz są pojedyncze to wewnątrz już nie może być żadnego pojedynczego, ale podwójne można stosować w tekście (czyli ").
Wyrażenie XPath to też tekst – czyli musimy je otoczyć cudzysłowami (czyli "). W XPath zawarte są również parametry jak np. @class='list-unstyled' – i jeśli wcześniej zdecydowaliśmy się na cudzysłowy, to tutaj musimy zastosować apostrofy. Parametrom XPath też nie robi różnicy czy to cudzysłowy czy apostrofy – ważne jedynie aby ich liczba się zgadzała i aby dobrze domykały zawartość.

Czyli całość w kodzie w Pythonie powinna wyglądać tak:

"//*[@class='list-unstyled']// *[text()='Singin' in the Rain']"

Gdyby nie było apostrofu przy słownie Singin to również taka wersja byłaby poprawna:

'//*[@class="list-unstyled"]// *[text()="Singin in the Rain"]'

Krzysiek KijasKrzysiek Kijas Personel odpowiedział 5 lat temu

Faktycznie, XPath ma też problem z pojedynczym apostrofem – przy zamknięciu nazyw piosenki i w srodku – trzy apostrofy powodują niepoprawne domkniecie wyrażenia i stąd problem.

Pozostaje w tytule zastosować konstrukcje \', czyli Singin\' in the Rain. Szybki działający przykład, w którym bazujemy na szukaniu elementu z problematycznym tytułem:

from selenium import webdriver
driver = webdriver.Chrome(executable_path=r"C:\TestFiles\chromedriver.exe")
url = 'http://sweetsoundtrack.com/Movies/singin-in-the-rain-1952'
driver.get(url)

x = '//*[text()=" Singin\' in the Rain (1952) "]'
element = driver.find_element_by_xpath(x)
print(element )
driver.quit()

Czyli w naszym przypadku powinno zadziałać:
'//*[@class="list-unstyled"]// *[text()="Singin\' in the Rain"]'

AvatarŁukasz Błaszkowski odpowiedział 5 lat temu

tylko pierwsza opcja nie działa.

Komunikat z konsoli:

selenium.common.exceptions.InvalidSelectorException: Message: Given xpath expression “//*[@class=’list-unstyled’]// *[text()=’Singin’ in the Rain’]” is invalid: SyntaxError: The expression is not a legal expression.

Tu jest Screen

https://imgur.com/a/vJsHCi1

a tu jest repo:

https://github.com/lblaszkowski/RunningTestsOnSeveralBrowsers/commit/f9a3df00cf270d72599fbd38e44d29a0cd9c4a89

AvatarŁukasz Błaszkowski odpowiedział 5 lat temu

ok. działa. dzięki za pomoc

AvatarŁukasz Błaszkowski odpowiedział 5 lat temu

Nadal mam problem z '//*[@class="list-unstyled"]// *[text()="Singin\' in the Rain"]'. Teraz assercja   nie rozpoznaje
opcja 1
tu jest screen z kodu:

View post on imgur.com


opcja 2
tu jest screen z kodu:

View post on imgur.com


tu jest screen z strony:

View post on imgur.com


 
kod do repo:
https://github.com/lblaszkowski/RunningTestsOnSeveralBrowsers