Подтвердить что ты не робот

Selenium 2 - Может ли findElement (By.xpath) быть привязан к определенному элементу?

Все примеры 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]" находит первое совпадение node на всей странице, то есть не ограничивается моим tr. Таким образом, это выглядит так, как если вы находитеElement by xpath, WebElement, на который вы вызываете findElement(), ничего не значит.

Возможно ли, чтобы область findElement (By.xpath) была привязана к определенному WebElement?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

what i m understanding that u want to retrieve a particular td from a tr, so here 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..

Ответ 5

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());