Я все еще новичок в тестировании с Watir, но я читал повсюду около waiting with Watir, и я не могу найти решение моей проблемы.Watir wait_until_present times out вместо того, чтобы возвращать false
В основном я хочу wait_while_present
и wait_until_present
работать, когда страница загружается. Когда я понял, что оба тайм-аута, я попытался написать свою собственную janky версию, используя 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
не возвращает false, когда элемент отсутствует. Как мне вернуть false?
Я мог бы попробовать это, что в ответ на вопрос, который я связан с в самом начале, но я не уверен, если он решает мою проблему:
Timeout::timeout(input_timeout=1) do
#Default webdriver command here
end
rescue Timeout::Error
raise TimeoutError
end
SO не будет препятствовать мне сообщение более двух ссылок с моей патетически низкой репутацией, но исходный код для 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'
Я m собирается попробовать browser.div(:id => 'loading-screen').wait_while_present
, чтобы узнать, работает ли это. Трудно было вытащить либо id
, либо class
с HTML-страницы загрузки, поскольку она присутствует только во время загрузки. (Я спросил проявитель для идентификаторов, но мне не нравится подслушивания ее слишком много.)
Дополнительные примечания:
Моя главная проблема в том, что wait_while_present
, кажется, не продолжать, если элемент ISN Нет. Вот почему я попробовал написать свою собственную janky версию, используя present?
, но это также время ожидания, а не возвращение 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) ', и он терпит неудачу после любого периода времени, который я установил для таймаута. –
Я добавил еще один блок кода для большего контекста. –