Mam problem z wybieraniem węzłów według atrybutu, gdy atrybuty zawierają więcej niż jedno słowo. Na przykład:
<div class="atag btag" />
To jest moje wyrażenie xpath:
//*[@class='atag']
Wyrażenie działa z
<div class="atag" />
ale nie w poprzednim przykładzie. Jak mogę wybrać <div>
?
div.atag
lubdiv.btag
. Super proste, bez dopasowywania ciągów i WAY szybsze (i lepiej obsługiwane w przeglądarkach). XPath (w stosunku do HTML) należy sprowadzić do tego, co jest przydatne do ... znajdowania elementów według zawartego tekstu i nawigacji DOM.Odpowiedzi:
Oto przykład, który wyszukuje elementy div, których className zawiera
atag
:Oto przykład, który znajduje elementy div, których className zawiera
atag
ibtag
:Jednak znajdzie również częściowe dopasowania, takie jak
class="catag bobtag"
.Jeśli nie chcesz częściowych dopasowań, zobacz odpowiedź Bobina poniżej.
źródło
<div class="Patagonia Halbtagsarbeit">
, który zawiera ciągi docelowe, ale nie jest div z podanymi klasami.Odpowiedź mjv to dobry początek, ale się nie powiedzie, jeśli atag nie jest wymienioną pierwszą nazwą klasy.
Zwykle podejście jest raczej nieporęczne:
działa to tak długo, jak klasy są oddzielone tylko spacjami, a nie innymi formami białych znaków. Tak jest prawie zawsze. Jeśli tak nie jest, musisz uczynić go jeszcze bardziej nieporęcznym:
(Wybór ciągów oddzielonych spacjami od nazwy klasy jest tak częstym przypadkiem, że zaskakujące jest to, że nie ma dla niego określonej funkcji XPath, takiej jak „[class ~ =" atag ”] CSS3.)
źródło
Spróbuj tego:
//*[contains(@class, 'atag')]
źródło
grabatagonabag
? (Wskazówka: nadal będzie pasować.)EDIT : patrz rozwiązanie bobince, który używa zawierający zamiast start-z , wraz z trick, aby zapewnić porównanie odbywa się na poziomie pełnej tokena (bo w „atag” wzór można znaleźć jako część innego „tag”).
„atag btag” to nieparzysta wartość atrybutu class, ale nie mniej, spróbuj:
źródło
2.0 XPath, który działa:
lub ze zmienną:
źródło
@class
ma więcej niż jeden element? Ponieważ zwróci listę słów i porównanie ich z łańcuchem zakończy się niepowodzeniem z niewłaściwą licznością .//*[tokenize(@class)=$classname]
//*[@class=$classname]
Pamiętaj, że odpowiedź Bobina może być zbyt skomplikowana, jeśli możesz założyć, że interesująca Cię nazwa klasy nie jest podciągiem innej możliwej nazwy klasy . Jeśli to prawda, możesz po prostu użyć dopasowania podciągu za pomocą funkcji zawiera. Następujące elementy będą pasować do każdego elementu, którego klasa zawiera podłańcuch „atag”:
Jeśli powyższe założenie nie zostanie spełnione, dopasowanie podłańcucha będzie pasowało do elementów, których nie zamierzasz. W takim przypadku musisz znaleźć granice słów. Używając ograniczników spacji, aby znaleźć granice nazw klas, druga odpowiedź Bobina znajduje dokładne dopasowanie:
To będzie pasować
atag
i niematag
.źródło
Aby dodać do odpowiedzi bobince ... Jeśli dowolne narzędzie / biblioteka, której używasz, korzysta z Xpath 2.0, możesz również to zrobić:
count () jest najwyraźniej potrzebne, ponieważ index-of () zwraca sekwencję każdego indeksu, do którego pasuje w ciągu.
źródło
$classname
zmiennej między cudzysłowami? Ponieważ tak jest, to jest ciąg.'$classname'
oczywiście oprócz literału ciągu.Możesz wypróbować następujące
By.CssSelector("div.atag.btag")
źródło
Przybyłem tutaj, szukając rozwiązania dla Ranorex Studio 9.0.1. Nie ma tam jeszcze pliku zawierającego (). Zamiast tego możemy użyć wyrażeń regularnych takich jak:
źródło
Aby linki zawierające wspólny adres URL musiały być konsolowane w zmiennej. Następnie spróbuj po kolei.
źródło