Ruby和Watir - 测试页面加载

时间:2017-10-31 17:17:42

标签: ruby watir

我几个月前写过这个剧本,它一直很好用。然而,昨晚有一个问题,页面永远不会加载,只是永远旋转。我的脚本刚刚超时。我需要添加代码来测试页面是否在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种不同的东西,而我所做的一切似乎都没有用。

1 个答案:

答案 0 :(得分:0)

因此,虽然wait方法有一个默认的超时,因此可以设置:Watir.default_timeout = 30它似乎在Watir本身中没有这样的设置用于goto方法。但是因为这只是调用webdriver navigate.to方法,并且在webdriver中有一个可设置的超时,所以你可以在尝试转到页面之前使用watir的.driver方法设置它。你应该可以设置如下

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

在你的情况下,因为它是失败的初始加载,这应该适合你,如果你不喜欢默认的错误信息,你可以拯救并提供你自己的。

在大多数情况下,我已经看到,延迟通常是缓慢或过载的REST服务,所以如果延迟是随后的AJAX调用,那么在goto之前设置它通常是不够的。使用goto时检查的是浏览器状态,一旦加载了初始页面内容,它就会“准备好”,并且通常这种情况很快发生,因为这些天内容通常都是静态的,缓存的并且由网络服务器快速提供。基本上,这是加载Web 1.0网页的时间。

通常,现代的“web 2.0”页面有很多脚本和AJAX / REST样式的交互,这些交互通常是所有页面内容出现所必需的。当页面大部分空白时,浏览器报告“就绪”并不常见,因为其余内容是通过REST或GRAPHQL请求引入的。不幸的是,有一种标准方法可以判断浏览器是否因脚本而忙于进一步请求。

最标准的做法是等待特定条件的给定时间为真,通常在页面上出现的内容是最后加载/呈现的内容之一。等待方法采用超时参数,因此您可以沿着这些行执行某些操作

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

Watir :: Wait.until方法(rubydocs here)也接受自定义消息,如果您想提供一个自定义消息,以便更容易知道失败时的超时时间。