我在几个月前写了这个脚本,它运行得很好。然而,昨晚有一个问题,页面永远不会加载,只会永远旋转。我的脚本只是超时了。我需要添加代码来测试页面是否在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种不同的方法,但我所做的似乎都不起作用。
发布于 2017-11-01 02:24:31
因此,虽然等待方法有一个默认的超时,但settable thusly: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时会检查浏览器的状态,一旦加载了初始页面内容,浏览器状态就会“就绪”,而且通常发生得非常快,因为现在的内容通常都是静态的,缓存的,并由when服务器快速提供服务。基本上,这就是加载web1.0网页的时间。
通常,现代的“web2.0”页面有很多脚本和AJAX/REST风格的交互,这些通常是所有页面内容显示所必需的。当页面大部分是空白时,浏览器报告“就绪”的情况并不少见,因为其余内容是通过REST或GRAPHQL请求拉入的。不幸的是,没有一种标准的方法来判断浏览器是否因为脚本而忙于发出进一步的请求。
最标准的做法是等待给定的时间,等待特定条件为真,通常是最后加载/呈现的内容之一出现在页面上。wait方法接受timeout参数,因此您可以按照以下方式执行某些操作
b.goto 'www.mysite.com'
Watir::Wait.until(timeout=30) { browser.text_field(name: 'username').exists? }Watir::Wait.until方法(rubydocs here)也接受一个自定义消息,如果您想要提供一个这样的消息,以便更容易知道什么在失败时超时。
https://stackoverflow.com/questions/47041056
复制相似问题