4 Stimmen

Wie prüfe ich auf Text innerhalb eines <div>?

Ich versuche, auf einen Text zuzugreifen, der sich in einem DIV befindet.
Ich muss prüfen, ob die Seite den Text enthält, damit ich ein true oder false zurückgeben kann.
Der von mir verwendete Code lautet wie folgt:

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

Aber es gibt jedes Mal false zurück.
Hier ist ein Codeschnipsel von dem, was ich suche:

enter image description here

5voto

the Tin Man Punkte 154584

Ich würde wirklich empfehlen, Nokogiri zum Parsen des Inhalts zu verwenden.

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

Mit einer der beiden unteren Aussagen erhalten Sie ein brauchbares true/false.

4voto

kinofrost Punkte 758

Der wahrscheinliche Grund dafür, dass dies nicht funktioniert, ist, dass die Zeichenfolge, auf die Sie testen, ein Zeilenumbruchzeichen und ein nicht umbrechendes Leerzeichen enthält.

Das könnte funktionieren...

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

ou

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

usw.

1voto

Georgi Punkte 11

Watir's Browser Objekt hat jetzt die #elements_by_xpath Methode... Siehe Watir's API

Bestimmen Sie einfach Ihr DIV und fragen Sie nach dessen #Text. Methode. Ziemlich genau das, was der Blechmann vorschlägt, aber kein Nokogiri benötigt.

AFIK Watir verwendet intern genau für den Zweck der Lokalisierung von Elementen (es ist ein Abhängigkeits-Gem, das Watir installiert) sowieso.

1voto

Mike Cornell Punkte 5821

Ich glaube, dass die Tatsache, dass sich der Text innerhalb einer Tabelle befindet, dieses Problem verursacht.

Sie könnten in Erwägung ziehen, in den Tisch zu bohren:

cancel = browser.table(:class, 'basic-table').each { |row|
  test = row.text.include?("Current Cancelled")
  return test if test == true
}

1voto

kinofrost Punkte 758

Wow! Das macht Sinn. Ich frage mich, wie ich aufteilen kann und wie ich sie für meinen Scheck kombinieren kann.

Okay, hier ist ein wirklich schneller Entwurf:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X