diff --git a/src/browser.py b/src/browser.py index 2d7caa73..ed04078b 100644 --- a/src/browser.py +++ b/src/browser.py @@ -9,14 +9,17 @@ import time import traceback from typing import Any, cast +from urllib import parse import selenium from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.webdriver import WebDriver as ChromeWebDriver +from selenium.webdriver.common.by import By from selenium.webdriver.firefox.options import Options as FirefoxOptions from selenium.webdriver.firefox.service import Service as FirefoxService from selenium.webdriver.firefox.webdriver import WebDriver as FirefoxWebDriver +from selenium.webdriver.remote.webelement import WebElement from config import Config @@ -91,9 +94,29 @@ def get(self, url: str) -> bool: logger.info('%i attempts failed to .get: %s', attempts + 1, url) return False + return self.__ensure_loaded() + + def __ensure_loaded(self) -> bool: + """Ensure the page had been loaded.""" # Delay to allow page to load more time.sleep(self.config.delay_after_page_load) - return True + + if not (parse.urlparse(self.driver.current_url).hostname or '').endswith('.shinyapps.io'): + return True + + logging.info('shinyapp.io detected, waiting for _router_ui to have elements...') + waited_time = 0 + while waited_time < 10: + time.sleep(self.config.delay_after_page_load) + waited_time += self.config.delay_after_page_load + + el = self.driver.find_element(By.ID, '_router_ui') + children = cast(list[WebElement], el.get_property('children')) + if len(children) > 0: + logging.info('shinyapp.io page finished loading with %d elements', len(children)) + return True + logging.error('shinyapp.io did not seem to finish loading within 10 seconds') + return False def safe_restart(self) -> None: """Restart the webdriver."""