Как передать параметры метода в Ruby, которые можно использовать в качестве имени существующих методов? - PullRequest
0 голосов
/ 26 марта 2012

Справочная информация: я использую DSL для автоматического тестирования пользовательского интерфейса в Ruby, который называется 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, divs, переключатели и т. д., было бы очень полезно указать тип элемента в качестве опции, вместо того, чтобы жестко кодировать его в методе.

1 Ответ

1 голос
/ 27 марта 2012

Когда вы используете send, первый параметр - это имя метода, а следующие параметры - параметры для передачи в метод. См. документ .

Так что ваш b.send должен быть больше похож на:

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

Чтобы найти элемент, в котором один из атрибутов (идентификатор, класс и т. Д.) Является определенным значением, вы можете попробовать следующее. По сути, он перебирает каждый из атрибутов, пока не будет найден элемент.

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
...