Python Selenium如何点击弹窗内的加入购物车和加入心愿单按钮
问题修复方案
核心错误原因
- 未定义
iframe变量就执行frame切换:当前场景是body类带modal-open的模态弹窗,属于顶层DOM元素,不需要切换iframe,错误的frame切换直接导致后续所有元素定位失效 - 未设置元素显式等待:模态弹窗为异步渲染,元素未完成加载就执行定位操作必然触发元素找不到异常
- 使用绝对路径Xpath:页面结构稍有变动就会导致定位失效,优先使用相对路径结合元素属性定位
修正后可运行代码
from selenium import webdriver from selenium.webdriver import ActionChains 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 ElementNotVisibleException driver = webdriver.Chrome(executable_path='C:\Program Files\JetBrains\PyCharm 2021.1.1/chromedriver.exe') # 全局设置显式等待,最长等待10秒 wait = WebDriverWait(driver, 10) actions = ActionChains(driver) driver.maximize_window() driver.get("http://esindbaad.com/") # 鼠标悬停进入对应分类 beauty = wait.until(EC.visibility_of_element_located((By.XPATH, "//*[@id='head-wrapper']//ul/li[3]/a"))) body = wait.until(EC.visibility_of_element_located((By.XPATH, "//*[@id='head-wrapper']//ul/li[3]//div[3]/ul/li[6]/a"))) actions.move_to_element(beauty).move_to_element(body).click().perform() # 点击商品触发模态弹窗 product = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='content']//div[1]/div/a"))) actions.move_to_element(product).click().perform() # 等待弹窗加载完成后点击加入购物车 addcart = wait.until(EC.element_to_be_clickable((By.ID, "button-cart"))) addcart.click() # 点击加入心愿单 wishlist = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='product']//ul/li/a[contains(@href,'wishlist')]"))) wishlist.click() driver.execute_script("window.scrollBy(0,document.body.scrollHeight)")
额外优化建议
- 可以给Xpath增加属性校验,比如加入心愿单的按钮可以添加
contains(@class,'wishlist')这类属性判断,进一步提升定位稳定性 - 如果点击时遇到元素被遮挡的情况,可以替换为JS执行点击:
driver.execute_script("arguments[0].click();", addcart)
内容的提问来源于stack exchange,提问作者Usman Riaz Nain
相关产品推荐
相关产品推荐

