Как пройти DOM (дети / братья и сестры) с помощью watir-webdriver?

Я привык к использованию 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 ​​с соответствующей информацией …

2

Решение

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 и посмотрим, как мы можем это поддержать.

2

Другие решения

Я не верю, что есть метод .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

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

1

Может быть, я не даю вам именно то, что вы делали в 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
1
По вопросам рекламы [email protected]