import os import json from random import uniform from selenium.common import TimeoutException from selenium.webdriver import ActionChains, Keys from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait from modules.Tools.logger import debug from modules.Tools.tools import * def init_profile(mail, mobile=False): if not mobile: chrome_profile_dir = "/app/MsRewards-Reborn/user_data/profile/"+mail else: chrome_profile_dir = "/app/MsRewards-Reborn/user_data/profile/mobile-"+mail os.makedirs(chrome_profile_dir, exist_ok=True) preferences_file = os.path.join(chrome_profile_dir, "Default", "Preferences") if not os.path.exists(preferences_file): os.makedirs(os.path.join(chrome_profile_dir, "Default"), exist_ok=True) with open(preferences_file, "w") as f: json.dump( { "intl": { "accept_languages": "fr-FR,en-US,en", "selected_languages": "fr-FR,en-US,en" } }, f ) else: with open(preferences_file, "r") as f: settings = json.load(f) if "intl" not in settings: settings["intl"] = {} settings["intl"]["accept_languages"] = "fr-FR,en-US,en" settings["intl"]["selected_languages"] = "fr-FR,en-US,en" with open(preferences_file, "w") as f: json.dump(settings, f) return chrome_profile_dir # Deal with RGPD popup as well as some random popup like 'are you satisfied' one def rgpd_popup(config) -> None: for i in ["bnp_btn_accept", "bnp_hfly_cta2", "bnp_hfly_close"]: try: config.WebDriver.driver.find_element(By.ID, i).click() except Exception as err: debug(err) """ send_keys_wait([selenium element:element, str:keys]) send the different keys to the field element, with a random time between each press to simulate human action. keys can be an string, but also selenium keys """ def send_keys_wait(element, keys: str) -> None: for i in keys: element.send_keys(i) sleep(uniform(0.1, 0.3)) def send_wait_and_confirm(element, keys: str) -> None: send_keys_wait(element, keys) element.send_keys(Keys.ENTER) # Wait for the presence of the element identifier or [timeout]s def wait_until_visible(search_by: str, identifier: str, timeout: int = 20, browser=None, raise_error=True) -> bool: try: WebDriverWait(browser, timeout).until( expected_conditions.visibility_of_element_located((search_by, identifier)), "element not found") return True except TimeoutException as e: if raise_error: error(f"element {identifier} not found after {timeout}s") return False