Как проверить текст внутри <div>? - PullRequest
3 голосов
/ 13 марта 2011

Я пытаюсь получить доступ к тексту, который находится в DIV.
Мне нужно проверить, содержит ли страница текст, чтобы я мог вернуть истину или ложь.
Код, который я использую ниже:

cancel = browser.text.include?("Current Cancelled")
if cancel == true
puts "Line item cancelled"
else
puts "****Line item not cancelled****"
end

Но каждый раз возвращается false.
Вот фрагмент кода того, что я изучаю:

enter image description here

Ответы [ 6 ]

4 голосов
/ 15 марта 2011

Вероятная причина, по которой это не работает, заключается в том, что строка, которую вы тестируете, содержит символ новой строки и неразрывный пробел.

Это может сработать ...

if browser.div(:text, /Current.*Cancelled/).exists?
  puts "Line item cancelled"
else
  puts "****Line item not cancelled****"
end

или

if browser.text =~ /Current.*Cancelled/
  puts "Line item cancelled"
else
  puts "****Line item not cancelled****"
end

и т.д.

4 голосов
/ 13 марта 2011

Я бы действительно рекомендовал использовать Nokogiri для анализа содержимого.

require 'nokogiri'

doc = Nokogiri::HTML('<div><span class="label">Current</span>Cancelled</div>')
doc.at('//div/span[@class="label"]/../text()').text # => "Cancelled"

(doc.at('//div/span[@class="label"]/../text()').text.downcase == 'cancelled') # => true
!!(doc.at('//div/span[@class="label"]/../text()').text.downcase['cancelled']) # => true

Что-то вроде одного из двух нижних утверждений даст вам пригодное для использования значение true / false.

1 голос
/ 15 марта 2011

Вы также можете объединить несколько подходов с регулярными выражениями, приведенными ниже (в основном из Кинофроста), с идеей сузить их, чтобы заглянуть внутрь одной ячейки таблицы.Это должно быть быстрее и менее подвержено ложному предупреждению, если слова «Текущий» и «Отмененный» встречаются в указанном порядке с чем-либо между ними в другом месте на странице.

if browser.table(:class, 'basic-table').cell(:text, /Current.*Cancelled/).exists?
   puts "Line item cancelled"
else
   puts "****Line item not cancelled****"
end
1 голос
/ 15 марта 2011

Wow. В этом есть смысл. Интересно, как я может разделить их и заставить их объединить для моего чека.

Хорошо, вот очень быстрый набросок:

div = browser.table(:class, 'basic-table').div(:text, /Cancelled/)

cancel = div.exist? and div.span(:index, 1).text == 'Current'
if cancel
   puts "Line item cancelled"
else
   puts "****Line item not cancelled****"
end
1 голос
/ 14 марта 2011

Я полагаю, тот факт, что текст внутри таблицы вызывает эту проблему.

Вы могли бы рассмотреть детализацию таблицы следующим образом:

cancel = browser.table(:class, 'basic-table').each { |row|
  test = row.text.include?("Current Cancelled")
  return test if test == true
}
1 голос
/ 13 марта 2011

Объект Watir Browser теперь имеет метод # elements_by_xpath ... См. API Watir

Просто укажите свой DIV и запросите его #текст метод.Очень похоже на то, что предлагает "Железный человек" , но не требует nokogiri.

AFIK Watir использует внутренне точно для определения местоположения элементов (это драгоценный камень зависимости, который устанавливает Watir) в любом случае.

...