From 8d51c7601bd39b4ee133005d789331637efddf76 Mon Sep 17 00:00:00 2001 From: Gareth Jones <3151613+G-Rath@users.noreply.github.com> Date: Wed, 8 Oct 2025 15:26:58 +1300 Subject: [PATCH] feat: try waiting for shinyapps to have loaded before continuing --- src/browser.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) 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."""