如何定位并点击Google vignette中的dismiss-button?已遇NoSuchElementException
解决Google Vignette关闭按钮定位失败问题
问题分析
你遇到的NoSuchElementException核心原因是Google广告嵌套了多层iframe:仅切换到aswift_开头的外层iframe还不够,关闭按钮实际存在于内层ad_iframe_开头的iframe中;另外直接定位元素可能未等待元素完全加载,也会导致查找失败。
解决方案代码
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 触发广告的步骤 self.driver.get("https://www.automationexercise.com/") WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "Products"))).click() # 处理多层iframe嵌套并点击关闭按钮 try: # 切换到外层aswift iframe WebDriverWait(self.driver, 10).until( EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//iframe[contains(@name, 'aswift_')]")) ) # 切换到内层ad_iframe(广告实际所在的iframe) WebDriverWait(self.driver, 10).until( EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//iframe[contains(@name, 'ad_iframe_')]")) ) # 等待关闭按钮可点击后触发点击 dismiss_btn = WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable((By.ID, "dismiss-button")) ) dismiss_btn.click() finally: # 切回默认页面内容,避免后续操作受iframe影响 self.driver.switch_to.default_content()
额外排查要点
- 若仍定位失败,用浏览器开发者工具(F12)确认关闭按钮的真实属性:比如是否存在
data-testid、特定class,而非仅依赖ID - 广告加载存在地区或网络延迟差异,可适当延长等待时间(如将10秒调整为15秒)
- 部分场景下按钮文本可能替代ID成为更可靠的定位方式:
//button[contains(text(), '关闭')]或//div[contains(@class, 'dismiss')]
内容的提问来源于stack exchange,提问作者Michał Gryszówka
相关产品推荐
相关产品推荐

