I’m automating downloads of StoryWeaver books with Selenium+Python. After logging in, I land on the level-page and can see the story cards in the UI—but my script can’t click any of them to navigate into the individual story pages (where the PDF download lives). Here’s a minimal version of my script (everything up to and including the login works fine): import os, time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager EMAIL = "…" PASSWORD = "…" LEVEL = 4 MAX_BOOKS = 10 OUTPUT_DIR = "storyweaver_pdfs" HOME_URL = f"https://storyweaver.org.in/en/stories?level={LEVEL}&query=&sort=Ratings" # — selectors for login (all working) — LOGIN_BTN = (By.CSS_SELECTOR, "a[title='Sign Up/Log In']") EMAIL_METHOD = (By.CSS_SELECTOR, "a:has(div[title='Email'])") EMAIL_INPUT = (By.ID, "auth-modal-email") SUBMIT_BTN = (By.CSS_SELECTOR, "button.pb-button--in-group-last[type='submit']:not([class*='disabled'])") PASSWORD_INPUT = (By.ID, "auth-modal-password") LIBRARY_IND = (By.CSS_SELECTOR, "a[href='/en/library']") # prepare driver… os.makedirs(OUTPUT_DIR, exist_ok=True) prefs = { "download.default_directory": os.path.abspath(OUTPUT_DIR), "download.prompt_for_download": False, "plugins.always_open_pdf_externally": True, } opts = Options() opts.add_argument("--start-maximized") opts.add_experimental_option("prefs", prefs) opts.add_experimental_option("excludeSwitches", ["enable-automation"]) opts.add_experimental_option("useAutomationExtension", False) driver = webdriver.Chrome( service=Service(ChromeDriverManager().install()), options=opts ) wait = WebDriverWait(driver, 30) try: # 1) LOGIN (works flawlessly) driver.get(HOME_URL) wait.until(EC.element_to_be_clickable(LOGIN_BTN)).click() wait.until(EC.element_to_be_clickable(EMAIL_METHOD)).click() wait.until(EC.element_to_be_clickable(EMAIL_INPUT)).send_keys(EMAIL) wait.until(EC.element_to_be_clickable(SUBMIT_BTN)).click() wait.until(EC.element_to_be_clickable(PASSWORD_INPUT)).send_keys(PASSWORD) wait.until(EC.element_to_be_clickable(SUBMIT_BTN)).click() wait.until(EC.presence_of_element_located(LIBRARY_IND)) print("✅ Logged in — now on level page") # 2) FIND THE STORY CARDS & CLICK THEM (fails here) card_selector = ( By.XPATH, "//a[contains(@href,'/stories/') and descendant::*[contains(@class,'story-card')]]" ) wait.until(EC.presence_of_all_elements_located(card_selector)) cards = driver.find_elements(*card_selector)[:MAX_BOOKS] print("Found", len(cards), "cards") for c in cards: c.click() # <<--- nothing happens, no navigation finally: driver.quit() What I see in the browser Each story appears as HTML like this: <a href="/en/stories/34911-the-case-of-the-missing-water" class="pb-link pb-link--default pb-book-card__link"> <div class="pb-book-card__container"> <div class="pb-book-card__wrapper"> <div class="pb-book-card__image-wrapper"> <div class="pb-img__wrapper"><img …></div> </div> <div class="pb-book-card__meta-wrapper"> <h3 class="pb-book-card__title">The Case of the Missing Water</h3> … </div> </div> </div> </a> But Selenium’s click() silently does nothing (no exception, no page navigation). What I’ve tried • Switching to JavaScriptExecutor: driver.execute_script("arguments[0].click()", c) • Waiting for visibility_of_element_located instead of presence or clickable. • Clicking the inner <h3> or the image wrapper instead of the <a>. • Scrolling cards into view with location_once_scrolled_into_view. • Adding a tiny pause (time.sleep(1)) before clicking. All of those still don’t navigate. My question 1. Why won’t Selenium click these elements, even though they’re visible and enabled? 2. What locator or click strategy reliably opens the story page? 3. If possible, a minimal code snippet showing how to click or navigate from the level page to each story URL would be hugely appreciated! Thanks in advance for any pointers! Continue reading...