selenium
  • xpath
  • selenium-webdriver
  • 2014-04-15 10 views 15 likes 
    15

    Sto cercando di usare XPath per trovare un elemento che contiene un pezzo di testo, ma non riesco a farlo funzionare ....Selenio e xPath - individuazione di un collegamento con il testo contenente

    WebElement searchItemByText = driver.findElement(By.xpath("//*[@id='popover-search']/div/div/ul/li[1]/a/span[contains(text()='Some text')]")); 
    

    Se rimuovo l'ultimo bit con la cosa "contiene", individua il mio elemento span, ma ho bisogno di selezionarlo in base al contenuto del testo. Non sarà una corrispondenza perfetta di "Some text", perché potrebbe contenere anche stringhe troncate.

    Qualcuno vede il problema?

    +0

    Si dovrebbe mostrare l'HTML dell'elemento 'a' (ed è elementi circostanti) in modo che possiamo confrontare la sua struttura con ciò che il tuo XPath segue. – Arran

    risposta

    29

    Credo che il problema è qui:

    [contains(text()='Some text')] 
    

    operare una scomposizione,

    1. Il [] è un condizionale che opera su ogni singolo nodo in quel set di nodi - ciascun nodo di span nel tuo caso. Corrisponde se uno qualsiasi dei singoli nodi funziona per far corrispondere le condizioni all'interno delle parentesi.
    2. text() è un selettore che corrisponde a tutti i nodi di testo che sono figli del nodo di contesto - restituisce un set di nodi.
    3. contains è una funzione che gestisce su una stringa. Se viene passato un set di nodi, il set di nodi è converted into a string by returning the string-value of the node in the node-set that is first in document order.

    Si dovrebbe provare a cambiare questo

    [text()[contains(.,'Some text')]]

    1. L'esterno [] sono una condizione che opera su ogni singolo nodo in quel nodo impostato text() è un selettore che corrisponde a tutti il testo nodi che sono figli del nodo di contesto - restituisce un nodo impostato.

    2. Gli interni [] sono un condizionale che opera su ciascun nodo nel set di nodi .

    3. contains è una funzione che opera su una stringa. Qui viene passato un singolo nodo di testo (.).

    +1

    spiegazione impressionante! –

    +0

    lieve cambiamento di argomento, può funzionare anche per la lezione? '' '[contains (class() = 'Some class')]' '' – TangibleDream

    10

    Utilizzare questa

    //*[@id='popover-search']/div/div/ul/li[1]/a/span[contains(text(),'Some text')] 
    

    O

    //*[@id='popover-search']/div/div/ul/li[1]/a/span[contains(.,'Some text')] 
    
    +0

    Grazie! Sono andato con il primo :) – joakimnorberg

    -4
    @FindBy(xpath = "//span[@class='y2' and contains(text(), 'Your Text')] ") 
    private WebElementFacade emailLinkToVerifyAccount; 
    

    Questo approccio funziona per voi, si spera.

    +1

    Per favore aggiungi ulteriori informazioni alla tua risposta. –

    2
    @FindBy(xpath = "//button[@class='btn btn-primary' and contains(text(), 'Submit')]") private WebElementFacade submitButton; 
    
    public void clickOnSubmitButton() { 
        submitButton.click(); 
    } 
    
    Problemi correlati