Selenium访问App Store模态框元素时偶发TimeoutException异常求助
问题根因
- 你设置等待可见的
modal-container元素本身在页面加载完成后就已存在,未点击按钮时仅内容为空,等待空节点可见没有意义,无法判断模态框内容是否加载完成 - 按钮的CSS选择器用了全量class匹配,网站动态渲染时可能调整class顺序,导致选择器偶尔失效,按钮点击失败,自然加载不出模态框内容
- 无头模式下默认窗口尺寸极小,按钮可能不在视口范围内,导致点击事件不生效,模态框无法弹出
修正后可稳定运行的代码
改动点说明:
- 增加窗口尺寸配置,确保无头模式下元素在视口内可正常点击
- 简化按钮选择器,改用部分class匹配,避免动态class顺序导致的匹配失败
- 点击按钮后改为等待版本列表父节点可见,替代无意义的空容器等待
- 兼容新Selenium版本的元素查找语法,避免API过期报错
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--headless=new") # 固定窗口尺寸,避免无头模式下元素不在视口 options.add_argument("--window-size=1920,1080") # 禁用自动化检测,避免被网站拦截 options.add_argument("--disable-blink-features=AutomationControlled") url = "https://apps.apple.com/us/app/twitter/id333903271?ign-mpt=uo%3D4" driver = webdriver.Chrome(ChromeDriverManager().install(), options=options) driver.get(url) try: # 等待按钮可点击,简化选择器,不做全class匹配 button = WebDriverWait(driver, 15).until( EC.element_to_be_clickable((By.CSS_SELECTOR, '.version-history button.we-modal__show')) ) button.click() # 等待版本列表加载完成,替代等待空容器 version_list = WebDriverWait(driver, 15).until( EC.visibility_of_element_located((By.CSS_SELECTOR, 'ul.version-history__items')) ) # 提取所有版本号 version_items = version_list.find_elements(By.CSS_SELECTOR, 'h4.version-history__item__version-number') versions = [v.text.strip() for v in version_items] print(versions) finally: driver.quit()
内容的提问来源于stack exchange,提问作者ktm
相关产品推荐
相关产品推荐

