2012-03-26 8 views
0

Hintergrund: Ich verwende eine DSL für automatisierte UI-Tests in Ruby namens Watir-Webdriver.Wie übergibt man Methodenparameter in Ruby, die als Name existierender Methoden verwendet werden können?

Ich möchte eine sehr wiederverwendbare Methode schreiben, die besteht oder fehlschlägt, wenn ein bestimmtes HTML-Element vorhanden ist. Hier ist, was ich bisher:

require 'watir-webdriver' 
require 'rspec' 

b = Watir::Browser.new 

def display_check(element_type,unique_element,expectation) 
if expectation == "yes" 
    b.send(element_type).((:id or :class or :name or :value),/#{Regexp.escape(unique_element)}/).exists?.should == true 
else 
    b.send(element_type).((:id or :class or :name or :value),/#{Regexp.escape(unique_element)}/).exists?.should == false 
    end 
end 

Ich kann verstehen, dass „div“ in diesem Beispiel eine Zeichenfolge als eine Methode Argument übergeben ist. Aber im Kontext der DSL ist "div" (minus die Anführungszeichen) auch eine Watir-Webdriver-Methode. Also ich denke, ich muss irgendwie die Zeichenfolge in eine geeignete watir-webdriver-Methode konvertieren

Ich möchte im Grunde Folgendes tun, um festzustellen, ob ein Element existiert.

display_check("div","captcha","no") 

Da ich für select_lists suchen würde, divs, Radio-Buttons etc., wäre es sehr nützlich sein, den Elementtyp als Option angeben, anstatt es hart auf das Verfahren codiert zu haben.

Antwort

1

Wenn Sie send verwenden, ist der erste Parameter der Methodenname und die folgenden Parameter sind die Parameter, die an die Methode übergeben werden. Siehe doc.

So Ihre b.send sollte mehr sein wie:

b.send(element_type, :id, /#{Regexp.escape(unique_element)}/).exists? 

ein Element zu finden, wo eines der Attribute (id, Klasse, usw.) ein bestimmter Wert ist, können Sie die folgende versuchen. Im Grunde iteriert es durch jedes der Attribute, bis ein Element gefunden wird.

def display_check(b, element_type, unique_element, expectation) 
    element_exists = false 
    [:id, :class, :name, :value].each do |attribute| 
     if b.send(element_type, attribute, /#{Regexp.escape(unique_element)}/).exists? 
      element_exists = true 
      break 
     end 
    end 

    if expectation == "yes" 
     element_exists.should == true 
    else 
     element_exists.should == false 
    end 
end 
+0

Das hat funktioniert. Ich vermute, ich habe missverstanden, wie die Sendemethode funktioniert. Vielen Dank! – mmla