import logging import time import sys from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver import ActionChains from webdriver_manager.chrome import ChromeDriverManager # Setup logging logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") logger = logging.getLogger(__name__) def switch_to_iframe_with_text(driver, text_to_find, timeout=5): """Switch to the iframe containing specific text.""" driver.switch_to.default_content() all_iframes = driver.find_elements(By.TAG_NAME, "iframe") logger.info(f"Found {len(all_iframes)} iframes on page") for idx, iframe in enumerate(all_iframes): driver.switch_to.default_content() driver.switch_to.frame(iframe) try: if text_to_find.lower() in driver.page_source.lower(): logger.info(f"Found '{text_to_find}' in iframe #{idx}") return True except Exception as e: logger.warning(f"Error reading iframe #{idx}: {e}") driver.switch_to.default_content() return False def main(customer, user, pwd): logger.info(f"Starting sitearea creation for customer: {customer}") chrome_options = Options() chrome_options.add_argument("--headless=new") # Headless mode chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("start-maximized") service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, options=chrome_options) wait = WebDriverWait(driver, 20) try: # --- LOGIN --- driver.get("https://xindus-01.infiplex.com/admin/admin_login.php") wait.until(EC.presence_of_element_located((By.ID, 'uname'))).send_keys(user) driver.find_element(By.ID, 'password').send_keys(pwd) driver.find_element(By.ID, 'submit').click() logger.info("Logged in successfully") time.sleep(2) # --- CREATE SITEAREA --- driver.get("https://xindus-01.infiplex.com/admin/sitearea/siteareaadd.php") wait.until(EC.presence_of_element_located((By.ID, "sitearea_name"))).send_keys(customer) driver.find_element(By.ID, "base_folder").send_keys(customer) driver.find_element(By.ID, "content_section_name").send_keys(customer) driver.find_element(By.ID, "_content_section_security_group_all_users_yes").click() # Applications tab driver.find_element(By.LINK_TEXT, "Applications").click() app_ids = [325, 320, 317, 342, 322, 346, 393, 387, 336, 31, 195, 293, 5, 384, 340, 344, 3, 334, 327, 7] for app_id in app_ids: driver.find_element(By.ID, f"install_app_yes_no_{app_id}").click() save_buttons = driver.find_elements(By.ID, "submit") save_button = save_buttons[1] driver.execute_script("arguments[0].scrollIntoView();", save_button) save_button.click() logger.info("Sitearea created and saved") # --- NAVIGATE TO CUSTOMER SHOP PAGE --- driver.get("https://xindus-01.infiplex.com/admin/index.php") links = driver.find_elements(By.TAG_NAME, "a") for link in links: href_value = link.get_attribute("href") if href_value and customer in href_value: driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", link) driver.execute_script("arguments[0].click();", link) logger.info(f"Clicked customer link for {customer}") break time.sleep(3) # --- SWITCH TO IFRAME WITH TOOLS --- logger.info("Searching for iframe containing 'Tools'") if not switch_to_iframe_with_text(driver, "Tools"): logger.error("Could not find iframe containing 'Tools'") return None # --- TOOLS → SHOP ADMIN API --- logger.info("Navigating to Tools → Shop Admin API") tools_link = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(., 'Tools')]"))) # If hover menu try: ActionChains(driver).move_to_element(tools_link).perform() time.sleep(1) except: pass tools_link.click() api_tab = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(., 'Shop Admin API')]"))) api_tab.click() time.sleep(2) # --- CHECK OR CREATE API KEY --- no_results = driver.find_elements(By.XPATH, "//h3[text()='No Results Found']") if no_results: logger.info("No API key found, creating a new one") create_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'Create New API Key')]"))) create_button.click() time.sleep(1) driver.switch_to.frame(driver.find_element(By.XPATH, "//iframe[contains(@src, 'admin_api_add_edit.php')]")) wait.until(EC.presence_of_element_located((By.ID, "reference_name"))).send_keys("StoreAPI") checkboxes = driver.find_elements(By.XPATH, "//td[@style='text-align:left;vertical-align:top;']//input[@type='checkbox']") for cb in checkboxes: if not cb.is_selected(): cb.click() driver.find_element(By.ID, "submit").click() logger.info("API key created") driver.switch_to.default_content() switch_to_iframe_with_text(driver, "Shop Admin API") # --- FETCH API KEY --- logger.info("Fetching API key from table") api_key_elem = wait.until(EC.presence_of_element_located((By.XPATH, "//tr[td[1]]/td[2]"))) api_key = api_key_elem.text.strip() if not api_key: raise Exception("Found API key element but it was empty.") logger.info(f"API Key for {customer}: {api_key}") return api_key except Exception as e: logger.error(f"Error: {e}", exc_info=True) try: with open('debug_page_source.html', 'w', encoding='utf-8') as f: f.write(driver.page_source) driver.save_screenshot('debug_screenshot.png') logger.info("Saved debug files: debug_page_source.html & debug_screenshot.png") except: pass return None finally: driver.quit()