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

Фотография

Проблема с XPath запросами в Selenium WebDriver


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

#1 Dmitriy Komar

Dmitriy Komar

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

  • Members
  • Pip
  • 12 сообщений
  • ФИО:Комар Дмитрий

Отправлено 14 июля 2011 - 14:01

Добрый день. Столкнулся с этой проблемой и уже второй день не могу ее решить. Дело в том, что некотороые XPath запросы прекрасно работают в FireFox-е, но не работают в IE.
Например мне нужно получить две строки:
<input id="FB_childRec1_0" type="hidden" value="child12_0,child22_0,child13_0,child23_0,child14_0,child24_0" size="1"/>
и
<input id="FB_childRec4_0" type="hidden" value="child15_0,child25_0,child16_0,child26_0,child17_0,child27_0,child18_0,child28_0,child19_0" size="1"/>

из этого кода:
<tbody>
	<input id="cidChild1_0" type="hidden" value="T3$PATENT$US7381548B220080603"/>
	<input id="cidChild1_0" type="hidden" value="T3$PATENT$US7381548B220080603"/>
	<tr id="FORWARD_1US7381548B220080603_0" class="alternate" style="" name="childTR">
		<td class="tborder leftAlignment" rowspan="1" style="width:1%">
		<td class="tborder leftAlignment vTop" rowspan="1" style="width:1%">
		<input id="FB_childRec1_0" type="hidden" value="child12_0,child22_0,child13_0,child23_0,child14_0,child24_0" size="1"/>
		<td class="tborder leftAlignment vTop" rowspan="1" style="width:1%">
		<td class="frmData tborder vTop" align="left" rowspan="1" colspan="5">Forward Citation - (Displaying 3 forward citations)</td>
	</tr>
	<input id="cidChild4_0" type="hidden" value="T3$PATENT$US7381548B220080603"/>
	<tr id="BACKWARD_4US7381548B220080603_0" class="alternate" style="" name="childTR">
		<td class="tborder leftAlignment" rowspan="1" style="width:1%">
		<td class="tborder leftAlignment vTop" rowspan="1" style="width:1%">
		<input id="FB_childRec4_0" type="hidden" value="child15_0,child25_0,child16_0,child26_0,child17_0,child27_0,child18_0,child28_0,child19_0" size="1"/>
		<td class="tborder leftAlignment vTop" rowspan="1" style="width:1%">
		<td class="frmData tborder vTop" align="left" rowspan="1" colspan="5">Backward Citation - (Displaying 14 backward citations)</td>
	</tr>
</tbody>

Я использую такой XPath запрос:
//tbody/tr[@id[contains(.,'US7381548B2')]]/input
В коде это выглядит так:
driver.FindElements(By.XPath("//tbody/tr[@id[contains(.,'" + queryArray[i] + "')]]/input"));

В FF все работает отлично и я получаю 2 записи. Но в IE метод FindElements() не возвращает вообще ничего. Я пробовал получить объекты под IE8 и IE9, но безрезультатно. Обновил Selenium WB до версии 2.0.0 - это тоде не помогло. Тогда я подумал,что, возможно, приложение выдает различные исходный код страницы для FF и IE. Я открыл страницу в IE, сохранил ее и затем открыл в FF. Firebug без проблем нашел 2 элемента, следовательно код одинаков. Все это наводит на мысль, что это какой-то баг с селениумом. Я нашел множество подобных тем на форумах - XPath запросы работают в Firefox, но не рабтают в IE, но нигде нет причин подобного поведения.

Мы планировали перевести наш отдел с QTP на Selenium WebDriver, однако такого рода ошибки на пустом месте сильно озадачивают.

Возможно кто-то уже встречался с подобными проблемами? Из-за чего это происходит? Как это решается?
  • 0

#2 Leoxa

Leoxa

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

  • Members
  • Pip
  • 59 сообщений
  • ФИО:Алексей

Отправлено 15 июля 2011 - 08:38

попробуйте такой вариант:
//input[contains(@value,'child')]

  • 0

#3 LeshaL

LeshaL

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 15 июля 2011 - 09:08

Тогда я подумал,что, возможно, приложение выдает различные исходный код страницы для FF и IE. Я открыл страницу в IE, сохранил ее и затем открыл в FF. Firebug без проблем нашел 2 элемента, следовательно код одинаков. Все это наводит на мысль, что это какой-то баг с селениумом. Я нашел множество подобных тем на форумах - XPath запросы работают в Firefox, но не рабтают в IE, но нигде нет причин подобного поведения.

Вот здесь у вас заблуждение:
код страницы, который вы видите на диске и та DOM модель, которая есть в голове у браузера вещи разные. Один и тот же HTML файл в разных браузерах может посториться в разные модели. В FF есть DOM inspector, который отображает реальное дерево. FireBugs наверное тоже самое делать умеет.
А вот под IE не знаю чем посмотреть. Самый простой, но не самый надежный вариант - поселектить кусочек HTML-ной страницы и посмотреть код для него. Или код страницы, но не сохранять на диск! На диск он может сохранить исходный файл. Посмотреть глазками и понять в чем разница.
  • 0
Regards,
Alexey

#4 a.gaseneger

a.gaseneger

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Гасенегер Артём
  • Город:Екатеринбург


Отправлено 15 июля 2011 - 09:47

А прокси в IE прописан? У меня тоже не находило элементы по xpath-локаторам в IE, пока я прокси не отключил совсем. Хотя в FF и с прокси все прекрасно работает.
  • 0

#5 Leoxa

Leoxa

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

  • Members
  • Pip
  • 59 сообщений
  • ФИО:Алексей

Отправлено 15 июля 2011 - 10:32


Тогда я подумал,что, возможно, приложение выдает различные исходный код страницы для FF и IE. Я открыл страницу в IE, сохранил ее и затем открыл в FF. Firebug без проблем нашел 2 элемента, следовательно код одинаков. Все это наводит на мысль, что это какой-то баг с селениумом. Я нашел множество подобных тем на форумах - XPath запросы работают в Firefox, но не рабтают в IE, но нигде нет причин подобного поведения.

Вот здесь у вас заблуждение:
код страницы, который вы видите на диске и та DOM модель, которая есть в голове у браузера вещи разные. Один и тот же HTML файл в разных браузерах может посториться в разные модели. В FF есть DOM inspector, который отображает реальное дерево. FireBugs наверное тоже самое делать умеет.
А вот под IE не знаю чем посмотреть. Самый простой, но не самый надежный вариант - поселектить кусочек HTML-ной страницы и посмотреть код для него. Или код страницы, но не сохранять на диск! На диск он может сохранить исходный файл. Посмотреть глазками и понять в чем разница.


в IE эта штука называется Developer Tools, активируется по F12. :)

имхо, у автора просто неудачно составлен xpath-запрос.
  • 0

#6 Dmitriy Komar

Dmitriy Komar

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

  • Members
  • Pip
  • 12 сообщений
  • ФИО:Комар Дмитрий

Отправлено 15 июля 2011 - 15:13

попробуйте такой вариант:

//input[contains(@value,'child')]


Работает, возвращает элементы, но в данном случае мне не подходит, потому что собирает элементы со всей страницы. Тут нужна привязка именно к //tbody /tr но с ней как раз ничего и не работате.

код страницы, который вы видите на диске и та DOM модель, которая есть в голове у браузера вещи разные. Один и тот же HTML файл в разных браузерах может посториться в разные модели. В FF есть DOM inspector, который отображает реальное дерево. FireBugs наверное тоже самое делать умеет.
А вот под IE не знаю чем посмотреть. Самый простой, но не самый надежный вариант - поселектить кусочек HTML-ной страницы и посмотреть код для него. Или код страницы, но не сохранять на диск! На диск он может сохранить исходный файл. Посмотреть глазками и понять в чем разница.


Спасибо, не учел. Больше так сравнивать не буду. Проверил через Developer Tools - вроде бы все одинаково.

А прокси в IE прописан? У меня тоже не находило элементы по xpath-локаторам в IE, пока я прокси не отключил совсем. Хотя в FF и с прокси все прекрасно работает


Нет, все работает без прокси

имхо, у автора просто неудачно составлен xpath-запрос.



Но ведь в FF все работет нормально. Попробую через CSS описать.
  • 0

#7 Leoxa

Leoxa

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

  • Members
  • Pip
  • 59 сообщений
  • ФИО:Алексей

Отправлено 15 июля 2011 - 16:36

попробуйте такой вариант:

//input[contains(@value,'child')]


Работает, возвращает элементы, но в данном случае мне не подходит, потому что собирает элементы со всей страницы. Тут нужна привязка именно к //tbody /tr но с ней как раз ничего и не работате.


тогда так:
//tbody/tr[@id[contains(.,'US7381548B2')]]/td/input

но я бы вместо таких длинных конструкций старался бы искать по-этапно, сначала tbody, потом в нем нужные tr-ы, а потом уже в них input-ы, правда это более долгий путь (и более медленный), зато более надежный, имхо.
  • 0

#8 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 17 июля 2011 - 13:53

У Вас очень плохой нестандартный HTML-код -- не закрываются теги <td>, непонятно, есть ли объемлющий тег <table>.
Какой DOM из этого построят браузеры -- не очень понятно. Согласно стандарту <input> не может быть вложен непосредственно в <tr>, только в <td>.
Поэтому у меня вызывает сильное подозрение тот факт, что в Firefox работает запрос по XPath "//tbody/tr[@id[contains(.,'US7381548B2')]]/input"
Не должен он работать! Надо использовать запрос, который предложил Leoxa -- "//tbody/tr[@id[contains(.,'US7381548B2')]]/td/input" или такой -- "//tr[@id[contains(.,'US7381548B2')]]//input"

Но в первую очередь я бы предложил обратить внимание на то, что HTML весьма далек от требований стандарта, и это может иметь самые неожиданные и непредсказуемые последствия.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#9 Dmitriy Komar

Dmitriy Komar

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

  • Members
  • Pip
  • 12 сообщений
  • ФИО:Комар Дмитрий

Отправлено 18 июля 2011 - 07:23

Все, я разобрался! Поэтапный парсинг решает проблему. Если парсить сначала без input, а потом в найденом выбирать input, то все начинает работать.
Скорее всего проблема действительно в корявом HTML и вложении input непосредственно в tr.

Всем большое спасибо!
  • 0


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

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