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

树莓派4上Selenium无法点击弹窗元素的问题求助

树莓派Python/Selenium处理网页弹窗问题

问题描述

计划使用树莓派通过Python/Selenium测试网页,以下代码在桌面端(Ubuntu 22.04或Linux Mint)运行正常,但在树莓派(Raspbian或Ubuntu 22.04)上无法处理弹窗:

driver = webdriver.Chrome()
driver.get("https://www.swoodoo.ch")
wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@aria-label='Schliessen']"))).click()

在树莓派上触发超时异常:

Traceback (most recent call last):
  File "/home/user/flights/flights2.py", line 19, in <module>
    wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@aria-label='Schliessen']"))).click()
  File "/home/user/.local/lib/python3.9/site-packages/selenium/webdriver/support/wait.py", line 95, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

已尝试的解决方案(桌面端均有效)

  • a) 手动关闭弹窗后,程序可正常运行(包括提取搜索结果文本),但无法自动化;
  • b) 在所有代码行之间添加30秒以上的长时间等待,无任何变化;
  • c) 修改代码如下,树莓派能找到元素但无法点击,触发ElementNotInteractableException:
driver = webdriver.Chrome()

driver.get("https://www.swoodoo.ch")

time.sleep(5)

element=driver.find_element(By.XPATH, "//div[@aria-label='Schliessen']")

time.sleep(5)

element.click()

报错信息:

Traceback (most recent call last):
  File "/home/user/flights/flights2.py", line 23, in <module>
    element.click()
  File "/home/user/.local/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 93, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/home/user/.local/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 401, in _execute
    return self._parent.execute(command, params)
  File "/home/user/.local/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py", line 440, in execute
    self.error_handler.check_response(response)
  File "/home/user/.local/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
  (Session info: chrome=104.0.5112.105)
Stacktrace:
#0 0x00557fda2268 <unknown>
#1 0x00557fbcbb08 <unknown>
#2 0x00557fbfd50c <unknown>
#3 0x00557fbf32d0 <unknown>
#4 0x00557fbf2cac <unknown>
#5 0x00557fc264c8 <unknown>
#6 0x00557fbf18f0 <unknown>
#7 0x00557fde52f4 <unknown>
#8 0x00557fde7b9c <unknown>
#9 0x00557fdd1cd4 <unknown>
#10 0x00557fde83bc <unknown>
#11 0x00557fdc6d64 <unknown>
#12 0x00557fe01cd0 <unknown>
#13 0x00557fe01e40 <unknown>
#14 0x00557fe1a6f0 <unknown>
  • d) 尝试使用JavaScript执行点击,无报错但无任何操作:
driver.execute_script("arguments[0].click();", element)

解决思路建议

  • 校验Chrome与ChromeDriver版本匹配:树莓派上Chrome版本为104.0.5112.105,确认ChromeDriver是否为对应版本,版本不兼容会导致元素交互异常。
  • 调整浏览器窗口配置:树莓派默认可能使用小窗口或无头模式,弹窗元素可能未完全渲染或被遮挡,可设置窗口大小并添加适配参数:
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")  # 最大化窗口
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")  # 树莓派环境常需此参数绕过安全限制
driver = webdriver.Chrome(options=options)
  • 优化元素等待逻辑:先等待弹窗容器加载,再等待关闭按钮可见且可交互,同时滚动到元素位置确保不被遮挡:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

wait = WebDriverWait(driver, 15)
# 等待弹窗容器出现
wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@role, 'dialog')]")))
# 获取关闭按钮并滚动到可见位置
close_btn = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@aria-label='Schliessen']")))
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", close_btn)
# 执行点击
close_btn.click()
  • 检查元素唯一性:通过find_elements获取所有匹配元素,过滤出可见的再执行点击,避免选中隐藏元素:
elements = driver.find_elements(By.XPATH, "//div[@aria-label='Schliessen']")
for elem in elements:
    if elem.is_displayed():
        driver.execute_script("arguments[0].click();", elem)
        break
  • 排查iframe嵌套:部分弹窗会嵌入在iframe中,需先切换到对应iframe再查找元素:
# 假设弹窗在id为"modal-iframe"的iframe中,需先定位并切换
iframe = wait.until(EC.presence_of_element_located((By.ID, "modal-iframe")))
driver.switch_to.frame(iframe)
# 之后再查找关闭按钮
close_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@aria-label='Schliessen']")))
close_btn.click()
# 操作完成后切回主文档
driver.switch_to.default_content()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:20:36