Перейти к содержимому

Фотография

Selenium FindElements Поиск элемента в элементе

Selenium RemoteWebDriver Поиск элемента в элементе FindElements

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 7

#1 fenixx

fenixx

    Новый участник

  • Members
  • Pip
  • 29 сообщений
  • Город:Москва

Отправлено 14 мая 2014 - 13:30

Selenium v.2.41.0.0

Драйвер использую FirefoxDriver

Поиск элемента по XPath в элементе по XPath.

Пример:

// Получаю коллекцию
var tabs = D.FindElementsByXPath(XPathTabs); - работает

// Обращаюсь ко второму элементу в коллекции, и ищу внутри его все теги "а" через By.XPath
var tab3 = tabs[1].FindElements(By.XPath(@"//a")); // НЕ работает как надо. Возвращает коллекцию всех ссылок на странице

// Обращаюсь ко второму элементу в коллекции, и ищу внутри его все теги "а" через By.TagName.
var tab2 = tabs[1].FindElements(By.TagName("a")); // работает как надо. Возвращает коллекцию тегов "а" внутри "tabs[1]"

// Обращаюсь ко второму элементу в коллекции, и ищу внутри его все теги "а" через By.XPath
var tab3 = tabs[1].FindElements(By.XPath(@"./*" + "//a")); // работает как надо. Возвращает коллекцию тегов "а" внутри "tabs[1]"

Не понимаю почему при таком XPath-е:

XPath проверяю в FireFoxe через расширение FirePath

./*//a - возвращает коллекцию внутри элемента. - ничего не находит при проверке через FirePath

//a - А при таком ищет на всей странице

 

Подскажите почему так и буду очень благодарен, если ссылки предоставите где это будет описано.


  • 0

#2 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 14 мая 2014 - 13:44

http://www.w3.org/TR/xpath/#node-tests

// is short for /descendant-or-self::node()/. For example, //para is short for /descendant-or-self::node()/child::para and so will select any para element in the document (even a para element that is a document element will be selected by //para since the document element node is a child of the root node); div//para is short for div/descendant-or-self::node()/child::para and so will select all para descendants of div children.


A location step of . is short for self::node(). This is particularly useful in conjunction with //. For example, the location path .//para is short for
self::node()/descendant-or-self::node()/child::para

and so will select all para descendant elements of the context node.

Или на примерах

//para selects all the para descendants of the document root and thus selects all para elements in the same document as the context node
.//para selects the para element descendants of the context node


  • 0

#3 fenixx

fenixx

    Новый участник

  • Members
  • Pip
  • 29 сообщений
  • Город:Москва

Отправлено 14 мая 2014 - 14:24

http://www.w3.org/TR/xpath/#node-tests
 

// is short for /descendant-or-self::node()/. For example, //para is short for /descendant-or-self::node()/child::para and so will select any para element in the document (even a para element that is a document element will be selected by //para since the document element node is a child of the root node); div//para is short for div/descendant-or-self::node()/child::para and so will select all para descendants of div children.


A location step of . is short for self::node(). This is particularly useful in conjunction with //. For example, the location path .//para is short for
self::node()/descendant-or-self::node()/child::para

and so will select all para descendant elements of the context node.

Или на примерах

//para selects all the para descendants of the document root and thus selects all para elements in the same document as the context node
.//para selects the para element descendants of the context node

 

 

 

Почему тогда это работает правильно Driver.FindElementsByXPath(@"//div")[1].FindElement(By.XPath(@"//a"))?

 

На сколько понимаю, FindElements если применяется к указанному элементу, то и поиск в указанном элементе должен проходить.

 

Получается что в Seleniume для FindElement и FindElements - нужно использовать разное написание XPath селекторов при поиске внутри элемента, т.к. этот вариант работать уже не будет Driver.FindElementsByXPath(@"//div")[1].FindElement(By.XPath(@"./*//a"))

 

Не понимаю почему в FindElement и FindElements работает по разному?

 

Где это может пригодиться при использовании?


  • 0

#4 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 14 мая 2014 - 15:47

Повезло! =работает правильно. В плане механики между findElements и findElement разницы нету.
Если нашли разницу - давайте код и сорс, т. к. либо вы заблуждаетесь, либо это баг.
  • 0

#5 fenixx

fenixx

    Новый участник

  • Members
  • Pip
  • 29 сообщений
  • Город:Москва

Отправлено 15 мая 2014 - 06:24

Повезло! =работает правильно. В плане механики между findElements и findElement разницы нету.
Если нашли разницу - давайте код и сорс, т. к. либо вы заблуждаетесь, либо это баг.


  • 0

#6 fenixx

fenixx

    Новый участник

  • Members
  • Pip
  • 29 сообщений
  • Город:Москва

Отправлено 15 мая 2014 - 06:50

Повезло! =работает правильно. В плане механики между findElements и findElement разницы нету.
Если нашли разницу - давайте код и сорс, т. к. либо вы заблуждаетесь, либо это баг.

 

 

Прикрепленный файл  15-05-2014 9-40-44.png   18,47К   3 Количество загрузок:

string XPathActivityTab = @"//*[@id='PortfolioEditFormtab1']";
string XPathAllLabel = @"//*[contains(@class,'control-label')]";
string XPathParent = @"/..";

var AllControls = D.FindElementsByXPath(XPathActivityTab + XPathAllLabel + XPathParent);
var sel1 = AllControls[0].FindElement(By.XPath(@"//*[contains(@class,'control-label')]"));
var sel11 = AllControls[0].FindElements(By.XPath(@"//*[contains(@class,'control-label')]"));
var sel22 = AllControls[0].FindElements(By.XPath(@"./*//*[contains(@class,'control-label')]"));
var sel222 = AllControls[0].FindElement(By.XPath(@"/./*" + @"//*[contains(@class,'control-label')]"));// Если так то работает
var sel2 = AllControls[0].FindElement(By.XPath(@"./*" + @"//*[contains(@class,'control-label')]")); // Выдает ошибку

Прикрепленный файл  15-05-2014 10-22-02.png   134,99К   0 Количество загрузок:

var tabs = D.FindElementsByXPath(@"//*[@id='tabs']");
var sel1  = tabs[1].FindElement(By.XPath(@"//a"));
var sel2  = tabs[1].FindElement(By.XPath(@"./*//a"));
var sel11 = tabs[1].FindElements(By.XPath(@"//a"));
var sel22 = tabs[1].FindElements(By.XPath(@"./*//a")); // Отрабатывает без ошибки 

Страница HTML

Прикрепленный файл  Test.7z   273,72К   2 Количество загрузок:

 

Почему отрабатывает по разному, и как с этим быть?


  • 0

#7 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 15 мая 2014 - 07:23

Отрабатывает одинаково и ошибки выдает правильно. "./*//*[contains(@class,'control-label')]" - нет такого элемента, и findElements выдает size==0, а findElement эксепшен.
Еще раз: если вы используете findElement[s] и xpath в контексте WebElement, то:
1. Если xpath начинается с "./" - поисковым контентом будет являться искомый WebElement
2. Если xpath начинается с "/" - поисковым контентом будет являться root документа.
  • 2

#8 fenixx

fenixx

    Новый участник

  • Members
  • Pip
  • 29 сообщений
  • Город:Москва

Отправлено 15 мая 2014 - 08:15

Отрабатывает одинаково и ошибки выдает правильно. "./*//*[contains(@class,'control-label')]" - нет такого элемента, и findElements выдает size==0, а findElement эксепшен.
Еще раз: если вы используете findElement[s] и xpath в контексте WebElement, то:
1. Если xpath начинается с "./" - поисковым контентом будет являться искомый WebElement
2. Если xpath начинается с "/" - поисковым контентом будет являться root документа.

 

Большое спасибо за разъяснение!!!

var AllControls = D.FindElementsByXPath(@"//*[@id='PortfolioEditFormtab1']//*[contains(@class,'control-label')]/.."); 
string Selector = @"//*[contains(@class,'control-label')]");
var sel222 = AllControls[0].FindElement(By.XPath(@"." + Selector);//Так все работает верно )))Огромное спасибо!!!

  • 0



Темы с аналогичным тегами Selenium, RemoteWebDriver, Поиск элемента в элементе, FindElements

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных