2010-02-02 11 views
10

है एक public class method रूप.. नए क्षेत्र को जोड़ने का तरीका प्रपत्र मशीनीकरण के लिए (गहरे लाल रंग का/मशीनीकरण)

मैंने कोशिश की मशीनीकरण के लिए क्षेत्र को जोड़ने के लिए

#login_form.field.new('auth_login','Login') 
#login_form.field.new('auth_login','Login') 

और दोनों मुझे एक त्रुटि देता है undefined method "new" for #<WWW::Mechanize::Form::Field:0x3683cbc> (NoMethodError)

मैंने कोशिश की login_form.field.new('auth_login','Login') जो मुझे एक त्रुटि देता है

mechanize-0.9.3/lib/www/mechanize/page.rb:13 n `meta': undefined method `search' for nil:NilClass (NoMethodError) 

लेकिन उस समय मैं फॉर्म जमा करता हूं। क्षेत्र एचटीएमएल स्रोत में मौजूद नहीं है। मैं इसे जोड़ना चाहता हूं ताकि मेरी स्क्रिप्ट द्वारा पोस्ट की गई POST क्वेरी में auth_username=myusername&auth_password=mypassword&auth_login=Login अभी तक यह केवल auth_username=radek&auth_password=mypassword भेजता है, जिसके कारण मैं लॉग इन नहीं कर सकता। बस मेरा विचार।

स्क्रिप्ट लग रहा है

require 'rubygems' 
require 'mechanize' 
require 'logger' 

agent = WWW::Mechanize.new {|a| a.log = Logger.new("loginYOTA.log") } 
agent.follow_meta_refresh = true #Mechanize does not follow meta refreshes by default, we need to set that option. 

page = agent.get("http://www.somedomain.com/login?auth_successurl=http://www.somedomain.com/forum/yota?baz_r=1") 


login_form = page.form_with(:method => 'POST') 

puts login_form.buttons.inspect 
puts page.forms.inspect 
#STDIN.gets 

login_form.fields.each { |f| puts "#{f.name} : #{f.value}" }  

login_form['auth_username'] = 'radeks' 
login_form['auth_password'] = 'TestPass01' 

#login_form['auth_login'] = 'Login'  
#login_form.field.new('auth_login','Login') 
#login_form.field.new('auth_login','Login') 
#login_form.fields.each { |f| puts "#{f.name} : #{f.value}" } 
#STDIN.gets 

page = agent.submit login_form 


#Display welcome message if logged in 

puts page.parser.xpath("/html/body/div/div/div/table/tr/td[2]/div/strong").xpath('text()').to_s.strip 
    puts 
puts page.parser.xpath("/html/body/div/div/div/table/tr/td[2]/div").xpath('text()').to_s.strip 

output = File.open("login.html", "w") {|f| f.write(page.parser.to_html) } 

की तरह फार्म के .inspect लग रहा है

तरह
[#<WWW::Mechanize::Form 
{name nil} 
{method "POST"} 
{action 
    "http://www.somedomain.com/login?auth_successurl=http://www.somedomain.com/forum/yota?baz_r=1"} 
{fields 
    #<WWW::Mechanize::Form::Field:0x36946c0 @name="auth_username", @value=""> 
    #<WWW::Mechanize::Form::Field:0x369451c @name="auth_password", @value="">} 
{radiobuttons} 
{checkboxes} 
{file_uploads} 
{buttons 
    #<WWW::Mechanize::Form::Button:0x36943b4 
    @name="auth_login", 
    @value="Login">}> 
] 

उत्तर

10

मुझे लगता है कि आप जो खोज रहे हैं है

login_form.add_field!(field_name, value = nil) 

यहाँ डॉक्स हैं :

http://rdoc.info/projects/tenderlove/mechanize

इस और विधि के बीच अंतर WWW :: मैकेनाइज :: फॉर्म :: फ़ील्ड.न्यू इस तथ्य से अलग नहीं है कि फ़ॉर्म में फ़ील्ड जोड़ने के कई तरीके नहीं हैं। यहां बताया गया है कि add_field कैसे! विधि लागू की गई है .... आप देख सकते हैं कि यह वही है जो आप उम्मीद करेंगे। यह फ़ील्ड ऑब्जेक्ट को तुरंत चालू करता है, फिर इसे फ़ॉर्म के 'फ़ील्ड्स' सरणी में जोड़ता है। आप इसे अपने कोड में नहीं कर पाएंगे क्योंकि विधि "फ़ील्ड < <" फ़ॉर्म "के अंदर एक निजी विधि है।

login_form['field_name']='value' 

आशा इस मदद करता है:

# File lib/www/mechanize/form.rb, line 65 
    def add_field!(field_name, value = nil) 
    fields << Field.new(field_name, value) 
    end 

एक तरफ ध्यान दें पर, डॉक्स के अनुसार आप पहली भिन्नता आप प्रस्तावित करने के लिए सक्षम होना चाहिए! काम करता है:

+0

@btelles पोस्टिंग के समय में करने के लिए इतना है! तो आपके कोड और http://mechanize.rubyforge.org/mechanize/WWW/Mechanize/Form/Field.html सार्वजनिक विधि वर्ग फ़ील्ड के लिए नया क्या अंतर है? – Radek

+0

मैंने सोचा कि 'login_form [' field_name '] =' value'' काम नहीं करता है क्योंकि मैं फ़ील्ड जोड़ने और संशोधित करने की कोशिश नहीं कर रहा था। हो सकता है कि कोई इस बारे में विस्तार कर सके कि अगर उसके बारे में कोई और जानकारी है। – Radek

+2

यदि आप [] = विधि के लिए "शो स्रोत" पर क्लिक करते हैं, तो आप देखेंगे कि कार्यान्वयन एक फ़ील्ड बनाता है यदि कोई "add_field" चलाकर पहले से मौजूद नहीं है! तरीका। यह कहता है "क्या एक क्षेत्र पहले से ही उस नाम से मौजूद है?" यदि नहीं, तो "add_field! (field_name, value)" ... – btelles

5

एक और तरीका है नए क्षेत्र को जोड़ने का तरीका प्रपत्र

page = agent.post(url, {'auth_username'=>'myusername', #existing field 
         'auth_password'=>'mypassword', #existing field 
         'auth_login'=>'Login'}) #new field 
संबंधित मुद्दे