簡體   English   中英

Ruby和Watir-測試頁面加載

[英]Ruby and Watir - testing for page load

幾個月前,我寫了這個腳本,並且運行良好。 但是,昨晚遇到了一個問題,該頁面永遠不會加載並且永遠旋轉。 我的腳本剛剛超時。 我需要添加代碼以測試頁面是否在30秒內完全加載,並且是否不以狀態2和正確的消息退出。 這是我的代碼:

#-------------------------------------------------------------#
# 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

我剛剛花了最后3個小時來搜索和閱讀,並嘗試了20多種不同的東西,但我似乎沒有做任何事情。

因此,雖然wait方法具有默認超時,因此可以設置為默認超時: Watir.default_timeout = 30但看來Watir.default_timeout = 30方法在Watir本身中沒有這樣的設置。 但是,由於這只是調用webdriver的navigation.to方法,並且webdriver中有一個可設置的超時,因此您可以在嘗試轉到頁面之前使用watir的.driver方法進行設置。 您應該可以如下設置

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

在您的情況下,由於是失敗的初始負載,因此應該為您工作,如果您不喜歡默認錯誤消息,則可以進行挽救並提供您自己的服務。

但是,在大多數情況下,我發現延遲通常是由於REST服務緩慢或過載造成的,因此,如果延遲是由后續的AJAX調用引起的,那么僅在goto之前進行設置通常是不夠的。 使用goto時要檢查的是瀏覽器狀態,一旦加載了初始頁面內容,該狀態就會“准備就緒”,並且這種情況通常很快發生,因為如今這些內容通常都是靜態的,由Web服務器緩存和快速提供的。 基本上是時候加載Web 1.0網頁了。

通常,現代的“ Web 2.0”頁面具有許多腳本和AJAX / REST樣式的交互,這些交互通常是所有頁面內容出現所必需的。 當頁面大部分為空白時,瀏覽器報告“就緒”的情況並不少見,因為其余內容是通過REST或GRAPHQL請求提取的。 不幸的是,沒有一種標准的方法可以判斷瀏覽器是否由於腳本而忙於進一步發出請求。

最標准的操作是在給定的時間量內等待特定條件的成立,通常情況是頁面上出現的某些內容是最后加載/呈現的內容之一。 wait方法采用超時參數,因此您可以按照以下方式進行操作

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

如果您想提供一條消息,以便更輕松地知道失敗時超時的時間,則Watir :: Wait.until方法( 在此處 rubydocs)也接受一條自定義消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM