【发布时间】:2015-05-11 00:44:58
【问题描述】:
我对使用 Watir 进行测试仍然是新手,但我一直在阅读有关 waiting with Watir 的所有内容,但找不到解决问题的方法。
基本上我希望wait_while_present 和wait_until_present 在页面加载时工作。当我意识到两者都超时时,我尝试使用 element.present? 编写我自己的 janky 版本,但也超时了。我认为这可能是当前版本的 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 在元素不存在时不会返回 false。 如何让它返回 false?
我可能会尝试这个,这是对我一开始链接的问题的回应,但我不确定它是否能解决我的问题:
Timeout::timeout(input_timeout=1) do
#Default webdriver command here
end
rescue Timeout::Error
raise TimeoutError
end
所以我不会让我发布两个以上的链接,因为我的声誉非常低,但 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? 编写我自己的 janky 版本,但这也是次当元素不存在时,而不是返回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? 应该返回 true 如果元素存在并且可见,所以如果加载 div 不可见,那么它应该只返回 false,对吗?即使它存在但被隐藏?我真的尝试过自己解决这个问题。
请告诉我我疯了,有一些简单的方法可以解决这个问题,比如重新安装 Ruby 之类的。
【问题讨论】:
-
你得到的超时错误是什么?如果脚本显示您调用
.present?的位置也会有所帮助。 -
当它超时时转到
rescue,所以我只是从increment_failed()得到输出。我注释掉了wait_while_present行并输入了puts load_element.present?(timeout=1),它在我为超时设置的任何时间长度后都失败了。 -
我添加了另一个代码块以获得更多上下文。
-
我认为在使用
rescue子句进行调试时需要小心。例如,load_element.present?(timeout=1)由于 ArgumentError 而进入救援子句,present?不接受任何参数,而不是因为超时。删除rescue(或至少捕获并输出异常)将使您能够查看实际的堆栈跟踪并更好地了解问题所在。 -
是的,我再次尝试后发现了超时问题。我注释掉了
rescue块,它抛出了一个错误,请给我一分钟清理并发布它。
标签: ruby testing watir watir-webdriver