#ruby #selenium #xpath #html-table
#ruby #selenium #xpath #html-таблица
Вопрос:
Я тестирую веб-приложение с использованием Ruby и веб-драйвера Selenium. Мне не удалось изучить содержимое ячейки на отображаемой веб-странице. Что я хотел бы получить, так это IP-адрес в td.
<td class="multi_select_column"><input name="object_ids" type="checkbox"
value="adcf0467-2756-4c02-9edd-bb83c40b8685" /></td>
<td class="sortable normal_column">Core</td>
<td class="sortable nowrap-col normal_column">r1-c4-b4</td>
<td class="sortable anchor normal_column"><a href="/horizon/admin/instances
/adcf0467-2756-4c02-9edd-bb83c40b8685/detail" class="">pg-gtmpg--675</a></td>
<td class="sortable normal_column">column_name</td><td class="sortable normal_column">
<tr
<ul>
<li>172.25.1.12</li>
</ul>
Я использовал firepath дополнения Firefox, чтобы получить Xpath IP-адреса.
Он выдает «html/body /div[1] /div[2] / div[3]/form/table/tbody/tr[1]/td[6]/ul / li», что выглядит корректно.
Однако мне не удалось отобразить IP. Вот мой тестовый код;
#usr/bin/env ruby
#
# Sample Ruby script using the Selenium client API
#
require "rubygems"
require "selenium/client"
require "test/unit"
require "selenium/client"
begin
driver = Selenium::WebDriver.for(:remote, :url =>"http://dog.dog.jump.acme.com:4444/wd/hub")
driver.navigate.to "http://10.87.252.37/acme/auth/login/"
g_user_name = driver.find_element(:id, 'id_username')
g_user_name.send_keys("user")
g_user_name.submit
g_password = driver.find_element(:id, 'id_password')
g_password.send_keys("password")
g_password.submit
g_instance_1 = driver.find_element(:xpath, "html/body/div[1]/div[2]/div[3]/form/table/tbody/tr[1] /td[4]/a")
puts g_instance_1.text() <- here, I see the can see text
g_instance_2 = driver.find_elements(:xpath, "html/body/div[1]/div[2]/div[3]/form/table/tbody/tr[1] /td[6]/ul/li[1]")
помещает g_instance_2
output is <Selenium::WebDriver::Element:0x000000023c1700
помещает g_instance_2.inspect
output is :[#<Selenium::WebDriver::Element:0x22f3b7c6e7724d4a id="4">]
помещает g_instance_2.class
Вывод: массив
выводит g_instance_2.count:1
Когда в td нет / a, это, похоже, не работает. Я пробовал ставить g_instance_2.text, g_instance_2.text() и многие другие, но безуспешно. Должно быть, я упускаю что-то очевидное, но я этого не вижу
ruby 1.9.3p0 (2011-10-30 редакция 33570) [x86_64-linux] в Linux ubuntu 3.8.0-34-generic #49~precise1-Ubuntu
Я решил попробовать другой подход, используя css-селектор вместо xpath.
Когда я вставляю следующий css-селектор в окно FirePath, выбирается нужный раздел html.
g_instance_2 = driver.find_elements(:css, "table#instances tbody tr:nth-of-type(1) td:nth-of-type(6) ul li:nth-of-type(1)" )
Проблема такая же, как и раньше, похоже, я не могу получить доступ к содержимому g_instance_2
Я пытался;
puts g_instance_2
g_instance_22 = [g_instance_2]
puts g_instance_22
Оба возвращают;
#<Selenium::WebDriver::Element:0x000000028a6ba8>
#<Selenium::WebDriver::Element:0x000000028a6ba8>
Как я могу проверить значение, возвращаемое с удаленного веб-сервера?
Был бы Python лучшим выбором для этого?
Ответ №1:
Фрагмент HTML-кода, который вы пытаетесь протестировать, не является допустимым HTML. Возможно, для этого стоит отправить отчет об ошибке.
С помощью данного кода следующий CSS-селектор извлекает <a>
нужный:
[href^="/horizon/admin/instances"]
Переводится как: любой элемент, имеющий атрибут «href», начинающийся с «/horizon/admin/instances».
Для XPATH это селектор
("//a[contains(@href,'/horizon/admin/instances')]")
Тот же перевод, только более уродливый синтаксис.
Комментарии:
1. Привет, КерриджеО, я не уверен, что понимаю. Указанный вами XPATH действительно выбирает все узлы с атрибутом /horizon/admin/instance . Однако есть несколько строк с этим атрибутом. Мне нужна следующая ячейка, и я думаю, что единственный способ идентифицировать ее — по положению строки / столбца в таблице. Я новичок в XPATH, поэтому, пожалуйста, простите меня, если это должно быть очевидно.
2. В предоставленном HTML-коде нет такого понятия, как следующая ячейка. Ячейка включает в себя a <td> внутри a <tr> — w3schools.com/html/html_tables.asp . Это приведет к разрыву таблицы: «<tr <ul> <li>172.25.1.12</li> </ul>» После «<tr» отсутствует «>», и не указано, где это может закончиться. Кроме того, это, похоже, следует за другим <td> для какого-то вложения, о чем нелегко догадаться. Мое решение позволяет вам выполнять цикл для всех этих элементов для предоставленного кода, даже если синтаксис неверен.
3. @PaulPalmer привет, я только помог отформатировать текст, это ответ Габриэля 🙂
Ответ №2:
Проблема заключалась в том, что я неправильно обращался к возвращаемому массиву.
puts g_instance_2[0].text()
работает для css и xpath