
使用 Selenium 点击按钮后跳转 URL 正确但页面白屏,通常是因目标网站启用了高级 Bot 检测(如 WebDriver 特征指纹识别、行为分析或 JS 挑战),导致渲染中断;直接 driver.get() 却正常,印证了该问题本质是自动化行为被拦截。
使用 selenium 点击按钮后跳转 url 正确但页面白屏,通常是因目标网站启用了高级 bot 检测(如 webdriver 特征指纹识别、行为分析或 js 挑战),导致渲染中断;直接 `driver.get()` 却正常,印证了该问题本质是自动化行为被拦截。
在自动化网页交互中,「点击后白屏但 URL 已变更」是一种典型反爬信号——它表明浏览器已触发导航请求,但页面 JavaScript 未成功执行或被主动阻断(例如通过检测 window.navigator.webdriver、chrome.runtime、鼠标轨迹缺失、事件触发方式异常等)。Lebara.nl 等现代电商/通信类网站普遍集成 OneTrust、Cloudflare 或自研风控系统,对 Selenium 原生驱动极其敏感。
以下为经过验证的三层次解决方案,兼顾有效性、可维护性与合规性:
✅ 1. 替换为 undetected-chromedriver(核心防御)
原生 webdriver.Chrome() 会暴露大量自动化特征(如 navigator.webdriver === true、特定 Chrome 扩展 ID、缺少真实用户代理熵值)。undetected-chromedriver(v3+)通过动态补丁 Chromium 二进制、随机化指纹、隐藏自动化标志位,显著降低检测率:
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
options = uc.ChromeOptions()
options.add_argument("--no-sandbox")
options.add_argument("--disable-gpu")
options.add_argument("--disable-dev-shm-usage")
# 可选:模拟真实设备(提升可信度)
options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
driver = uc.Chrome(options=options)
driver.get("https://www.lebara.nl/nl/prepaid/data-bundle-valuesim.html")⚠️ 注意:务必使用
pip install "undetected-chromedriver>=3.0",旧版 v2 已停止维护且易被识别。
✅ 2. 使用 JavaScript 点击替代 .click()(规避事件检测)
部分网站监听原生 click 事件的 isTrusted 属性(event.isTrusted === false 表示非用户触发)。改用 execute_script 执行 DOM 点击,可绕过该层校验:
# ✅ 推荐:JS 点击(更可靠)
bestel_button = driver.find_element(By.XPATH, "//button[contains(text(), 'Bestel') or contains(., 'SIM')]")
driver.execute_script("arguments[0].dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true}));", bestel_button)
# 或更简洁的触发方式(兼容多数场景)
driver.execute_script("arguments[0].click();", bestel_button)避免硬编码绝对 XPath(如 /html/body/div[2]/...),改用语义化相对定位(含文本、class 或 role 属性),增强稳定性。
✅ 3. 注入人类行为模拟(辅助降权)
单纯等待 time.sleep() 不足以模拟真实用户。建议组合以下策略:
-
随机延迟:
time.sleep(random.uniform(1.2, 3.8)) -
鼠标扰动:使用
pyautogui.moveTo()在可视区域内轻微移动(注意:需确保 Chrome 窗口处于前台,否则可能失败) -
滚动预加载:点击前滚动至目标元素,触发懒加载和事件绑定:
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", bestel_button) time.sleep(0.5) # 等待滚动完成
? 验证与调试建议
- 启用 Chrome 日志捕获前端报错:添加
options.add_argument("--enable-logging --v=1"),运行后检查控制台是否输出Blocked by client或Bot detected类错误。 - 检查关键属性是否被重写:
print(driver.execute_script("return window.navigator.webdriver")) # 应为 undefined 或 false print(driver.execute_script("return window.chrome")) # 应存在且非 null - 若仍失败,尝试禁用部分安全特性(仅限测试环境):
options.add_argument("--disable-blink-features=AutomationControlled") driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" })
综上,白屏问题本质是自动化特征泄露引发的前端拦截。通过「无痕驱动 + JS 事件注入 + 行为扰动」三层协同,可有效突破多数商业网站的 Bot 防御体系。始终优先选择语义化定位器与显式等待(WebDriverWait),而非硬编码休眠,以构建健壮、可长期维护的自动化流程。

















