2015-06-05 21 views
9

Próbuję znaleźć element po jego pełnej ścieżce (wholeElement) i najpierw znajdując element wyższego poziomu, a następnie znajdując element niższego poziomu w tym elemencie (modularElement). Tu jest mój kodu:Appium findElement użyte dwa razy w jednym wierszu nie działa

WebElement modularElement = appDriver.findElement(By.xpath("//UIATableCell[2]")).findElement(By.xpath("//UIAStaticText[4]")); 
    WebElement wholeElement = appDriver.findElement(By.xpath("//UIATableCell[2]/UIAStaticText[4]")); 

    Logger.LogMessage("modularElement attribute1: " + modularElement.getLocation(), Priority.High); 
    Logger.LogMessage("wholeElement attribute1: " + wholeElement.getLocation(), Priority.High); 

Naprawdę dziwny problem mam przeżywa to dwa elementy (modułowe i ca) są różne elementy i nie ten sam (pokazane w różnych miejscach drukowanych w kodzie powyżej). Czy ktoś może wyjaśnić, dlaczego tak się dzieje?

Dzięki.

UPDATE:

Próbowałem również używając .// ale dostarcza ten sam problem nadal:

WebElement modularElement = appDriver.findElement(By.xpath("//UIATableCell[2]")).findElement(By.xpath(".//UIAStaticText[4]")); 

Odpowiedz

8

one nie są takie same.

appDriver.findElement(By.xpath("//UIATableCell[2]")).findElement(By.xpath("//UIAStaticText[4]")); 

Tutaj szukasz //UIAStaticText[4] nigdzie at any level in the entire DOM tree:

Przy użyciu XPath mieć świadomość, że webdriver następujące standardowe konwencje: poszukiwanie przedrostkiem "//" przeszuka cały dokument, nie tylko dzieci tego bieżącego węzła. Użyj ".//", aby ograniczyć swoje wyszukiwanie do dzieci tego WebElement.

Podczas //UIATableCell[2]/UIAStaticText[4] by szukać wśród bezpośrednich dzieci się tylko //UIATableCell[2].

+1

Czy jesteś pewien, że pierwsza linia kodu znajdzie '' tylko UIAStaticText' pod UIATableCell [2] ', a nie nigdzie indziej w dokumencie? Po prostu pytam, ponieważ XPath zaczynający się od '//' normalnie wybiera ze wszystkich potomków * węzła głównego dokumentu *. (Zgadzam się jednak z twoim ogólnym stwierdzeniem na temat różnicy między '/' i '//'). – LarsH

+0

@LarsH to świetny punkt! Tęskniłem za tym. Edytowane. Wielkie dzięki! – alecxe

+0

Dzięki za komentarze. Obawa przy użyciu ./UIAStaticText[4] powoduje błąd "element nie może być zlokalizowany". Skopiowano i wklejono 2 wiersze kodu powyżej i znaleziono cały wynik, ale moduł nie jest. –

0

zrobiłbym to tak jakby zamiast:

By locator = new ByChained(By.xpath("//UIATableCell[2]"),By.xpath(".//UIAStaticText[4]")); 
WebElement modularElement = appDriver.findElement(locator); 

A może to:

public WebElement getCellTextElement(int cell, String varText) { 
    By locator = new ByChained(By.xpath("//UIATableCell[" + cell + "]"), 
     By.xpath(".//UIAStaticText[contains(text(),'" + varText + "')]")); 
    WebElement modularElement = appDriver.findElement(locator); 
    return modularElement; 
}