Я привык к использованию PHP Простой HTML DOM Parser(SHDP) для доступа к элементам, но сейчас я использую ruby с watir-webdriver, и мне интересно, может ли это заменить функциональность SHDP в том, что касается доступа к элементам на страницах.
Так что в SHDP я бы сделал это:
$ret = $html->find('div[id=foo]');
Который является массивом всех экземпляров div
с id=foo
, Ах, и $html
является источником HTML указанного URL. Во всяком случае, тогда я бы поставил это в цикл:
foreach($ret as $element)
echo $element->first_child ()->first_child ()->first_child ()->first_child ()->first_child ()->first_child ()->first_child ()->plaintext . '<br>';
Теперь здесь каждый ->first_child()
это ребенок от родителей div
с id=foo
(обратите внимание, у меня есть семь), а затем я печатаю открытый текст 7-го ребенка. Что-то вроде этого
<div id="foo">
<div ...>
<div ...>
<div ...>
<div ...>
<div ...>
<div ...>
<div ...>HAPPINESS</div>
</div>
</div>
</div>
</div>
</div>
</div
</div>
напечатал бы «СЧАСТЬЕ». Итак, мой вопрос, как это можно сделать с помощью watir-webdriver (если это все возможно)?
Кроме того, и в целом, как я могу получить способности SHDP для обхода DOM в watir-webdriver:
введите описание изображения здесь
Я спрашиваю, потому что, если watir-webdriver не может этого сделать, мне нужно будет найти способ передать источник экземпляра браузера в watir-webdriver в скрипт PHP, который использует SHDP, и получить его таким образом, и каким-то образом вернуть его на ruby с соответствующей информацией …
Watir реализует функцию: index (начиная с нуля):
browser.div(id: 'foo').divs # children
browser.div(id: 'foo').div(index: 6) # nth-child
browser.div(id: 'foo').parent # parent
browser.div(id: 'foo').div # first-child
browser.div(id: 'foo').div(index: -1) # last-child
next_sibling
а также previous_sibling
в настоящее время не реализованы, пожалуйста, оставьте комментарий здесь, если считаете, что это необходимо для вашего кода: https://github.com/watir/watir/pull/270
Обратите внимание, что в целом вы должны предпочесть использование индексов использованию коллекций, но они также работают:
browser.div(id: 'foo').divs.first
browser.div(id: 'foo').divs.last
Пример кода в мягкой обложке (вы хотите выбрать текст или получить текст?):
browser.li(text: /Paperback/)
browser.td(class: "bucket").li
browser.table(id: 'productDetailsTable').li
У нас также были запросы в прошлом, чтобы поддерживать такие вещи, как прямые дети вместо того, чтобы анализировать всех потомков: https://github.com/watir/watir/issues/329
Мы активно работаем над тем, как мы хотим улучшить вещи в следующих версиях Watir, поэтому, если это решение не работает для вас, пожалуйста, опубликуйте предложение с вашим идеальным синтаксисом для достижения того, что вы хотите здесь: https://github.com/watir/watir/issues и посмотрим, как мы можем это поддержать.
Я не верю, что есть метод .child, чтобы сделать это для вас. Если вы знаете, что в этой структуре всегда будет семь дочерних элементов, вы можете сделать это
require 'watir-webdriver'
@browser = Watir::Browser.new
puts @browser.div(id: 'foo').div.div.div.div.div.div.div.text
Вы всегда можете получить коллекцию из них и затем обратиться к последнему, предполагая, что это последний, самый глубокий в стеке.
puts @browser.div(id: 'foo').divs.last.text
Это также будет работать, но предполагает что-то абсолютное в структуре страницы. Это также не эквивалентно итерации элементов, которые вы получили выше. Поскольку я не совсем понимаю, как это делать, мне не удобно делать удар по эквивалентному коду.
Может быть, я не даю вам именно то, что вы делали в PHP. Однако, если вы знаете, что текст 7-го ребенка будет HAPPINESS
тогда вы можете просто найти элемент через XPath:
ШАГИ:
Given(/^I click the div "(.*?)" xpath$/) do |div_xpath|
Watir::Wait.until { @browser.div(:xpath => div_xpath).exist? }
@browser.div(:xpath => div_xpath).click
end
ОСОБЕННОСТЬ:
Given I click the div "//div[@id='foo'][text()='HAPPINESS']" xpath