diff --git a/assets/CHANGELOG.xlsx b/assets/CHANGELOG.xlsx index ad4994c..8a57bcd 100644 Binary files a/assets/CHANGELOG.xlsx and b/assets/CHANGELOG.xlsx differ diff --git a/scripts/altium365_part_request.py b/scripts/altium365_part_request.py index d757b3a..481552f 100644 --- a/scripts/altium365_part_request.py +++ b/scripts/altium365_part_request.py @@ -56,6 +56,7 @@ from selenium.webdriver.chrome.service import Service 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.common.exceptions import TimeoutException def make_driver(debugger_address, chromedriver): @@ -122,7 +123,17 @@ def _attach_files(driver, files): def submit_request(driver, base, req, no_submit=False): driver.get(f"{base}/partrequestsmanagement/Tasks/Add") - _wait(driver, EC.presence_of_element_located((By.ID, "Manufacturer"))) + try: + _wait(driver, EC.presence_of_element_located((By.ID, "Manufacturer")), t=20) + except TimeoutException: + url = driver.current_url + if any(k in url.lower() for k in ("auth.altium.com", "signin", "login", "oauth")): + raise RuntimeError( + "NOT SIGNED IN — this Chrome (the one on the debug port) is on the Altium login " + "page, so the form never loaded. Open that same Chrome profile, sign into the " + "Workspace (keep me signed in), leave it open, and re-run.") + raise RuntimeError(f"The 'Add new request' form did not load (no #Manufacturer field). " + f"Current page URL: {url}") _set_text(driver, By.ID, "Manufacturer", req.get("manufacturer", "")) _set_text(driver, By.ID, "ManufacturerPartNumbers", req.get("mpn", "")) _set_text(driver, By.ID, "Description", req.get("description", "")) @@ -166,9 +177,10 @@ def main(): try: r = submit_request(driver, a.base.rstrip("/"), req, no_submit=no_submit) except Exception as e: - r = {"mpn": req.get("mpn"), "status": "error", "error": str(e)[:300]} + r = {"mpn": req.get("mpn"), "status": "error", "error": str(e).splitlines()[0][:400]} results.append(r) print(f"[{i+1}/{len(requests)}] {req.get('mpn')}: {r['status']}" + + (f" -> {r['error']}" if r.get("error") else "") + (f" MISSING {r['missing_files']}" if r.get("missing_files") else "")) if a.review_first and first and not a.no_submit: input("Review the first request in the browser, then press Enter to submit the rest...")