Могу ли я использовать Selenium и Nokogiri, чтобы найти элемент на основе соседнего ярлыка? - PullRequest
0 голосов
/ 14 мая 2018

Допустим, я хочу очистить атрибут "Вес" от следующего содержания на веб-сайте:

<div>
  <h2>Details</h2>
  <ul>
    <li><b>Height:</b>6 ft</li>
    <li><b>Weight:</b>6 kg</li>
    <li><b>Age:</b>6</li>
  </ul>
</div>

Все, что я хочу, это "6 кг".Но это не помечено, и ничего вокруг этого нет.Но я знаю, что всегда хочу текст после «Вес:».Есть ли способ выбора элемента на основе текста рядом с ним или внутри него?

В псевдокоде это может выглядеть следующим образом:

require 'selenium-webdriver'
require 'nokogiri'
doc = parsed document
div_of_interest = doc.div where text of h2 == "Details"
element_of_interest = <li> element in div_of_interest with content that contains the string "Weight:"
selected_text = (content in element) minus ("<b>Weight:</b>")

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Да.

require 'nokogiri'

Nokogiri::HTML.parse(File.read(path_to_file))    
.css("div > ul > li")
.children # get the 'li' items
.each_slice(2) # pair a 'b' item and the text following it
.find{|b, text| b.text == "Weight:"}
.last # extract the text element
.text

вернется

"6 kg"
0 голосов
/ 15 мая 2018

Вы можете найти элемент через чистый xpath: используйте функцию contains(), которая возвращает Boolean - это его второй аргумент, найденный в первом, и передает ему text() (который возвращает текст узла) и целевую строку .

xpath_locator = '/div/ul/li[contains(text(), "Weight:")]'
value = driver.find_element(:xpath, xpath_locator).text.partition('Weight:').last

Тогда просто получите значение после «Вес:».

0 голосов
/ 14 мая 2018

Вы можете написать следующий код

p driver.find_elements(xpath: "//li").detect{|li| li.text.include?'Weight'}.text[/:(.*)/,1]

output

"6 kg"

Я предлагаю использовать WATIR, который является оберткой вокруг Ruby Selenium Binding, где вы можете легко написать следующий код

p b.li(text: /Weight/).text[/:(.*)/,1]
...