You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Selenium WebDriver点击按钮后跳转至空白页面,直接访问目标链接却正常

Selenium WebDriver点击按钮后跳转至空白页面,直接访问目标链接却正常

这种情况我之前也碰到过,十有八九是网站的反爬机制检测到了Selenium的特征——毕竟直接访问正常、点击跳转就空白,核心差异就在于请求的上下文环境。给你几个实用的调试和解决方向:

  • 伪装浏览器特征,隐藏自动化标识
    现在很多网站会通过navigator.webdriver属性识别Selenium,默认情况下这个属性会被设为true。你可以通过ChromeOptions配置来修改这个行为:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    # 禁用自动化控制特征
    options.add_argument("--disable-blink-features=AutomationControlled")
    # 排除自动化开关
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    # 关闭自动化扩展
    options.add_experimental_option('useAutomationExtension', False)
    
    driver = webdriver.Chrome(options=options)
    # 再用JS重置webdriver属性,双重保险
    driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
    

    这些配置能让你的浏览器环境更接近普通用户,降低被反爬机制识别的概率。

  • 替换固定等待,改用显式等待策略
    你现在用的time.sleep()是固定时长等待,很可能出现页面未完全就绪就触发操作、或者跳转后加载被阻塞的情况。建议换成Selenium的显式等待,根据页面元素状态动态调整等待时间:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 等待cookie拒绝按钮可点击
    cookieDeclineButton = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "onetrust-reject-all-handler"))
    )
    cookieDeclineButton.click()
    
    # 等待购买按钮可点击再执行点击
    bestelSimkaartButton = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "/html/body/div[2]/div[1]/div[1]/div/div[1]/div[2]/div[1]/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[3]/button"))
    )
    bestelSimkaartButton.click()
    
    # 跳转后等待目标页面的关键元素出现,确认加载完成
    try:
        WebDriverWait(driver, 15).until(
            EC.presence_of_element_located((By.TAG_NAME, "h1"))  # 替换成目标页面实际存在的元素
        )
    except:
        print("页面加载超时,可能仍被反爬拦截")
    

    显式等待比固定sleep更可靠,也能减少不必要的等待时间。

  • 模拟真实用户的操作节奏
    网站可能会检测操作的机械性——比如你打开页面就点cookie按钮,立刻又点购买,节奏太生硬。可以加一些贴近真实用户的小动作:

    from selenium.webdriver.common.action_chains import ActionChains
    
    # 先滚动到购买按钮的可见位置
    driver.execute_script("arguments[0].scrollIntoView();", bestelSimkaartButton)
    # 模拟鼠标悬停后再点击
    ActionChains(driver).move_to_element(bestelSimkaartButton).click().perform()
    

    这种操作流程更接近真人行为,不容易触发反爬规则。

  • 校验请求头和Cookie状态
    直接访问目标URL时,浏览器的Cookie和请求头可能和点击跳转时存在差异。你可以用Chrome开发者工具的Network面板,对比两种访问方式的请求参数,看看有没有缺失的关键Cookie或请求头字段,比如自定义User-Agent:

    options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36")
    

    有些网站会校验User-Agent,换成普通浏览器的UA能进一步降低被检测的概率。

先从伪装浏览器特征入手试试,这是解决这类问题最常用的方案;如果不行再逐步尝试其他方法,总能找到适配的方式。

备注:内容来源于stack exchange,提问作者Denzel

火山引擎 最新活动