2011-09-15 9 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와 같은 적절한 시간 (두 번째 또는 5 초)으로 설정하는 것이 좋습니다. 어쨌든이 요청에 대한 시간 초과 오류를 방지하는 것이 좋습니다.

다음에, 로그 아웃 절차는 간단한 HTTP GET 요청에 대한 액세스를 요구하는 것이의를 보인다. HTTP POST 요청이 없도록 입력 할 양식이 없다는 의미입니다. 그래서 내가 당신이라면 그것은 페이지의 이러한 유형은 일반적으로 비어 있기 때문에 빨리해야 당신의 agent.click(page.link_with(:text => /Log Out/i)) 에 의해 도달 할 때 링크를 식별하기 위해, 나는 페이지의 소스 코드 (파이어 폭스 나 크롬 Ctrl 키 + U)를 검사 prefere 것이며, Mechanize는 전체 html 웹 페이지를 메모리에로드 할 필요가 없습니다.

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

글쎄, HTML 소스 내부에서 링크를 찾는 것이 어렵지 않습니다. 시간과 메모리가 필요하기 때문에이 솔루션을 선호합니다. [read_timeout] (http://mechanize.rubyforge.org/Mechanize/HTTP/Agent.html#read_timeout=) 세트로 솔루션을 사용할 수 있습니다. 여러 도메인에 사용하는 것이 좋습니다. 두 번째 코드를 수정하고 기본 페이지에 액세스하고 원하는 경우 링크를 클릭하기 위해 코드를 변경하십시오. – cz3ch

+0

오, 죄송합니다. 사실 귀하의 질문에 답변하지 않았습니다. 예, 소스 코드를 통해 올바른 링크를 찾았다 고 가정합니다 ... – cz3ch

0

1.0.0 기계화 사용 나는 오류의 다른 소스에서이 문제가있어.

내 경우 프록시와 SSL에 의해 차단되었습니다. 이것은 나를 위해 일한 :

ag = Mechanize.new 
ag.set_proxy('yourproxy', yourport) 
ag.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
ag.get(url)