如何在ruby中将多个方法作为字符串发送

时间:2017-02-27 00:04:41

标签: ruby string methods hash send

我的模型自动化,其列:数据,类型::文字,序列化为哈希

将哈希记录为

{
1=>"goto 'seznam.cz'", 
2=>"text_field(placeholder: 'jméno').set 'Someone@seznam.cz'", 
3=>"text_field(placeholder: 'heslo').set 'Pass123'", 
4=>"button(xpath: //form[@class='login-form']//button[.='Přejít do Emailu']).click"
}

我反对浏览器通过selenium-webdriver&我希望将这些哈希称为序列方法,例如:

automation = Automation.find(params[:automation_id])
automation.data.keys.each do |key|
  browser.send(automation.data[key])
end

然而它不起作用因为我试图将multiplte方法名称作为一个发送。 首先可以解决为 browser.send(:goto,'seznam.cz'),但它没有帮助我更大规模,有没有办法解决它而不试图创建一些不可能的解析器(至少对我而言)。

这些方法可以作为

browser.text_field(placeholder: 'jméno').set 'Someone@seznam.cz'

当然,但我想以某种方式在循环中自动化它。

任何想法都会受到赞赏,谢谢!

1 个答案:

答案 0 :(得分:0)

假设你的意思是:

2=>"text_field(placeholder: 'jméno').set 'Someone@seznam.cz'", 

你想(有效地)打电话:

browser.text_field(占位符:'jméno')。set('Someone@seznam.cz')

然后你的问题并不像你想象的那么简单,只是将第一项称为方法。在这种情况下,第一个“item”是一个实际包含ruby代码的字符串。

这就是为什么maxple建议使用eval,但是eval有很多问题。

如果您拥有所有字符串,那么您可以使用eval,但如果其他人可以编辑这些字符串,那么他们可以执行任意代码。我想你无论如何都有这个问题。

因此,一个选项是简单地使用带有“browser。#{method}(#{param})”的eval循环,其中(method,param)从字符串中拉出。

我们可以先看一个更简单的例子来清理它:

1=>"goto 'seznam.cz'", 

如果在每种情况下都是你真正想做的事情,只需指定一个方法和参数,然后你可以用一个更有趣的数据结构来清理它,例如:

1 => { method: :goto, args: ['seznam.cz'] }

然后你可以这样做:

browser.send(automation.data[key][:method],*automation.data[key][:args])
例如,

允许多个参数。如果需要将其存储在一个简单的数据库中,至少可以为方法和args提供不同的列,并将方法字符串转换为带有to_sym的方法符号

但这对于第2步中更复杂的“自动化”没有帮助,因为实际上是另一个方法调用另一个参数的结果。

如果你真的需要将所有这些存储在某种自动化数据库中,而不是简单的ruby代码,那么一个选项就是将其分解为单个方法调用,并保存您需要的任何间歇性值。也许是这样的:

object         method         arg
------         ------         ---
browser        goto           'seznam.cz'
browser        text_field     placeholder: 'jméno'
previous       set            'Someone@seznam.cz'"

如果'object'是'browser',那么你将方法发送到浏览器,但如果'object'是'previous',那么你将方法发送到前一个调用的结果。

你需要弄清楚如何处理“占位符:'jméno'”,它有效地构建了一个哈希作为参数,我将把这个练习留给读者。

也许在这一点上你想知道你是否真的应该将红宝石代码存储在数据库中。这是一个非常好的问题。 ruby代码通常在ruby文件中更快乐。 :)

另外,作为另一个一般观点,你有:

automation.data.keys.each ...

但是你已经对你的钥匙进行了编号,这可能意味着你想以某种顺序打电话给他们。为了确保这一点,您应该使用有序集合(如数组)而不是整数索引的哈希,否则您至少可以对键进行排序,即:

automation.data.keys.sort.each ...