Я использую следующий код, основанный на этом blogpost (последний раздел):
from selenium.webdriver.support.expected_conditions import staleness_of
from selenium.webdriver.support.ui import WebDriverWait
@contextmanager
def wait_for_page_load(self, timeout=15):
old_page = self.driver.find_element_by_tag_name('html')
yield
WebDriverWait(self.driver, timeout).until(staleness_of(old_page))
, где self.driver
- объект селенового веб-драйвера.
Этот диспетчер контекста может затем использоваться в блоке with
:
def click_on_the_link():
with self.wait_for_page_load():
self.driver.find_element_by_link_text('a link')
Насколько я понял, старая страница сохраняется, и, если новая страница еще не загружена, создается объект WebDriverWait, который ждет загрузки сайта, прежде чем продолжить. Затем выполняются действия на новой странице, например, нажав на ссылку.
Однако код не имеет смысла для меня. Согласно документации :
В тот момент, когда генератор дает результат, выполняется блок, вложенный в оператор with. Затем генератор возобновляется после выхода из блока.
Если код в блоге верен, как метод может ожидать загрузки сайта, если код внутри оператора with
выполняется первым?