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:
W teście:
Strona testowana, to:
http://sweetsoundtrack.com/
szukana piosenka, to:
Singin’ in the Rain
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"]'
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"]'
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
a tu jest repo:
Nadal mam problem z '//*[@class="list-unstyled"]// *[text()="Singin\' in the Rain"]'
. Teraz assercja nie rozpoznaje
opcja 1
tu jest screen z kodu:
opcja 2
tu jest screen z kodu:
tu jest screen z strony:
kod do repo:
https://github.com/lblaszkowski/RunningTestsOnSeveralBrowsers