背景:我在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,单选按钮等,因此将元素类型指定为选项非常有用,而不是将其硬编码到方法中。
答案 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