You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级CentOS与Firefox后Python Selenium无法点击按钮求助

解决Selenium升级环境后无法点击HKEX夜间会话按钮的问题

问题背景

原有代码在CentOS 7、Firefox-60.6.1、Geckodriver v.0.24.0、Python 3.6.8、selenium 3.141.0环境下可正常点击香港交易所页面的「NIGHT SESSION」按钮,对应HTML元素:

<span class="ns ns_night">NIGHT SESSION</span>

原代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import re, time

geckodriver = '/opt/geckodriver'

options = webdriver.FirefoxOptions()
options.add_argument('-headless')

driver = webdriver.Firefox(executable_path=geckodriver, firefox_options=options)

driver.get('https://www.hkex.com.hk/Market-Data/Futures-and-Options-Prices/Equity-Index/Hang-Seng-Index-Futures-and-Options?sc_lang=en#&product=HSI')

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, './/span[@class="ns ns_night"]'))).click()

升级到CentOS 8、Firefox-91.4.0、Geckodriver v.0.31.0后,按钮点击操作失效,以下是排查及解决线索:

解决线索

  • 确认元素定位有效性:先通过print(driver.page_source)输出当前页面源码,检查目标元素的class属性、DOM结构是否和之前一致。高版本浏览器可能因页面渲染逻辑调整,导致元素被隐藏、新增父容器遮挡,或class名变更。
  • 调整等待条件:将EC.element_to_be_clickable替换为EC.visibility_of_element_located,高版本Firefox对「可点击」状态的判断更严格,元素可能已加载但未完全可见:
    element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, './/span[@class="ns ns_night"]')))
    element.click()
    
  • 改用ActionChains模拟点击:如果直接点击无效,模拟鼠标移动到元素再点击的操作,避免因元素位置偏移或交互触发条件问题:
    from selenium.webdriver.common.action_chains import ActionChains
    
    element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, './/span[@class="ns ns_night"]')))
    ActionChains(driver).move_to_element(element).click().perform()
    
  • 优化headless模式配置:高版本Firefox的headless模式参数有调整,旧的-headless可替换为--headless,同时添加窗口大小参数避免布局异常:
    options.add_argument("--headless")
    options.add_argument("window-size=1920,1080")
    
  • 升级Selenium版本:selenium 3.141.0与Geckodriver 0.31.0、Firefox 91的兼容性较差,建议升级到selenium 4.x版本,适配新环境的交互逻辑。
  • 排查iframe嵌套:检查页面是否新增了iframe容器,若目标元素在iframe内,需先切换到iframe再操作:
    # 示例:通过id定位iframe(实际需替换为页面真实的iframe标识)
    iframe = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'target-iframe')))
    driver.switch_to.frame(iframe)
    # 执行点击操作
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, './/span[@class="ns ns_night"]'))).click()
    # 操作完成后切回主文档
    driver.switch_to.default_content()
    
  • 使用JavaScript强制点击:若上述方法均无效,直接通过JS触发元素的点击事件,绕过Selenium的交互判断:
    element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, './/span[@class="ns ns_night"]')))
    driver.execute_script("arguments[0].click();", element)
    

内容的提问来源于stack exchange,提问作者easytone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:24:47