
使用 Selenium 点击按钮后 URL 正确跳转但页面白屏,通常是因网站启用了高级 Bot 检测(如 WebDriver 特征指纹识别、行为分析或 JS 挑战)。本文提供基于 undetected-chromedriver、JavaScript 原生点击和拟人化操作的可靠绕过方案。
使用 selenium 点击按钮后 url 正确跳转但页面白屏,通常是因网站启用了高级 bot 检测(如 webdriver 特征指纹识别、行为分析或 js 挑战)。本文提供基于 `undetected-chromedriver`、javascript 原生点击和拟人化操作的可靠绕过方案。
在自动化网页交互中,点击按钮后出现白屏(页面 DOM 加载失败、空白渲染、控制台无报错但内容不显示),而手动访问目标 URL 或直接 driver.get() 却能正常加载——这是典型的前端反自动化检测触发结果。Lebara.nl 等现代电商站点普遍集成 OneTrust、PerimeterX、Akamai Bot Manager 等方案,不仅检查 navigator.webdriver 属性,还会监测鼠标轨迹、事件触发链、时间间隔一致性、Chrome 扩展残留特征等。
✅ 核心问题定位
- ❌ 原生
element.click()会触发完整的浏览器事件流(mousedown→mouseup→click),易被检测为非人类行为; - ❌ 标准
webdriver.Chrome()启动的实例携带大量可识别指纹(如cdc_变量、window.chrome属性、permissionsAPI 异常响应); - ❌ 固定
time.sleep()和无交互的静默等待,不符合真实用户浏览节奏; - ✅ 直接
driver.get(url)成功,说明网络与页面本身无问题,验证了检测逻辑绑定在导航触发方式上。
✅ 推荐解决方案(三重加固)
1. 替换为 undetected-chromedriver(首选)
该库自动屏蔽 WebDriver 特征、随机化 UA、禁用自动化标志,并绕过常见 JS 检测点:
pip install undetected-chromedriver
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
import time
import random
options = uc.ChromeOptions()
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
# 可选:启用隐身模式进一步降低痕迹
options.add_argument("--incognito")
driver = uc.Chrome(options=options)
driver.maximize_window()
driver.get("https://www.lebara.nl/nl/prepaid/data-bundle-valuesim.html")
2. 使用 execute_script() 执行原生点击(关键修复)
避免 Selenium 的合成事件,改用 DOM 原生 click() 方法,跳过事件监听器拦截:
# ✅ 推荐:绕过事件检测链
bestel_button = driver.find_element(By.XPATH, '//*[@id="main-content"]/div[1]/div[2]/div[3]/button')
driver.execute_script("arguments[0].click();", bestel_button)
⚠️ 注意:XPath 应尽量使用相对、语义化路径(如
//button[contains(text(),'Bestel')]),避免绝对路径/html/body/div[2]/...—— 一旦页面结构微调即失效。
3. 注入拟人化行为(增强鲁棒性)
添加随机延迟、模拟鼠标移动(需 pyautogui)、滚动预热等:
import pyautogui
def human_delay(min_sec=1, max_sec=3):
time.sleep(random.uniform(min_sec, max_sec))
def move_mouse_randomly():
screen_width, screen_height = pyautogui.size()
x = random.randint(100, screen_width - 200)
y = random.randint(100, screen_height - 200)
pyautogui.moveTo(x, y, duration=random.uniform(0.3, 0.8))
# 示例流程
human_delay(1, 2)
move_mouse_randomly()
cookie_btn = driver.find_element(By.ID, "onetrust-reject-all-handler")
cookie_btn.click()
human_delay(2, 4)
move_mouse_randomly()
bestel_btn = driver.find_element(By.XPATH, "//button[contains(., 'Bestel') or contains(., 'SIM')]")
driver.execute_script("arguments[0].click();", bestel_btn)
# ✅ 等待新页面加载完成(推荐显式等待,而非 sleep)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 15).until(EC.url_changes(driver.current_url))
human_delay(3, 5) # 确保内容渲染
? 补充调试建议
- 打开开发者工具(F12)→ Console,执行
navigator.webdriver,正常应返回undefined(undetected-chromedriver已生效); - 检查 Network 面板:白屏时若无 XHR 请求或 HTML 文档未解析,说明 JS 执行被阻断;
- 启用日志:
uc.Chrome(headless=False, logging_level=10)查看底层 Chromium 日志; - 若仍失败,可尝试注入
stealth.min.js脚本(需自行托管并driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {...}))。
✅ 总结
白屏本质是前端主动“拒绝渲染”,而非网络或代码错误。解决思路必须从规避检测出发,而非优化等待逻辑。优先采用 undetected-chromedriver + execute_script() + 显式等待 组合,辅以行为随机化,即可稳定绕过 Lebara 及同类站点的 Bot 防御体系。切记:永远避免绝对 XPath、固定 sleep、以及未处理的 StaleElementReferenceException。










