2014-05-15 14 views
6

Nella nostra applicazione quasi in ogni schermata abbiamo un pulsante con il testo 'Nuovo', ecco la sorgente html per uno dei pulsanti:Xpath per il pulsante di avere il testo come 'Nuovo'

<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> 

ho provato utilizzando l'istruzione qui sotto per fare clic sul pulsante:

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

Ma questo non funzionava

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

Attualmente Sto usando il codice qui sotto per fare clic sul pulsante:

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

Come ho quasi 150 pulsanti nella pagina. C'è un altro modo?

risposta

17

la sintassi XPath è sbagliato - non è necessario il set interno di parentesi quadre - ma anche se si fissa this:

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

non selezionerà ciò che si desidera. Il problema è che il "Nuovo" non è il testo contenuto direttamente nell'elemento del pulsante ma è all'interno di un elemento di estensione figlio. Se invece di text() basta usare . allora è possibile controllare l'intero valore stringa dell'elemento (la concatenazione di tutti i nodi di testo discendenti a qualsiasi livello)

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

O controllare span invece di text():

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

(invia pulsanti contenenti un intervallo il cui valore è "Nuovo")

2

Prova questo XPath invece:

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

Demo

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


EDIT

seguente commento da @Ian Roberts, è possibile utilizzare la seguente espressione XPath, invece, se il clic sull'elemento pulsante è importante:

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

Grazie per la risposta. – HemaSundar

+1

Tecnicamente questo finirà per fare clic su 'span' piuttosto che sul pulsante', ma l'evento si riempirà di bolle in modo da avere l'effetto richiesto. –

+0

@IanRoberts Thks per il tuo commento;) – Stephan

0

La soluzione molto semplice per il problema precedente è utilizzare span con l'opzione contiene (text(), '').

È possibile utilizzare il seguente codice XPath

// arco [contiene (di testo(), 'Nuovo')]

Problemi correlati