在使用 Selenium 自动化测试或爬取网页时,可能会遇到弹窗,影响脚本执行,例如广告、登录提示、浏览器通知。
怎么在打开页面的时候,关闭弹窗呢?
这里我们就要区分,这个网页弹窗是属于哪种类型的:
是不是位置不限,需要手动找位置的,例如那种还会弹来弹去的广告
or 是固定的广告位,一直都会有,固定在某个角落
or 一些特定的时间,例如618等采购节,忽然不留神,就会跳出来发红包的那种?
不同的类型,用不同的方法来处理,对症下药,效果更好!
方法总结
弹窗类型 | 解决方法 |
---|---|
JavaScript 弹窗(alert/confirm) | driver.switch_to.alert.accept() |
浏览器通知弹窗 | --disable-notifications |
HTML 弹窗(广告) | find_element + 点击关闭 |
动态弹窗(难定位) | execute_script 删除/隐藏元素 |
新窗口弹窗 | window_handles 切换关闭 |
一下是详细的方法:
1. 关闭 JavaScript 弹窗(Alert/Confirm/Prompt)
网页可能会触发 alert()
, confirm()
, prompt()
这类弹窗,可以用 switch_to.alert
处理:
from selenium import webdriver
from selenium.webdriver.common.alert import Alert
driver = webdriver.Chrome()
driver.get("https://example.com")
# 触发弹窗后,切换到 alert 并关闭
alert = driver.switch_to.alert
alert.accept() # 点击"确定"
# alert.dismiss() # 点击"取消"(适用于 confirm/prompt)
2. 关闭浏览器通知弹窗
有些网站会请求通知权限,可以在启动浏览器时禁用通知:
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--disable-notifications") # 禁用通知弹窗
driver = webdriver.Chrome(options=options)
driver.get("https://example.com")
这个方法可以屏蔽掉一些简单的弹窗,但是可能会影响一些权限警告,例如跳转到某些网页,浏览器会出现“是否阻止”的按钮,这个可能会遭受屏蔽。
3. 关闭广告弹窗(普通 HTML 弹窗)
如果弹窗是 HTML 元素(如 <div>
),可以用 find_element
定位并关闭:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com")
try:
# 等待弹窗出现,并点击关闭按钮(如 X 按钮)
close_btn = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, "//button[@class='close-btn']"))
)
close_btn.click()
except Exception as e:
print("未找到弹窗或关闭失败:", e)
这种方法适用于大多数的情况,只要是固定的广告位,就可以咔嚓掉它,就像是关掉一样。
4. 使用 execute_script
直接移除弹窗元素
如果弹窗无法直接点击,可以用 JavaScript 删除或隐藏它:
driver.execute_script("""
var popup = document.querySelector('.popup-class');
if (popup) popup.remove();
""")
或者隐藏:
driver.execute_script("document.querySelector('.popup-class').style.display = 'none';")
5. 处理新窗口/标签页弹窗
如果弹窗是新窗口(如广告页),可以切换窗口并关闭:
main_window = driver.current_window_handle # 记录主窗口
# 遍历所有窗口,关闭非主窗口
for handle in driver.window_handles:
if handle != main_window:
driver.switch_to.window(handle)
driver.close()
driver.switch_to.window(main_window) # 切换回主窗口
6. 使用浏览器选项屏蔽弹窗
在 Chrome 启动时设置 --disable-popup-blocking
(但可能不适用于所有情况):
options = Options()
options.add_argument("--disable-popup-blocking")
driver = webdriver.Chrome(options=options)