2010-03-18 39 views
3

我嘗試使用機械化(Ruby)訪問表單。 在我的表格上,我有一個Radiobuttons的gorup。 所以我想檢查其中的一個。Nokogiri錯誤:未定義的方法`radiobutton_with' - 爲什麼?

我寫道:

target_form = (page/:form).find{ |elem| elem['id'] == 'formid'} 
target_form.radiobutton_with(:name => "radiobuttonname")[2].check 

在此行中我想用2 但在這條線的值來檢查單選按鈕,我得到一個錯誤:

: undefined method `radiobutton_with' for #<Nokogiri::XML::Element:0x9b86ea> (NoMethodError) 
+1

根據文檔,你的表單應該是'Mechanize :: Form'類,而不是'Nokogiri :: XML :: Element'。你是如何得到'target_form'的? – 2010-03-18 11:06:20

+0

target_form: target_form =(page /:form).find {| elem | elem ['id'] =='formid'} – Newbie 2010-03-18 11:20:46

+0

您應該使用'Mechanize :: Page#form_with'方法來獲取表單。順便說一句,我不確定你的頁面是不是「Mechanize :: Page」。 – 2010-03-18 11:51:20

回答

5

問題發生因爲使用機械化頁面作爲Nokogiri文檔(通過調用/方法或searchxpath等)將返回Nokogiri元素,而不是Mechanize元素及其特殊方法。

正如在評論中指出的那樣,您可以通過使用form_with方法來確保獲得Mechanize::Form來代替您的表單。

但是,有時您可以使用Nokogiri找到您想要的元素,但不能使用Mechanize。例如,考慮一個<select>元素不在<form>內的頁面。由於沒有表單,因此無法使用Mechanize field_with方法查找選擇並獲取Mechanize::Form::SelectList實例。

如果你有一個Nokogiri元素並且你想要Mechanize等價物,你可以通過將Nokogiri元素傳遞給構造函數來創建它。例如:

sel = Mechanize::Form::SelectList.new(page.at_xpath('//select[@name="city"]')) 

在你的情況下,你有一個Nokogiri::XML::Element,想一個Mechanize::Form

# Find the xml element 
target_form = (page/:form).find{ |elem| elem['id'] == 'formid'} 
target_form = Mechanize::Form.new(target_form) 

附:上面的第一行更簡單地通過target_form = page.at_css('#formid')實現。

+0

要真正能夠提交表單,您必須將最後一行更改爲'target_form = Mechanize :: Form.new(target_form,mech_object,page)' – raphinesse 2012-02-05 13:52:01

+0

@raphinesse哦?你的話我記住了。什麼是「mech_object」對象? – Phrogz 2012-02-05 14:18:39

+0

您的'代理','機械化'對象。有關更多詳細信息,請參閱[機械化::表單#新文檔](http://mechanize.rubyforge.org/Mechanize/Form.html#method-c-new)。如果你看看[Mechanize :: Form#submit的源代碼](http://mechanize.rubyforge.org/Mechanize/Form.html#method-i-submit),你會注意到它試圖調用'@mech .submit'在沒有提供'mech'參數時會失敗。我猜想'page'參數也是如此。 – raphinesse 2012-02-05 14:35:49

相關問題