2011-09-15 12 views
9

के साथ टाइमआउट त्रुटियों को पकड़ना मेरे पास साइट से मुझे लॉग आउट करने के लिए एक मशीनीकरण फ़ंक्शन है लेकिन बहुत दुर्लभ अवसरों पर यह मुझे बाहर करता है। फ़ंक्शन में एक विशिष्ट पृष्ठ पर जाकर, और फिर लॉगआउट बटन पर क्लिक करना शामिल है। कभी-कभी मैकेनाइजेशन लॉगआउट पेज पर जाकर या लॉगआउट बटन पर क्लिक करते समय एक टाइमआउट पीड़ित होता है, कोड क्रैश हो जाता है। इसलिए मैंने एक छोटा बचाव किया और ऐसा लगता है कि कोड के पहले भाग के नीचे देखा गया है।रूबी मशीनीकरण

def logmeout(agent) 
    begin 
    page = agent.get('http://www.example.com/') 
    agent.click(page.link_with(:text => /Log Out/i)) 
    rescue Timeout::Error 
    puts "Timeout!" 
    retry 
    end 
end 

मान लिया जाये कि मैं बचाव सही ढंग से समझ है, यह है, भले ही बस क्लिक का समय समाप्त हो पर दोनों कार्यों करेंगे तो प्रयास में कुशल मैं कर रहा हूँ, तो सोच रहा था होना करने के लिए:

def logmeout(agent) 
    page = agent.get('http://www.example.com/') 
    agent.click(page.link_with(:text => /Log Out/i)) 
end  
बचाव के साथ

Logmeout मैं इस स्थिति में एक proc का उपयोग कर सकता हूं और इसे एक कोड ब्लॉक पास कर सकता हूं। इस काम की तरह कुछ होगा: मेरी trythreetimes समारोह में

def trythreetimes 
    tries = 0 
    begin 
    yield 
    rescue 
    tries += 1 
    puts "Trying again!" 
    retry if tries <= 3 
    end 
end 

def logmeout(agent) 
    trythreetimes {page = agent.get('http://www.example.com/')} 
    trythreetimes {agent.click(page.link_with(:text => /Log Out/i))} 
end 

नोट मैं सामान्य बचाव जहां उसे छोड़ा तो समारोह अधिक फिर से प्रयोग करने योग्य हो जाएगा।

कोई भी मदद प्रदान करने के लिए बहुत बहुत धन्यवाद, मुझे पता है कि यहां कुछ अलग प्रश्न हैं लेकिन वे सभी चीजें हैं जिन्हें मैं सीखने की कोशिश कर रहा हूं!

उत्तर

9

कुछ मशीनी अनुरोधों पर कुछ समय-समय पर पुनः प्रयास करने के बजाय मुझे लगता है कि आप Mechanize::HTTP::Agent::read_timeout को 2 या 5 जैसे उचित मात्रा में विशेषता निर्धारित करेंगे, वैसे भी जो इस अनुरोध के लिए टाइमआउट त्रुटियों को रोकता है।

फिर, ऐसा लगता है कि आपकी लॉग आउट प्रक्रिया केवल एक साधारण HTTP GET अनुरोध तक पहुंच की आवश्यकता है। मेरा मतलब है कि भरने के लिए कोई फॉर्म नहीं है इसलिए कोई HTTP पोस्ट अनुरोध नहीं है। तो यदि मैं आप थे, तो मैं आपके agent.click(page.link_with(:text => /Log Out/i)) तक पहुंचने वाले लिंक की पहचान करने के लिए पेज स्रोत कोड (फ़ायरफ़ॉक्स या क्रोम के साथ Ctrl + U) का निरीक्षण करना चाहूंगा क्योंकि यह तेज़ होना चाहिए क्योंकि इस प्रकार के पृष्ठ आमतौर पर खाली होते हैं और मेकेनाइजेशन को मेमोरी में एक पूर्ण एचटीएमएल वेब पेज लोड नहीं करना पड़ेगा।

def logmeout(agent) 
    begin 
    agent.read_timeout=2 #set the agent time out 
    page = agent.get('http://www.example.com/logout_url.php') 
    agent.history.pop() #delete this request in the history 
    rescue Timeout::Error 
    puts "Timeout!" 
    puts "read_timeout attribute is set to #{agent.read_timeout}s" if !agent.read_timeout.nil? 
    #retry  #retry is no more needed 
    end 
end 

लेकिन आप भी अपने पुन: प्रयास करें फ़ंक्शन का उपयोग कर सकते हैं::

def trythreetimes 
    tries = 0 
    begin 
    yield 
    rescue Exception => e 
    tries += 1 
    puts "Error: #{e.message}" 
    puts "Trying again!" if tries <= 3 
    retry if tries <= 3 
    puts "No more attempt!" 
    end 
end 

def logmeout(agent) 
    trythreetimes do 
    agent.read_timeout=2 #set the agent time out 
    page = agent.get('http://www.example.com/logout_url.php') 
    agent.history.pop()  #delete this request in the history 
    end 
end 

आशा है कि यह मदद करता है

यहाँ मैं उपयोग पसंद करेंगे कोड है! ;-)

+0

उत्तर के लिए धन्यवाद! आपका पसंदीदा कोड यह मान रहा है कि आपको स्रोत कोड के माध्यम से सही लिंक मिला है? – Sean

+0

अच्छा, एचटीएमएल स्रोत के अंदर एक लिंक खोजना वास्तव में मुश्किल नहीं है। मैं इस समाधान को पसंद करता हूं क्योंकि समय और स्मृति की आवश्यकता होती है। लेकिन आप अपने समाधान का उपयोग ['read_timeout'] (http://mechanize.rubyforge.org/Mechanize/HTTP/Agent.html#read_timeout=) सेट के साथ कर सकते हैं। यदि आप इसे एकाधिक डोमेन के लिए उपयोग करते हैं तो यह एक अच्छा विचार है। बस कोड की दूसरी शांति संपादित करें और इसे मुख्य पृष्ठ तक पहुंचने के लिए बदलें और यदि आप चाहें तो लिंक पर क्लिक करें। – cz3ch

+0

ओह क्षमा करें, मैंने वास्तव में आपके प्रश्न का उत्तर नहीं दिया। हां यह मान रहा है कि आपको स्रोत कोड के माध्यम से सही लिंक मिला है ... – cz3ch

0

मशीनीकरण 1.0.0 का उपयोग करके मुझे यह समस्या त्रुटि के एक अलग स्रोत से मिली।

मेरे मामले में मुझे प्रॉक्सी और फिर एसएसएल द्वारा अवरुद्ध कर दिया गया था। यह मेरे लिए काम करता है:

ag = Mechanize.new 
ag.set_proxy('yourproxy', yourport) 
ag.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
ag.get(url) 
संबंधित मुद्दे