Selenium 2 - Можно ли найти элементElement (By.xpath) для определенного элемента? - PullRequest
13 голосов
/ 24 августа 2011

Все примеры findElement (By.xpath), которые я видел, просматривали всю страницу, например,

WebElement td = driver.findElement(By.xpath("//td[3]"));

Чего я хочу добиться, это:

WebElement tr = ... // find a particular table row (no problem here)
WebElement td = tr.findElement(By.xpath("/td[3]"));  // Doesn't work!

Я также безуспешно пробовал другие варианты: "td [3]", "child :: td [3]"

Использование "// td [3]" находит первый соответствующий узел на всей странице, то есть не ограничивается моим tr. Таким образом, похоже, что когда вы находите Element от xpath, WebElement, для которого вы вызываете findElement (), ничего не значит.

Можно ли использовать findElement (By.xpath) для определенного WebElement?

(я использую Chrome, на случай, если это имеет значение.)

ОБРАТИТЕ ВНИМАНИЕ: By.xpath ("// td [3]") является лишь примером. Я не ищу альтернативных способов достижения того же самого. Вопрос только в том, чтобы выяснить, принимает ли foo.findElement () какое-либо уведомление о foo при использовании с селектором By.xpath.

Ответы [ 5 ]

11 голосов
/ 22 ноября 2011

Основываясь на ответе ZzZ, я думаю, что проблема в том, что запросы, которые вы пытаетесь, являются абсолютными, а не относительными. Используя начальный /, вы запускаете абсолютный поиск. Вместо этого используйте имя тега, как предложено ZzZ, ./ или .//.

Просмотрите документы XPath в разделе "Выражение пути расположения"

4 голосов
/ 12 октября 2011

Я также столкнулся с этой проблемой и потратил довольно много времени, пытаясь найти обходной путь.И вот что я понял:

WebElement td = tr.findElement(By.xpath("td[3]"));

Не знаю почему, но это работает для меня.

2 голосов
/ 09 сентября 2011

Я думаю, что это может быть ошибкой в ​​том, что Selenium2 использует xpath. Тем не менее, я считаю, что раньше я успешно ограничил область видимости, используя ":: ancestor".

В любом случае, вы пытались использовать Css Selectors для решения этой проблемы? Это вариант для вас? Попробуйте это:

tr.findElement (By.cssSelectors ( "TD: п-го из-типа (3)"));

Это должно сделать работу и эквивалентно тому, что вы пытались изначально:

tr.findElement (By.xpath ( "// TD [3]"));

0 голосов
/ 05 сентября 2012

WebElement td = tr.findElement (By.xpath ("/ td ​​[3]"));

Если вы хотите только найти дочерние элементы tr, используйтеотносительный путь не абсолютный.

Это должно работать:

int index = 3;
List<WebElement> tds = tr.findElements(By.xpath(".//td"));
System.out.println(tds[index].getText());
0 голосов
/ 26 августа 2011
what i m understanding that u want to retrieve a particular td from a tr, so here's a snippet you can try it with your code to find 3rd td...



WebElement tr=//...find a particular table row 
    List<WebElement> columns = tr.findElements(By.tagName("td"));
    Iterator<WebElement> j = columns.iterator();
    int count=0;
    while(j.hasNext())  
            {   
                WebElement column = j.next();
                if(count==2)
                {
                    System.out.print(column.getText());
                }
                count++;
            }

You can change count value in if condition to retrieve another td..
Hope this will help you..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...