2014-05-15 14 views
6

W naszej aplikacji prawie w każdym ekranie mamy przycisk z tekstem „New”, Oto źródło html dla jednego przycisku:Xpath dla przycisku mającego tekst jako „Nowy”

<button id="defaultOverviewTable:j_id54" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only ui-state-hover" type="submit" name="defaultOverviewTable:j_id54" role="button" aria-disabled="false"> 
    <span class="ui-button-text ui-c">New</span> 
</button> 

Próbowałem za pomocą poniższego komunikatu kliknąć na przycisk:

driver.findElement(By.xpath("//button[[@type, 'submit'] and [text()='New']]")).click(); 

Ale to nie działa

org.openqa.selenium.InvalidSelectorException: The given selector //button[[@type= 'submit'] and [text()='New']] is either invalid or does not result in a WebElement. 

Obecnie Używam poniższego kodu, aby kliknąć przycisk:

List<WebElement> allButt = driver.findElements(By.tagName("button")); 
for (WebElement w : allButt) 
{ 
    if (w.getText().matches("New")) 
    { 
     w.click(); 
     break; 
    } 
} 

Ponieważ mam prawie 150 przycisków na stronie. Czy jest jakiś inny sposób?

Odpowiedz

17

składni XPath jest źle - nie trzeba wewnętrzny zestaw nawiasach kwadratowych - ale nawet jeśli naprawić to:

//button[@type, 'submit' and text()='New'] 

nie wybierze tego, czego chcesz. Problem polega na tym, że "Nowy" nie jest tekstem zawartym bezpośrednio w elemencie przycisku, ale znajduje się wewnątrz elementu potomnego. Jeśli zamiast text() po prostu użyć . następnie można sprawdzić cały ciąg wartości elementu (połączeniem wszystkich potomnych węzłów tekstowych na jakimkolwiek poziomie)

//button[@type='submit' and contains(., 'New')] 

lub sprawdź span zamiast text():

//button[@type='submit' and span='New'] 

(prześlij przyciski zawierające przęsło o wartości "Nowa")

2

Spróbuj XPath zamiast:

//button[@type='submit']/span[.='New'] 

Demo

http://www.xpathtester.com/xpath/ff393b48183ee3f373d4ca5f539bedf2


EDIT

Po komentarzem @Ian Roberts, można użyć następującego wyrażenia XPath zamiast jeśli kliknięcie na elemencie przycisk jest ważne:

//button[@type='submit']/span[.='New']/.. 
+0

dziękuję za odpowiedź. – HemaSundar

+1

Technicznie skończy się to kliknięciem przycisku 'span' zamiast' '', ale zdarzenie zostanie wywołane bańką, aby uzyskać wymagany efekt. –

+0

@IanRoberts Thks za komentarz;) – Stephan

0

Bardzo prostym rozwiązaniem dla powyższego problemu jest użycie zakresu z opcją zawierającą (tekst(), "').

Można użyć następującego kodu XPath

// rozpiętości [contains (text(), 'New')]

Powiązane problemy