2017-10-31 5 views
0

나는이 스크립트를 몇 달 전에 작성했으며 잘 작동했습니다. 그러나 어젯밤에 페이지가로드되지 않고 영원히 계속 돌아가는 문제가있었습니다. 내 스크립트는 단지 시간 초과되었습니다. 페이지가 30 초 내에 완전히로드되는지, 2의 상태 및 적절한 메시지로 종료하지 않는지 테스트 할 코드를 추가해야합니다. 난 그냥 검색 최근 3 시간 동안 독서와 약 20 다른 일을 시도하고 난 듯 않았다 아무것도 작동하지해야Ruby와 Watir - 페이지로드에 대한 테스트

#-------------------------------------------------------------# 
# Watir Login to XXXX SSO Site 
# Written 2017-09-17 for ITC by Jim Clark 
#-------------------------------------------------------------# 
# the Watir controller 
require "watir" 
# set a variable 
#test_site = "https://oracle.pomeroy.com" 
test_site = "http://xxx.xxx" 
# open a browser 
browser = Watir::Browser.new :phantomjs 
#puts "Beginning of test: XXXX SSO Login." 
#puts " Step 1: go to the test site: " + test_site 
browser.goto test_site 
# Test if page fully loaded after 30 seconds, if not, exit with proper status and message 


# validate login site loads 
if browser.text.include? "Username" 
    #puts " Step 2: enter username and password text fields." 
    browser.text_field(:name, "username").set "xxxx" 
    browser.text_field(:name, "password").set "xxxx" 
    #puts " Step 3: click login" 
    browser.button(:text, "Login").click 
    if browser.text.include? "Logged In As XXXX" 
    puts "OK: Test Passed. Login worked!" 
    status = 0 
    else 
    puts "CRITICAL: Open a SEV1 - Test login failed!" 
    status = 2 
    end 
else 
    puts "CRITICAL: Open a SEV1 - Could not find login page!" 
    status = 2 
end 
browser.close 
exit status 

: 여기 내가 가지고있는 코드입니다.

+0

"스크립트가 시간 초과되었습니다"라고 말하면'browser.goto'를 호출 할 때 예외가 발생 했습니까? 그렇다면 예외를 구하고 지정된 상태로 종료 할 수 있습니까? –

+0

'browser.goto' 라인은 60 초 후에 타임 아웃되고 스크립트는 예외와 함께 종료됩니다. 나는 그것을 해결하기 위해 이런 짓을 : '(28) 할 browser.goto의 test_site 끝 전자 을두고 => 구조 시간 제한 : 시간 제한 시작 "중요! SEV1을 열고 - 페이지 결코로드"를 exit 2 end ' 최상의 방법이었고 의견이 열려있는 것보다 더 많은 것이 확실하지 않다. – BanditBBS

+0

루비에서는 항상 최선의 방법과 끝없는 잠재력을 가진 토론이 '최상의 방법'이라고 생각됩니다. 나는 이것이 당신을 위해 일하고 있다면 말할 것이고, 그 다음에 그것을 사용하십시오.기본 타임 아웃 오류로 인해 무엇이 잘못되었는지 알릴만큼 충분하지 않은 경우 할 일이 거의 있습니다. –

답변

0

그래서 wait 메소드가 기본 타임 아웃을 가지고있는 동안, 다음과 같이 설정할 수 있습니다 : Watir.default_timeout = 30 goto 메소드의 Watir 자체에는 그런 설정이 없습니다. 그러나이 메서드는 webdriver navigate.to 메서드를 호출하기 때문에 webdriver에서 설정할 수있는 시간 제한이 있습니다. 그러면 페이지 이동을 시도하기 전에 watir의 .driver 메서드를 사용하여 설정할 수 있습니다. 당신은 귀하의 경우에는

b.driver.manage.timeouts.page_load = 30 
b.goto 

를 다음과 같이이 당신을 위해 일한다고 실패 초기로드는 이후 있다고 할 수 설정해야하며, 기본 오류 메시지가 마음에 들지 않으면, 당신은 구조 및 제공 할 수 너 스스로.

대부분의 경우 지연은 REST 서비스가 느리거나 과부하 상태 인 경우가 많으므로 지연이 후속 AJAX 호출 인 경우 goto 이전의 설정만으로는 충분하지 않을 수 있습니다. goto를 사용할 때 점검되는 것은 브라우저 상태입니다. 초기 페이지 컨텐츠가로드되면 '준비 됨'상태가되며, 종종 웹 서버가 정적, 캐시 및 신속하게 제공하는 요즘과 같이 매우 빠르게 발생합니다 . 기본적으로 웹 1.0 웹 페이지를로드하는 시간입니다.

일반적으로 현대 '웹 2.0'페이지에는 모든 페이지 콘텐츠를 표시하는 데 필요한 대다수의 스크립트와 AJAX/REST 스타일 상호 작용이 있습니다. 나머지 콘텐츠가 REST 또는 GRAPHQL 요청을 통해 가져온 것처럼 페이지가 대부분 비어있는 경우 브라우저가 '준비'를보고하는 경우는 드뭅니다. 불행하게도 브라우저가 스크립트로 인해 추가 요청을하는 중일 때 알려주는 표준 방법은 없습니다.

가장 일반적인 방법은 특정 조건이 참이 될 때까지 일정 시간 동안 대기하는 것입니다. 일반적으로로드/렌더링 된 마지막 항목 중 하나 인 페이지에 나타납니다. 당신이하기 쉽도록 하나를 제공하려는 경우 대기 방법은 시간 제한 parameterss을, 그래서 당신은이 라인

b.goto 'www.mysite.com' 
Watir::Wait.until(timeout=30) { browser.text_field(name: 'username').exists? } 

Watir과 :: Wait.until 방법을 따라 뭔가를 할 수있는 (rubydocs는 here) 또한 사용자 정의 메시지를 받아 그것이 실패 할 때 시간 초과를 알아라.

+0

'Watir.default_timeout'은'b.goto'와 관련이 없으며,'b.goto' 시간 설정은 Watir.default_timeout에 의존하지 않습니다. 우리는 b.goto의 타이밍을 설정할 수 있지만, 다른 방법으로 할 수 있습니다. – RAJ

+0

beloto는 watir-classic을 사용하는 경우 시간을 반환하지 않습니다. 최근 watir을 사용하는 경우가 아니라 뒷면에 셀레늄을 사용하면 간단히로드 된 url을 반환합니다. – RAJ

+0

기본 대기 시간 초과가 대기 방법과 관련이 있다고 생각했지만 실제로 잘못되었습니다. 답변을 적절하게 수정했습니다. –