xpath
  • selenium
  • selenium-webdriver
  • 2013-06-08 12 views 5 likes 
    5

    Drodzy selen Webdriver ekspertów,Czy łańcuch znaków jest zgodny() w Selenium Webdriver 2?

    Zastanawiam się, czy ciąg pasuje do sposobu w selen Webdriver działa prawidłowo z poniższym fragmencie kodu w Javie:

    if (property.findElements(By.xpath("./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house']")).size() > 0) { // line 229 
    

    Poniżej znajduje się strona xhtml gdzie linia 229 czyta od:

    <dl class="cN-featDetails"> 
    <dt class="proptype">Property type</dt> 
    <dd id="ctl00_ctl00_Content_Content_SrchResLst_rptResult_ctl01_EliteListingTemplate_ddPropertyType" class="propertytype type-house" title="Property type: House">House</dd> 
    

    jednakże skutkowało to w następujący błąd:

    Address: 28B/171 Gloucester Street, Sydney 
    Exception in thread "main" org.openqa.selenium.InvalidSelectorException: The given selector ./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house'] is either invalid or does not result in a WebElement. The following error occurred: 
    [InvalidSelectorError] Unable to locate an element with the xpath expression ./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house'] because of the following error: 
    [Exception... "The expression is not a legal expression." code: "51" nsresult: "0x805b0033 (NS_ERROR_DOM_INVALID_EXPRESSION_ERR)" location: " 
    

    Próbowałem również matches(class,'propertytype.*$']") bez powodzenia.

    Nazwa zmiany klasy w zależności od tego, czy nieruchomość jest dom (typ-house) lub mieszkanie (typu apartament) ... ..

    Wszelkie sugestie, w jaki sposób użyć wyrażenia regularnego w meczach, by sprawdzić, czy istnieje wartość/poprawny węzeł drzewa w tym elemencie typu właściwości?

    Ten fragment kodu jest wyświetlany w górę this URL.

    Używam Selenium 2.25.0, Java 1.7.0_11 na Windows XP & 7 platform.

    Twoja rada byłaby mile widziana.

    +0

    Typ nieruchomości
    House

    Odpowiedz

    9

    Niestety, matches() function is a part of XPath 2.0.

    WebDriver korzysta z biblioteki Wicked Good XPath, która obsługuje tylko XPath 1.0.

    Dlatego wyrażenie XPath jest niedozwolone i należy przepisać je tylko w celu używania funkcji i funkcji z XPath 1.0.

    Myślę, że można po prostu zastąpić wywołanie matches() w swoim przykładzie z contains(). Mimo to jest to , a nie za dobrą praktykę do dopasowywania nazw klas przez , ponieważ type-house będzie również pasować do type-houses. Również jeśli pasujesz do propertytype type-house, a zajęcia odbywają się w innej kolejności, nie zostaną dopasowane. XPath nie wie nic o klasach ani o listach oddzielonych spacjami, używanych w CSS. Aby dowiedzieć się więcej na ten temat, zobacz np. this.

    Należy naprawdę użyć selektora CSS Zamiast:

    dl.cN-featDetails > dd.propertytype.type-house 
    
    +0

    Poza tym brakuje '' 'infront of 'class' w wywołaniu' matches() '. –

    +1

    Jednym ze sposobów rozwiązywania problemów-zbyt wiele problemów jest użycie 'contains (concat ('', @class, '') ', type-house')'. –

    +0

    Tak. Ponadto problem klas w odmiennej kolejności można przezwyciężyć, używając 'zawiera (@klasa," pierwsza klasa ") i zawiera (@klasa," drugiej klasy ")'. Idealnie oba powiązane z 'concat()' i prawdopodobnie 'normalize-space()'. –

    -1

    Jako twój ślad stosu mówi:

    Exception in thread "main" org.openqa.selenium.InvalidSelectorException:

    Twój selektor jest nieprawidłowy

    zamiast:

    ./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house'] 
    

    Spróbuj:

    ./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house')] 
    

    (Uwaga dodatkowy nawias)

    Selen spadnie tylko z powrotem do Wicked Dobrej XPath jeśli sama przeglądarka nie posiada implementację XPath (zwykle IE). Powinno to działać w nowoczesnych przeglądarkach z implementacją XPath. Na przekroju kompatybilności Sugerowałbym przełączania contains(), jak wspomniano w @ odpowiedź Slanec za

    +0

    Ta odpowiedź jest niepoprawna. Do tej pory żadna większa przeglądarka nie obsługuje XPath 2.0 - i dlatego 'match()' does_nie działa z żadną przeglądarką. –

    +0

    Nie ma nic niejednoznacznego w twojej odpowiedzi.Mówisz, że powinna ona działać, ale jest całkowicie jasne, że w żadnym wypadku nie ma ona nic wspólnego z kompatybilnością krzyżową ani z tym, czy używasz IE, czy też nie. Jeśli edytuję tę część, twoja odpowiedź nie będzie już odpowiadać na pytanie ("jak używać wyrażenia regularnego w dopasowaniach, aby sprawdzić, czy istnieje wartość/poprawny węzeł drzewa w tym elemencie typu właściwości?" I "Czy ciągi znaków są dopasowane() w Selenie Webdriver 2? "). –

    Powiązane problemy