Я тоже сейчас сталкиваюсь с этой проблемой. Из моих использований это выглядит следующим образом:
@browser.click(selector, {:wait_for => :page})
Не совсем уверен, почему это так. Но кажется, что если вы делаете:
@browser.click(selector)
[maybe some stuff here too]
@browser.wait_for(:wait_for => :page)
Тогда вы можете ожидать страницу, которая уже была загружена (т. Е. Вы ждете вечно).
Я покопался в исходном коде Selenium и нашел этот слепок:
def click(locator, options={})
remote_control_command "click", [locator,]
wait_for options
end
...
# Waits for a new page to load.
#
# Selenium constantly keeps track of new pages loading, and sets a
# "newPageLoaded" flag when it first notices a page load. Running
# any other Selenium command after turns the flag to false. Hence,
# if you want to wait for a page to load, you must wait immediately
# after a Selenium command that caused a page-load.
#
# * 'timeout_in_seconds' is a timeout in seconds, after which this
# command will return with an error
def wait_for_page(timeout_in_seconds=nil)
remote_control_command "waitForPageToLoad",
[actual_timeout_in_milliseconds(timeout_in_seconds),]
end
alias_method :wait_for_page_to_load, :wait_for_page
По сути, это делает следующее:
@browser.click(selector)
@browser.wait_for(:wait_for => :page)
Однако, как говорится в комментарии, в первую очередь необходимо использовать команду: wait_for сразу после.
И, конечно ... переключение ордера переводит вас в одно и то же состояние ожидания навсегда.
@browser.wait_for(:wait_for => :page)
@browser.click(selector)
Не зная всех подробностей Selenium, кажется, что Selenium нужно зарегистрировать триггер: wait_for, когда он передается как опция с click . В противном случае вы могли бы в конечном итоге ждать вечно, если бы вы как-то приказали Selenium ждать в самый последний момент: вызывается wait_for.