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

Фотография

Ошибка в Selenium WebDriver


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

#1 ArtemKorsakov

ArtemKorsakov

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

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

Отправлено 18 февраля 2016 - 07:37

Привет, коллеги!

 

Заметил одну очень неприятную вещь.

Предположим мне нужно получить текст из определённого тега.

Использую следующую команду:

value = driver.findElement(By.xpath(locator)).getText();

, где locator - строка.

Так вот, если длина строки locator составляет меньше 48 символов, то никаких проблем нет, получаю нужный результат.

Если же длина строки locator составляет 48 символов и выше, причём локатор указывает на ТОТ ЖЕ САМЫЙ тэг, то в этом случае переменная value возвращает пустое значение. При этом никаких ошибок, что локатор, мол, неверен, не выдаётся.

Ошибок не выдаётся, просто возвращается пустая строка.

 

Вопрос: с этим можно что-то сделать?

 

Я понимаю, что самый простой ответ такой: "не строить таких длинных локаторов". Но все же хотелось бы понять, чем вызвано такое странное ограничение в 48 символов и почему не выдаётся никаких ошибок.

Хотя бы ругнулось бы, а то я кучу времени потратил, выясняя, что не так с локатором.


  • 0

#2 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 18 февраля 2016 - 07:40

может быть при более длинном локаторе у тебя несколько элементов находится и первым находит как раз тот в котором нет текста ?

а вообще лучше скинуть примеры, наверное


  • 0

#3 barancev

barancev

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

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


Отправлено 18 февраля 2016 - 07:47

Прочитайте, пожалуйста, описание правил этой ветки форума вот здесь, вверху:
http://software-test...tional-testing/

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


  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#4 ArtemKorsakov

ArtemKorsakov

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

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

Отправлено 18 февраля 2016 - 09:00

Используется Selenium WebDriver

Версия: selenium-server-standalone-2.48.2.jar

Браузер Chrome Версия 48.0.2564.109 m

 

1) Переменная TEST возвращает пустое значение (ошибок никаких не выдаётся):

String TEST = driver.findElement(By.xpath("//table[@class='af_table_data-table af_table_data-table-VH-lines']/tbody/tr[1]/td[3]/div/table/tbody/tr/td[5]")).getText();
 

2) Переменная TEST возвращает правильное значение ("какой-то текст"):

String TEST = driver.findElement(By.xpath("//table//tr[1]/td[3]//td[5]")).getText();

 

3) Если на той же странице в Selenium IDE использовать команду

Command = storeText

Target = //table[@class='af_table_data-table af_table_data-table-VH-lines']/tbody/tr[1]/td[3]/div/table/tbody/tr/td[5]

Value = TEST

, то переменная TEST будет не пустой и вернёт верное значение. То же самое, что и во втором случае.

 

Все локаторы указывают на один и тот же тэг.

Опытным путём установлено, что если длина локатора 48 символов и больше, то переменная TEST всегда пустая.

 

Случай А) Длина локатора 47 символов:

String TEST = driver.findElement(By.xpath("//table/tbody/tr[1]/td[3]//table/tbody/tr/td[5]")).getText();

 

Случай Б) Длина локатора 50 символов:

String TEST = driver.findElement(By.xpath("//table/tbody/tr[1]/td[3]//table/tbody/tr[1]/td[5]")).getText();

 

 

Вопрос: Почему в случае А переменная TEST возвращает верное значение, а в случае Б - пустую строку?


  • 0

#5 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 18 февраля 2016 - 09:05

а кусок HTML'a можешь скинуть по которому xpath составляешь?


  • 0

#6 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 18 февраля 2016 - 09:09


 

Случай А) Длина локатора 47 символов:

String TEST = driver.findElement(By.xpath("//table/tbody/tr[1]/td[3]//table/tbody/tr/td[5]")).getText();

 

Случай Б) Длина локатора 50 символов:

String TEST = driver.findElement(By.xpath("//table/tbody/tr[1]/td[3]//table/tbody/tr[1]/td[5]")).getText();

 

 

Вопрос: Почему в случае А переменная TEST возвращает верное значение, а в случае Б - пустую строку?

 

Ты понимаешь, что это разные локаторы. В первом случае берутся ВСЕ tr после tbody, а во втором - только первый


  • 1

#7 ArtemKorsakov

ArtemKorsakov

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

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

Отправлено 18 февраля 2016 - 09:13

 


 

Случай А) Длина локатора 47 символов:

String TEST = driver.findElement(By.xpath("//table/tbody/tr[1]/td[3]//table/tbody/tr/td[5]")).getText();

 

Случай Б) Длина локатора 50 символов:

String TEST = driver.findElement(By.xpath("//table/tbody/tr[1]/td[3]//table/tbody/tr[1]/td[5]")).getText();

 

 

Вопрос: Почему в случае А переменная TEST возвращает верное значение, а в случае Б - пустую строку?

 

Ты понимаешь, что это разные локаторы. В первом случае берутся ВСЕ tr после tbody, а во втором - только первый

 

 

Нет, локатор один и тот же.

В первом случае берётся первая попавшаяся строка после tbody, а во втором случае - строго первая.


  • 0

#8 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 18 февраля 2016 - 09:24

В первом случае берётся первая попавшаяся строка после tbody, а во втором случае - строго первая.

 

 

кури спеку по Xpath

 

Да даже для данной страницы 2 локатора:

 

//div[@class='ipsAd']//tr/td[1]/a

 

//div[@class='ipsAd']//tr/td/a

 

Внезапно, почему это в первом случае найдена одна запись, а во втором - 4.

Наверное потому, что ты не до конца понимаешь работу XPath


  • 1

#9 DennisM

DennisM

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

  • Members
  • Pip
  • 55 сообщений
  • ФИО:Dennis M
  • Город:Ralegh NC, USA

Отправлено 19 февраля 2016 - 16:30

Поддерживаю про XPath.

такое дело: "//table/tbody/tr[1]/td[3]//table/tbody/tr/td[5]"  самое ужасное что можно придумать.

Вбей это в Firepath и оцени сколько элементов нашлось.

 

или проверь в коде типа:

int elements = driver.findElements(By.xpath("//table/tbody/tr[1]/td[3]//table/tbody/tr[1]/td[5]")).size();

если более 1, то кури мануал по Xpath, или давай сюда хтмл страницы.


  • 0


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

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