diff --git a/botcity/web/browsers/chrome.py b/botcity/web/browsers/chrome.py index c7babd2..f54a6f2 100644 --- a/botcity/web/browsers/chrome.py +++ b/botcity/web/browsers/chrome.py @@ -7,6 +7,8 @@ from selenium.webdriver.chrome.options import Options as ChromeOptions from selenium.webdriver.common.desired_capabilities import DesiredCapabilities +from ..util import is_admin + def default_options(headless=False, download_folder_path=None, user_data_dir=None, page_load_strategy="normal") -> ChromeOptions: @@ -48,10 +50,16 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non chrome_options.add_argument("--disable-blink-features=AutomationControlled") - # Disable banner for Browser being remote-controlled - chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False) + # Check if user is root + if is_admin(): + if os.name == "posix": + chrome_options.add_argument("--no-sandbox") + else: + # Disable banner for Browser being remote-controlled + chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) + if headless: chrome_options.add_argument("--headless") chrome_options.add_argument("--headless=new") @@ -59,14 +67,6 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non chrome_options.add_argument("--hide-scrollbars") chrome_options.add_argument("--mute-audio") - # Check if user is root - try: - # This is only valid with Unix - if os.geteuid() == 0: - chrome_options.add_argument("--no-sandbox") - except AttributeError: - pass - chrome_options._botcity_temp_dir = None if not user_data_dir: temp_dir = tempfile.TemporaryDirectory(prefix="botcity_") diff --git a/botcity/web/browsers/edge.py b/botcity/web/browsers/edge.py index ab8ff9b..cd9824c 100644 --- a/botcity/web/browsers/edge.py +++ b/botcity/web/browsers/edge.py @@ -7,6 +7,8 @@ from msedge.selenium_tools import Edge, EdgeOptions # noqa: F401, F403 from selenium.webdriver.common.desired_capabilities import DesiredCapabilities +from ..util import is_admin + def default_options(headless=False, download_folder_path=None, user_data_dir=None, page_load_strategy="normal") -> EdgeOptions: @@ -44,10 +46,16 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non edge_options.add_argument("--disable-blink-features=AutomationControlled") - # Disable banner for Browser being remote-controlled - edge_options.add_experimental_option("excludeSwitches", ["enable-automation"]) edge_options.add_experimental_option('useAutomationExtension', False) + # Check if user is root + if is_admin(): + if os.name == "posix": + edge_options.add_argument("--no-sandbox") + else: + # Disable banner for Browser being remote-controlled + edge_options.add_experimental_option("excludeSwitches", ["enable-automation"]) + if headless: edge_options.add_argument("--headless") edge_options.add_argument("--headless=new") @@ -55,14 +63,6 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non edge_options.add_argument("--hide-scrollbars") edge_options.add_argument("--mute-audio") - # Check if user is root - try: - # This is only valid with Unix - if os.geteuid() == 0: - edge_options.add_argument("--no-sandbox") - except AttributeError: - pass - edge_options._botcity_temp_dir = None if not user_data_dir: temp_dir = tempfile.TemporaryDirectory(prefix="botcity_") diff --git a/botcity/web/util.py b/botcity/web/util.py index 5eb468b..c7480b8 100644 --- a/botcity/web/util.py +++ b/botcity/web/util.py @@ -1,3 +1,4 @@ +import os import shutil import tempfile @@ -19,6 +20,22 @@ def cleanup_temp_dir(temp_dir: tempfile.TemporaryDirectory) -> None: shutil.rmtree(temp_dir.name, ignore_errors=True) +def is_admin(): + if os.name == "nt": + # Only applies to Windows + import ctypes + try: + return ctypes.windll.shell32.IsUserAnAdmin() != 0 + except Exception: + return False + else: + # Unix/Linux check + try: + return os.geteuid() == 0 + except Exception: + return False + + def element_as_select(element: WebElement) -> Select: """Wraps a WebElement in a Select object.