Watir wait_until_present 超时而不是返回 false
Watir wait_until_present times out instead of returning false
我对使用 Watir 进行测试还是个新手,但我一直在阅读有关 waiting with Watir 的所有内容,但我找不到解决问题的方法。
基本上我希望 wait_while_present
和 wait_until_present
在页面加载时工作。当我意识到两者都超时时,我尝试使用 element.present?
编写我自己的简陋版本,但那也超时了。我认为这可能是当前版本的 watir-webdriver 的问题。
这是给我带来很多麻烦的测试示例:
def test_rows_per_page()
begin
browser.element(:id => 'moar-rows').when_present.click
browser.element(:id => 'loading').wait_while_present
assert_text = browser.element(:id => 'num-rows').text
browser.element(:id => 'less-rows').when_present.click
browser.element(:id => 'loading').wait_while_present
diff_text = browser.element(:id => 'num-rows').text
if !(assert_text.eql? diff_text)
screen_capture()
assert_passed()
else
screen_capture()
assert_failed()
end
rescue
screen_capture()
increment_failed() #this is how I know it's timing out
end
end
我尝试测试 puts load_element.present?(timeout=1)
,但它失败得更快。所以当元素不存在时 wait_until_present
不是 returning false。 如何将其设置为 return false?
我可能会尝试这个,这是对我一开始链接到的问题的回应,但我不确定它是否解决了我的问题:
Timeout::timeout(input_timeout=1) do
#Default webdriver command here
end
rescue Timeout::Error
raise TimeoutError
end
SO 不会让我 post 超过两个链接,因为我的声誉低得可怜,但 watir-webdriver 的源代码在 GitHub.
我忘了把显示超时的具体上下文放在一起:
def test_rows_per_page()
begin
browser.element(:id => 'moar-rows').when_present.click
loading_element = element(:id => 'loading')
#loading_element.wait_while_present
assert_text = browser.element(:id => 'num-rows').text
browser.element(:id => 'less-rows').when_present.click
#loading_element.wait_while_present
puts loading_element.present? #=> true
sleep 1
puts loading_element.present? #times out here
sleep 1
puts loading_element.present?
diff_text = browser.element(:id => 'num-rows').text
if !(assert_text.eql? diff_text)
screen_capture()
assert_passed()
else
screen_capture()
assert_failed()
end
rescue
screen_capture()
increment_failed() #this is how I know it's timing out
end
end
注释掉了rescue
块,这里是错误:
:in `eval': unknown error: Element is not clickable at point (550, 565). Other element would receive the click: <div id="loading-screen" class="loading-page-backdrop ng-scope" ng-if="pageLoading || gridLoading"></div>
(Selenium::WebDriver::Error::UnknownError)
(Session info: chrome=41.0.2272.76)
(Driver info: chromedriver=2.6.232908,platform=Mac OS X 10.10.2 x86_64)
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/response.rb:15:in `initialize'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/common.rb:59:in `new'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/common.rb:59:in `create_response'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/default.rb:66:in `request'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/common.rb:40:in `call'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/bridge.rb:640:in `raw_execute'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/bridge.rb:618:in `execute'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/bridge.rb:375:in `clickElement'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/common/element.rb:54:in `click'
from /Library/Ruby/Gems/2.0.0/gems/watir-webdriver-0.6.11/lib/watir-webdriver/elements/element.rb:132:in `click'
from /Library/Ruby/Gems/2.0.0/gems/watir-webdriver-0.6.11/lib/watir-webdriver/wait.rb:122:in `method_missing'
from /file.rb:208:in `rowsPerPage_next'
我将尝试 browser.div(:id => 'loading-screen').wait_while_present
看看是否可行。很难从加载页面 HTML 中提取 id
或 class
,因为它仅在加载时存在。 (我向开发人员询问了标识符,但我不喜欢打扰她太多。)
更多注释:
我的主要问题是,如果该元素不存在,wait_while_present
似乎不会继续。 这就是为什么我尝试使用 present?
,但是当元素不存在时,这也会超时而不是 returning false
。我宁愿让 Watir 版本按预期工作。
我已经尝试了 id
和 class
的两种加载方式 div 并且当 div 没有加载时它仍然超时而不是继续'现在。
如果相关的话,我目前有这些全局等待设置:
browser.driver.manage.timeouts.implicit_wait = 30
browser.driver.manage.timeouts.page_load = 30
Watir.default_timeout = 30
如果元素既存在又可见,present?
应该是 return true
,所以如果加载 div 不可见,那么它应该只是 return false
,对吧?即使它存在但被隐藏了?我真的试着自己解决这个问题。
请告诉我我疯了,有一些简单的方法可以解决这个问题,比如重新安装 Ruby 或其他东西。
我想我要放弃并离开sleep
s。
(忽略 class
和 id
名称在我的 post 中的随机变化。还有 snake_case
与 camelCase
。我没有以这种方式写。相信我已经成功地找到了有问题的 HTML 个元素。)
unknown error: Element is not clickable at point (550, 565).
Other element would receive the click: <div id="dashboard-loading-screen" class="loading-page-backdrop ng-scope"
ng-if="pageLoading || gridLoading"></div> (Selenium::WebDriver::Error::UnknownError) (Session info: chrome=41.0.2272.76)
这是让我发疯的整个测试的净化版本。我在调试模式下没有加载问题,因为当然当我调试时它有足够的时间加载,所以我不得不输入一堆 put
s 来找出它失败的那一行上。
另请注意,我并没有编写此测试的原始版本,我只是想让它正确断言。
def dashboard_rowsPerPage_next(targetRows)
begin
dashboard_rowsPerPage_internal(targetRows) #click drop-down to choose num of rows/page
browser.scroll.to :bottom
beforeRowsText = $browser.div(:class => 'grid-rows-of-label').when_present.text.split(" ", 4).last #page 1
#I put this instead of wait_while_present
if (puts browser.html.include?("loading-page-backdrop ng-scope"))
Watir::Wait.while { browser.html.include? "loading-page-backdrop ng-scope"}
end
puts 'a'
puts browser.html.include?("loading-page-backdrop ng-scope")
puts browser.html.include?("loading-page-backdrop ng-scope")
#here's where I get the error message
browser.span(:class, "k-icon k-i-arrow-e").when_present.click
puts 'b'
puts browser.html.include?("loading-page-backdrop ng-scope")
if (puts browser.html.include?("loading-page-backdrop ng-scope"))
Watir::Wait.while { browser.html.include? "loading-page-backdrop ng-scope"}
end
puts browser.html.include?("loading-page-backdrop ng-scope")
puts 'c'
puts browser.html.include?("loading-page-backdrop ng-scope")
browser.scroll.to :bottom
puts browser.html.include?("loading-page-backdrop ng-scope")
afterRowsText = browser.div(:class => 'grid-rows-of-label').when_present.text.split(" ", 4).last #page 2
puts 'd'
Watir::Wait.while { browser.html.include? "dashboard-loading-screen"}
if (!(beforeRowsText.eql? afterRowsText)) #page 2 text should not be the same as page 1 text
screenCapture()
assertPassed()
else
screenCapture()
assertFailed()
end
# rescue
# screenCapture()
# increment_failed()
end
end
所以我的输出是:(为清楚起见添加注释)
true #should wait while loading image is visible before puts 'a'
a
true #this means the loading page is still visible, while isn't working
true
unknown error: Element is not clickable at point (550, 565).
Other element would receive the click: <div id="dashboard-loading-screen" class="loading-page-backdrop ng-scope"
ng-if="pageLoading || gridLoading"></div> (Selenium::WebDriver::Error::UnknownError) (Session info: chrome=41.0.2272.76)
我检查了 beforeRowsText 和 afterRowsText 的值,它正在正确获取这些值。
所以我要这样做,因为我很虚弱:
def dashboard_rowsPerPage_next(targetRows)
begin
dashboard_rowsPerPage_internal(targetRows) #click drop-down to choose num of rows/page
browser.scroll.to :bottom
beforeRowsText = $browser.div(:class => 'grid-rows-of-label').when_present.text.split(" ", 4).last #page 1
sleep 10
browser.span(:class, "k-icon k-i-arrow-e").when_present.click
sleep 10
browser.scroll.to :bottom
afterRowsText = browser.div(:class => 'grid-rows-of-label').when_present.text.split(" ", 4).last #page 2
if (!(beforeRowsText.eql? afterRowsText)) #page 2 text should not be the same as page 1 text
screenCapture()
assertPassed()
else
screenCapture()
assertFailed()
end
rescue
screenCapture()
increment_failed()
end
end
等等,没关系。它适用于每页 25 行,但我在每页 50 行时遇到相同的错误。
看来您完全误解了等待函数的用途。我这么说是因为你说
My main issue is that wait_while_present doesn't seem to continue if
the element isn't present.
该行为是设计使然
虽然`.present?'方法 return 的 true 或 false(这是您对用 ruby 编写的以问号结尾的任何方法所期望的)这不是各种 'wait' 函数的工作方式。也不合理地假设它们 return 是对还是错,因为它们的方法名称不以问号结尾。
这些等待函数的目的是等待指定的持续时间达到预期条件应该或必须 manifest (与可能相反)然后继续,或者如果超时到期而条件未满足则引发错误。您可以:
- 等待元素出现
- 等待元素出现
- 等待条件变为真
- 等到条件变为假
使用这些方法进行同步时的假设是:如果超过超时,脚本将无法可靠地继续。因此,此时测试失败。
这种引发错误(又名异常)以使测试失败的业务几乎是所有语言中所有常见测试框架的标准行为。黄瓜、rspec、junit、minitest、nunit 等测试assertions/expectations 以同样的方式工作,如果断言失败,则会引发错误。框架 'catches' 错误,将详细信息记录为测试结果的一部分,失败 test/scenario 并继续下一个。如果在测试期间执行的任何方法失败,例如尝试单击不存在的按钮,则会引发错误并且测试失败。
对于您想要做的事情,要使用这些方法,您需要将异常处理代码中的等待调用包装到 'rescue' 如果方法最终引发错误,则错误或者编写您自己的方法在您想要等待一段时间以等待 可能 出现的情况下执行等待的方法,然后根据结果有条件地响应,而不是仅仅引发错误。
如果没有简单的方法知道客户端代码是否忙于更新页面、等待响应服务呼叫,或等待用户输入。对此没有约定,也没有标准的方法来判断是哪种情况。如果你很幸运,或者你的程序员关心测试能力,那么他们可能会帮助你解决一些问题,你可以用它来确定是哪种情况。例如,许多网站都有一个微调器图标,每当客户端代码忙于更新页面或从服务器获取数据时,它们就会显示该图标,然后您可以使用该元素的可见性来了解您的代码何时需要等待或何时可以安全地继续.
请记住,这些方法可以使用参数来设置超时,并且在某些情况下错误消息..利用它可以大大提高您的故障排除能力..
例如,如果您有一个非常可靠的微调器,您可以做这样的事情来等待最多 3 秒让它出现,然后最多 10 秒让它消失
b.element(:id => 'loading').wait_until_present(timeout=3)
b.element(:id => 'loading').wait_while_present(timeout=10)
如果我们希望在微调器从未出现时不会失败,并且继续前进,但如果它出现的时间超过 10 秒就会失败,那么您可以像这样[=14]做一些基本的exception handling =]
begin
b.element(:id => 'loading').wait_until_present(timeout=3)
rescue
puts "waited three seconds without seeing spinner"
end
b.element(:id => 'loading').wait_while_present(timeout=10)
如果无法访问您正在测试的页面,其他任何人都很难就如何以一种仍然高效的稳健方式将您的代码与该页面同步提出具体建议。
我正在学习 ruby/watir/cucumber,我也想要等待,如果超时只会给我 False。
我想等待大约 10 秒的弹出窗口出现与否,然后继续代码。例如,如果弹出窗口在不到一秒内出现,则使用 sleep 10 是一种很大的浪费。作为初学者,我发现最好的方法是使用 If 块。我检查元素是否存在,如果不存在,我再等 3 秒。最多 9 秒。它解决了我的问题。
示例:我想检查是否出现带有单词 "Success" 的弹出窗口。如果是,它会打印 "Passed"。如果在 9 秒内没有出现,则打印 "Failed".
if $browser.element(:text => "Success").exists? == False
sleep 3
end
if $browser.element(:text => "Success").exists? == False
sleep 3
end
if $browser.element(:text => "Success").exists? == False
sleep 3
end
if $browser.element(:text => "Success").exists? == False
puts "Failed"
end
if $browser.element(:text => "Success").exists?
puts "Passed"
end
test continues
也许这会有所帮助!
我对使用 Watir 进行测试还是个新手,但我一直在阅读有关 waiting with Watir 的所有内容,但我找不到解决问题的方法。
基本上我希望 wait_while_present
和 wait_until_present
在页面加载时工作。当我意识到两者都超时时,我尝试使用 element.present?
编写我自己的简陋版本,但那也超时了。我认为这可能是当前版本的 watir-webdriver 的问题。
这是给我带来很多麻烦的测试示例:
def test_rows_per_page()
begin
browser.element(:id => 'moar-rows').when_present.click
browser.element(:id => 'loading').wait_while_present
assert_text = browser.element(:id => 'num-rows').text
browser.element(:id => 'less-rows').when_present.click
browser.element(:id => 'loading').wait_while_present
diff_text = browser.element(:id => 'num-rows').text
if !(assert_text.eql? diff_text)
screen_capture()
assert_passed()
else
screen_capture()
assert_failed()
end
rescue
screen_capture()
increment_failed() #this is how I know it's timing out
end
end
我尝试测试 puts load_element.present?(timeout=1)
,但它失败得更快。所以当元素不存在时 wait_until_present
不是 returning false。 如何将其设置为 return false?
我可能会尝试这个,这是对我一开始链接到的问题的回应,但我不确定它是否解决了我的问题:
Timeout::timeout(input_timeout=1) do
#Default webdriver command here
end
rescue Timeout::Error
raise TimeoutError
end
SO 不会让我 post 超过两个链接,因为我的声誉低得可怜,但 watir-webdriver 的源代码在 GitHub.
我忘了把显示超时的具体上下文放在一起:
def test_rows_per_page()
begin
browser.element(:id => 'moar-rows').when_present.click
loading_element = element(:id => 'loading')
#loading_element.wait_while_present
assert_text = browser.element(:id => 'num-rows').text
browser.element(:id => 'less-rows').when_present.click
#loading_element.wait_while_present
puts loading_element.present? #=> true
sleep 1
puts loading_element.present? #times out here
sleep 1
puts loading_element.present?
diff_text = browser.element(:id => 'num-rows').text
if !(assert_text.eql? diff_text)
screen_capture()
assert_passed()
else
screen_capture()
assert_failed()
end
rescue
screen_capture()
increment_failed() #this is how I know it's timing out
end
end
注释掉了rescue
块,这里是错误:
:in `eval': unknown error: Element is not clickable at point (550, 565). Other element would receive the click: <div id="loading-screen" class="loading-page-backdrop ng-scope" ng-if="pageLoading || gridLoading"></div>
(Selenium::WebDriver::Error::UnknownError)
(Session info: chrome=41.0.2272.76)
(Driver info: chromedriver=2.6.232908,platform=Mac OS X 10.10.2 x86_64)
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/response.rb:15:in `initialize'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/common.rb:59:in `new'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/common.rb:59:in `create_response'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/default.rb:66:in `request'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/http/common.rb:40:in `call'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/bridge.rb:640:in `raw_execute'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/bridge.rb:618:in `execute'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/remote/bridge.rb:375:in `clickElement'
from /Library/Ruby/Gems/2.0.0/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/common/element.rb:54:in `click'
from /Library/Ruby/Gems/2.0.0/gems/watir-webdriver-0.6.11/lib/watir-webdriver/elements/element.rb:132:in `click'
from /Library/Ruby/Gems/2.0.0/gems/watir-webdriver-0.6.11/lib/watir-webdriver/wait.rb:122:in `method_missing'
from /file.rb:208:in `rowsPerPage_next'
我将尝试 browser.div(:id => 'loading-screen').wait_while_present
看看是否可行。很难从加载页面 HTML 中提取 id
或 class
,因为它仅在加载时存在。 (我向开发人员询问了标识符,但我不喜欢打扰她太多。)
更多注释:
我的主要问题是,如果该元素不存在,wait_while_present
似乎不会继续。 这就是为什么我尝试使用 present?
,但是当元素不存在时,这也会超时而不是 returning false
。我宁愿让 Watir 版本按预期工作。
我已经尝试了 id
和 class
的两种加载方式 div 并且当 div 没有加载时它仍然超时而不是继续'现在。
如果相关的话,我目前有这些全局等待设置:
browser.driver.manage.timeouts.implicit_wait = 30
browser.driver.manage.timeouts.page_load = 30
Watir.default_timeout = 30
如果元素既存在又可见,present?
应该是 return true
,所以如果加载 div 不可见,那么它应该只是 return false
,对吧?即使它存在但被隐藏了?我真的试着自己解决这个问题。
请告诉我我疯了,有一些简单的方法可以解决这个问题,比如重新安装 Ruby 或其他东西。
我想我要放弃并离开sleep
s。
(忽略 class
和 id
名称在我的 post 中的随机变化。还有 snake_case
与 camelCase
。我没有以这种方式写。相信我已经成功地找到了有问题的 HTML 个元素。)
unknown error: Element is not clickable at point (550, 565).
Other element would receive the click: <div id="dashboard-loading-screen" class="loading-page-backdrop ng-scope"
ng-if="pageLoading || gridLoading"></div> (Selenium::WebDriver::Error::UnknownError) (Session info: chrome=41.0.2272.76)
这是让我发疯的整个测试的净化版本。我在调试模式下没有加载问题,因为当然当我调试时它有足够的时间加载,所以我不得不输入一堆 put
s 来找出它失败的那一行上。
另请注意,我并没有编写此测试的原始版本,我只是想让它正确断言。
def dashboard_rowsPerPage_next(targetRows)
begin
dashboard_rowsPerPage_internal(targetRows) #click drop-down to choose num of rows/page
browser.scroll.to :bottom
beforeRowsText = $browser.div(:class => 'grid-rows-of-label').when_present.text.split(" ", 4).last #page 1
#I put this instead of wait_while_present
if (puts browser.html.include?("loading-page-backdrop ng-scope"))
Watir::Wait.while { browser.html.include? "loading-page-backdrop ng-scope"}
end
puts 'a'
puts browser.html.include?("loading-page-backdrop ng-scope")
puts browser.html.include?("loading-page-backdrop ng-scope")
#here's where I get the error message
browser.span(:class, "k-icon k-i-arrow-e").when_present.click
puts 'b'
puts browser.html.include?("loading-page-backdrop ng-scope")
if (puts browser.html.include?("loading-page-backdrop ng-scope"))
Watir::Wait.while { browser.html.include? "loading-page-backdrop ng-scope"}
end
puts browser.html.include?("loading-page-backdrop ng-scope")
puts 'c'
puts browser.html.include?("loading-page-backdrop ng-scope")
browser.scroll.to :bottom
puts browser.html.include?("loading-page-backdrop ng-scope")
afterRowsText = browser.div(:class => 'grid-rows-of-label').when_present.text.split(" ", 4).last #page 2
puts 'd'
Watir::Wait.while { browser.html.include? "dashboard-loading-screen"}
if (!(beforeRowsText.eql? afterRowsText)) #page 2 text should not be the same as page 1 text
screenCapture()
assertPassed()
else
screenCapture()
assertFailed()
end
# rescue
# screenCapture()
# increment_failed()
end
end
所以我的输出是:(为清楚起见添加注释)
true #should wait while loading image is visible before puts 'a'
a
true #this means the loading page is still visible, while isn't working
true
unknown error: Element is not clickable at point (550, 565).
Other element would receive the click: <div id="dashboard-loading-screen" class="loading-page-backdrop ng-scope"
ng-if="pageLoading || gridLoading"></div> (Selenium::WebDriver::Error::UnknownError) (Session info: chrome=41.0.2272.76)
我检查了 beforeRowsText 和 afterRowsText 的值,它正在正确获取这些值。
所以我要这样做,因为我很虚弱:
def dashboard_rowsPerPage_next(targetRows)
begin
dashboard_rowsPerPage_internal(targetRows) #click drop-down to choose num of rows/page
browser.scroll.to :bottom
beforeRowsText = $browser.div(:class => 'grid-rows-of-label').when_present.text.split(" ", 4).last #page 1
sleep 10
browser.span(:class, "k-icon k-i-arrow-e").when_present.click
sleep 10
browser.scroll.to :bottom
afterRowsText = browser.div(:class => 'grid-rows-of-label').when_present.text.split(" ", 4).last #page 2
if (!(beforeRowsText.eql? afterRowsText)) #page 2 text should not be the same as page 1 text
screenCapture()
assertPassed()
else
screenCapture()
assertFailed()
end
rescue
screenCapture()
increment_failed()
end
end
等等,没关系。它适用于每页 25 行,但我在每页 50 行时遇到相同的错误。
看来您完全误解了等待函数的用途。我这么说是因为你说
My main issue is that wait_while_present doesn't seem to continue if the element isn't present.
该行为是设计使然
虽然`.present?'方法 return 的 true 或 false(这是您对用 ruby 编写的以问号结尾的任何方法所期望的)这不是各种 'wait' 函数的工作方式。也不合理地假设它们 return 是对还是错,因为它们的方法名称不以问号结尾。
这些等待函数的目的是等待指定的持续时间达到预期条件应该或必须 manifest (与可能相反)然后继续,或者如果超时到期而条件未满足则引发错误。您可以:
- 等待元素出现
- 等待元素出现
- 等待条件变为真
- 等到条件变为假
使用这些方法进行同步时的假设是:如果超过超时,脚本将无法可靠地继续。因此,此时测试失败。
这种引发错误(又名异常)以使测试失败的业务几乎是所有语言中所有常见测试框架的标准行为。黄瓜、rspec、junit、minitest、nunit 等测试assertions/expectations 以同样的方式工作,如果断言失败,则会引发错误。框架 'catches' 错误,将详细信息记录为测试结果的一部分,失败 test/scenario 并继续下一个。如果在测试期间执行的任何方法失败,例如尝试单击不存在的按钮,则会引发错误并且测试失败。
对于您想要做的事情,要使用这些方法,您需要将异常处理代码中的等待调用包装到 'rescue' 如果方法最终引发错误,则错误或者编写您自己的方法在您想要等待一段时间以等待 可能 出现的情况下执行等待的方法,然后根据结果有条件地响应,而不是仅仅引发错误。
如果没有简单的方法知道客户端代码是否忙于更新页面、等待响应服务呼叫,或等待用户输入。对此没有约定,也没有标准的方法来判断是哪种情况。如果你很幸运,或者你的程序员关心测试能力,那么他们可能会帮助你解决一些问题,你可以用它来确定是哪种情况。例如,许多网站都有一个微调器图标,每当客户端代码忙于更新页面或从服务器获取数据时,它们就会显示该图标,然后您可以使用该元素的可见性来了解您的代码何时需要等待或何时可以安全地继续.
请记住,这些方法可以使用参数来设置超时,并且在某些情况下错误消息..利用它可以大大提高您的故障排除能力..
例如,如果您有一个非常可靠的微调器,您可以做这样的事情来等待最多 3 秒让它出现,然后最多 10 秒让它消失
b.element(:id => 'loading').wait_until_present(timeout=3)
b.element(:id => 'loading').wait_while_present(timeout=10)
如果我们希望在微调器从未出现时不会失败,并且继续前进,但如果它出现的时间超过 10 秒就会失败,那么您可以像这样[=14]做一些基本的exception handling =]
begin
b.element(:id => 'loading').wait_until_present(timeout=3)
rescue
puts "waited three seconds without seeing spinner"
end
b.element(:id => 'loading').wait_while_present(timeout=10)
如果无法访问您正在测试的页面,其他任何人都很难就如何以一种仍然高效的稳健方式将您的代码与该页面同步提出具体建议。
我正在学习 ruby/watir/cucumber,我也想要等待,如果超时只会给我 False。 我想等待大约 10 秒的弹出窗口出现与否,然后继续代码。例如,如果弹出窗口在不到一秒内出现,则使用 sleep 10 是一种很大的浪费。作为初学者,我发现最好的方法是使用 If 块。我检查元素是否存在,如果不存在,我再等 3 秒。最多 9 秒。它解决了我的问题。
示例:我想检查是否出现带有单词 "Success" 的弹出窗口。如果是,它会打印 "Passed"。如果在 9 秒内没有出现,则打印 "Failed".
if $browser.element(:text => "Success").exists? == False
sleep 3
end
if $browser.element(:text => "Success").exists? == False
sleep 3
end
if $browser.element(:text => "Success").exists? == False
sleep 3
end
if $browser.element(:text => "Success").exists? == False
puts "Failed"
end
if $browser.element(:text => "Success").exists?
puts "Passed"
end
test continues
也许这会有所帮助!