Selenium模拟点击是绕过可跳过广告最可行方案,但仅适用于含“跳过”按钮或“X”关闭按钮的广告;需处理iframe切换、动态元素等待及DOM变化,pyautogui和浏览器扩展因稳定性差不推荐。

用 selenium 模拟点击是最可行的路径,但成功率取决于广告类型
纯贴片广告(即视频开始前几秒的不可跳过广告)基本无法用自动化点击“跳过”,因为“跳过”按钮在广告结束前根本不存在。真正能干预的,是那些带「跳过广告」文字按钮的可跳过广告(常见于 Bilibili、腾讯视频、爱奇艺的部分非会员广告),或播放器右上角的「关闭」、「X」按钮。
必须明确:这不是通用解法,而是针对特定 DOM 结构的临时应对。浏览器驱动、页面加载时机、元素可见性都会直接影响点击是否生效。
-
selenium是目前最稳定的选择;playwright也可行,但部分国产播放器对它的检测更敏感 - 务必使用无头模式(
headless=False)先手动验证流程,否则失败时完全看不到发生了什么 - 不要依赖固定 XPath,优先用
WebDriverWait等待visibility_of_element_located,而非presence_of_element_located - 某些页面会动态插入广告容器(如
div[data-ad]或iframe[id*="ad"]),需先切到 iframe 再找按钮
识别并等待「跳过」按钮出现的关键细节
很多脚本失败,是因为直接用 find_element 查找,而此时按钮还没渲染出来,或者被遮挡。Bilibili 的「跳过广告」按钮通常在倒计时 5 秒后才显示,且 class 名经常变(如 skip-btn、ad-skip、icon-skip)。
推荐策略:
立即学习“Python免费学习笔记(深入)”;
- 监听
document.querySelectorAll('button, a')中包含「跳过」「Skip」「关闭」「Close」文本的元素 - 用
WebDriverWait(driver, 10).until(lambda d: len(d.find_elements(By.XPATH, "//*[contains(text(), '跳过') or contains(text(), 'Skip') or @aria-label='Skip']")) > 0) - 点击前加判断:
if element.is_displayed() and element.is_enabled(): element.click() - 避免点击后立即继续——有些广告点击跳过会触发二次加载,建议
time.sleep(0.8)后再检查视频是否已播放
绕过 iframe 广告容器是多数人卡住的地方
腾讯视频和爱奇艺常把广告嵌在 iframe 里,主页面 DOM 根本找不到「跳过」按钮。不切换上下文,selenium 就像隔着玻璃按屏幕。
实操步骤:
- 先定位广告 iframe:
driver.find_element(By.XPATH, "//iframe[contains(@src, 'ad') or contains(@id, 'ad') or @data-ad]") - 用
driver.switch_to.frame(iframe_element)进入上下文 - 再查找按钮(此时按钮就在 iframe 内部 DOM 中)
- 点击完成后,必须
driver.switch_to.default_content()切回来,否则后续操作全失效 - 注意:部分 iframe 是沙箱化的(
sandbox="allow-scripts"),可能禁止脚本访问,这种基本无解
为什么 pyautogui 和浏览器扩展方案不推荐
pyautogui 做图像识别点击(比如找「跳过」文字截图匹配)看似绕过 DOM 限制,但实际非常脆弱:分辨率变化、缩放比例、主题色调整、字体抗锯齿差异都会导致匹配失败;而且一旦窗口失焦或被遮挡就彻底失效。
浏览器扩展(如 Tampermonkey 脚本)理论上更底层,但现代视频站普遍启用 Content-Security-Policy 限制内联脚本,并通过 MutationObserver 监控 DOM 变动,随时移除注入的跳过逻辑。你写的 document.querySelector('.skip-btn').click() 很可能刚执行完就被重置。
所以,除非你只跑固定环境(同一台电脑、固定分辨率、固定浏览器版本、固定网站版本),否则别押注在这两类方案上。
真实场景中,最麻烦的不是写代码,而是每次网站更新后重新抓元素、调等待条件、验证 iframe 是否换名——这活没法一劳永逸。



















