Force Selenium ждет AngularJS

Как я могу заставить python Selenium ждать секунду, пока AngularJS не завершит парсинг страниц и не загрузит некоторые вещи, которые ему нужны.

Или как я могу заставить Selenium ждать 1 секунду после нажатия кнопки, что вызывает запрос ajax на сервер, обрабатываемый AngularJS. Мне нужно выполнить действия на стороне сервера, прежде чем переходить на другую страницу.

  • Как посмотреть сеанс xvfb, находящийся внутри докера на удаленном сервере, из моего локального браузера?
  • Запуск Selenium Webdriver с прокси-сервером в Python
  • Ожидаемые условия селена - можно использовать «или»?
  • webdriver ждет появления одного из нескольких элементов
  • Ошибка Webdriver: «Отсутствует предупреждение» после того, как UnexpectedAlertPresentException выбрано
  • Загрузка файла Selenium оставляет окно выбора файла открытым (OS / X и Python)
  • Выбрать -> абстракция опции
  • Прокрутка селена до нижней части не работает должным образом
  • 2 Solutions collect form web for “Force Selenium ждет AngularJS”

    Доступ к областям AngularJS через Selenium – скорее всего, это состояние уже проведено в Scope / IsolatedScope.

    Я создал несколько расширений, чтобы помочь с этим, что можно перевести на python.

    webDriver.NgWaitFor(productDiv, "scope.Data.Id != 0"); webDriver.NgWaitFor(partialElement, "scope.IsBusyLoadingTemplate == false"); 

    https://github.com/leblancmeneses/RobustHaven.IntegrationTests/blob/master/NgExtensions/NgWebDriverExtensions.cs

    для работы с ajax-запросом, когда вы работаете с обоими angularjs $ http и jquery, которые я использую:

     webDriver.WaitFor("window.isBrowserBusy() == false"); 

    требует, чтобы вы настраивали перехваты как в angularjs, так и в jquery для управления подсчетом запросов xhr.

    Вот структура, которую мы используем в нашем проекте: (вы можете извлечь из нее больше деталей)

    https://github.com/leblancmeneses/RobustHaven.IntegrationTests

    У меня была такая же проблема, как я ее решил

     from datetime import datetime, timedelta from time import sleep from selenium import webdriver from selenium.common.exceptions import WebDriverException class MyDriver(webdriver.Chrome): def __init__(self, executable_path="chromedriver", port=0, chrome_options=None, service_args=None, desired_capabilities=None, service_log_path=None): super().__init__(executable_path, port, chrome_options, service_args, desired_capabilities, service_log_path) def wait_until_angular(self, seconds: int = 10) -> None: java_script_to_load_angular = "var injector = window.angular.element('body').injector(); " \ "var $http = injector.get('$http');" \ "return ($http.pendingRequests.length === 0);" end_time = datetime.utcnow() + timedelta(seconds=seconds) print("wait for Angular Elements....") while datetime.utcnow() < end_time: try: if self.execute_script(java_script_to_load_angular): return except WebDriverException: continue sleep(0.1) raise TimeoutError("waiting for angular elements for too long") 

    Это сработало для меня. Надеюсь, это поможет вам !!!

    Python - лучший язык программирования в мире.