2017-02-27 18 views
0

我有模型自動化,其中有列:數據類型:文本,系列化作爲哈希如何發送多種方法如串紅寶石

考慮到與散紀錄

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

而且我反對瀏覽器 throught硒的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'),但它並沒有幫助我在更大的規模,有沒有什麼辦法解決它,而不嘗試創建一些不可能的解析器(for我至少)。

這些方法可以作爲

browser.text_field(placeholder: 'jméno').set '[email protected]' 
當然

,但我想以某種方式從散列循環內使自動化它。

任何想法將不勝感激,謝謝!

+0

有明顯遺漏了很多的代碼因爲這似乎需要某種解析才能正常工作。它也看起來像你正在執行可能非常危險的任意代碼。 – tadman

+0

你可以使用'eval',但同樣,不執行由陌生人 –

+0

提供的代碼串的那些只是手動添加到數據庫,這樣我就可以存儲進度,所以這是我的代碼,我只是沒有找到更好的辦法如何存儲分步代碼。 @maxple EVAL似乎工作,因此,它是好的,如果那是我的代碼或是否有更好的方式來做到這一點?不管怎樣,謝謝:) –

回答

0

。假定你的意思是:

2=>"text_field(placeholder: 'jméno').set '[email protected]'", 

是要(有效的)電話:

browser.text_field(佔位符: 'jméno')集(「有人@ seznam。 cz')

那麼你的問題並不像你想像的那麼簡單,只是把第一個項目稱爲方法。在這種情況下,第一個「item」是一個實際包含ruby代碼的字符串。

這就是爲什麼maxple建議使用eval,但eval有一些問題。

如果你擁有所有的字符串,那麼你可以使用eval,但是如果別人可以編輯這些字符串,那麼他們可以執行任意代碼。無論如何,我想你都有這個問題。

所以一個選擇是簡單地使用一個eval循環與「瀏覽器。#{方法}(#{param})」其中(方法,參數)從字符串中提取。

我們可以首先通過一個簡單的例子看起來有點打掃一下:

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

如果這是真的,你想在每一種情況下做的一切,只是指定的方法和參數,可以那麼你可以清理它一點有一個更有趣的數據結構,如:

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

然後,你可以這樣做:

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

並允許多個參數。如果您需要將其存儲在簡單的數據庫中,則至少可以爲方法和參數指定不同的列,然後將方法字符串轉換爲方法符號,其中包含to_sym

但這不能幫助您解決更復雜「自動化」就像步驟2那樣,因爲這裏的方法實際上是另一個方法調用另一個參數的結果。

如果你真的需要所有這些存儲的而不是簡單的Ruby代碼在某種自動化的數據庫,那麼一個選擇是把任務分配方法調用,並保存任何間斷值你需要。也許是這樣的:

object   method   arg 
------   ------   --- 
browser  goto   'seznam.cz' 
browser  text_field  placeholder: 'jméno' 
previous  set   '[email protected]'" 

哪裏,如果「對象」是「瀏覽器」,那麼你發送的方法到瀏覽器,但如果「對象」是「以前」,那麼你發送的方法的結果先前的呼叫。

你需要弄清楚如何處理「佔位符:‘jméno’」,這是有效地構建一個哈希作爲參數,我會留給讀者做練習。

也許在這一點上你想知道,如果你真的應該在數據庫中存儲的Ruby代碼。這是一個非常好的問題。 ruby代碼通常在ruby文件中更加快樂。 :)


此外,作爲另一種普遍的觀點,您有:

automation.data.keys.each ... 

但是你已經編號的鑰匙,這大概意味着你要叫他們按照一定的順序。爲了確保這一點,你應該使用一個有序集合,如數組,而不是用整數索引的哈希值,否則你可以在最起碼的鑰匙,即排序:

automation.data.keys.sort.each ... 
+0

(順便說一句,至於哈希的說法,你也可以(可能)只是把它作爲一個(鍵,值)的陣列 - 另一個理由允許多個參數) –