import re import functools from time import sleep from selenium.common.exceptions import StaleElementReferenceException def parse_custom_format(num_str): units = {'K': 1000, 'M': 1000000} match = re.search(r'(\d+(\.\d+)?)([KM])', num_str) if match: number, _, unit = match.groups() return float(number) * units[unit] try: return float(num_str) # Handle plain numeric strings except ValueError: if num_str == '-': return 0 else: raise ValueError(f"Unexpected format: {num_str}") def retry_on_stale_element(max_retries=2, delay=2): def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): for attempt in range(max_retries): try: return func(*args, **kwargs) except StaleElementReferenceException: if attempt + 1 == max_retries: raise sleep(delay) return wrapper return decorator def retry_on_assertion(max_retries=2, delay=2): def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): for attempt in range(max_retries): try: return func(*args, **kwargs) except AssertionError: if attempt + 1 == max_retries: raise sleep(delay) return wrapper return decorator