你如何在Ruby中传递方法参数,它可以用作现有方法的名称?

时间:2012-03-26 19:40:42

标签: ruby selenium automated-tests watir watir-webdriver

背景:我在Ruby中使用DSL进行自动UI测试,称为Watir-Webdriver。

我想编写一个非常可重用的方法,当存在特定的HTML元素时,该方法会传递或失败。以下是我到目前为止的情况:

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

我可以理解,此示例中的“div”是作为方法参数传递的字符串。但是在dsl的上下文中,“div”(减去引号)也是Watir-webdriver方法。所以我想我需要以某种方式将字符串转换为符合条件的watir-webdriver方法

我基本上想要执行以下操作来确定元素是否存在。

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

由于我将寻找select_lists,div,单选按钮等,因此将元素类型指定为选项非常有用,而不是将其硬编码到方法中。

1 个答案:

答案 0 :(得分:1)

使用send时,第一个参数是方法名称,以下参数是传递给方法的参数。请参阅doc

所以你的b.send应该更像:

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

要查找其中一个属性(id,class等)是特定值的元素,您可以尝试以下操作。基本上它遍历每个属性,直到找到一个元素。

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