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

使用RSelenium远程驱动从SmartRow网站下载文件失败问题求助

修正方案

核心问题修正点

  • 修正配置参数拼写错误:原有配置里的--desable-gpu拼写错误,改为--disable-gpu,否则无头模式相关配置不会生效。
  • 补充无头Chrome的下载权限配置:旧版本Chrome无头模式默认禁用下载功能,需要在启动参数中添加--enable-downloads,同时额外配置允许无头模式下下载的安全规则。
  • 增加异步元素等待:该站点是Angular框架开发,所有元素都是异步渲染,直接查找元素很可能命中未完成挂载的节点,点击不会触发任何效果,需要加显式等待确认元素可点击后再操作。
  • 确认路径挂载:使用Singularity容器运行Selenium服务时,配置的download.default_directory是容器内部路径,需要确保该路径已经和宿主机的对应目录做了绑定挂载,否则下载的文件会保存在容器内部,退出容器后就会丢失。

修改后可运行代码

library(RSelenium)
eCaps <- list(chromeOptions = list(
  args = c("--window-size=1920,1080",
           "--disable-extensions",
           "--proxy-server='direct://'",
           "--proxy-bypass-list=*",
           "--start-maximized",
           "--headless",
           "--disable-gpu", # 修正拼写错误
           "--disable-dev-shm-usage",
           "--no-sandbox",
           "--ignore-certificate-errors",
           "--enable-downloads" # 新增无头模式下载权限
           ),
  prefs = list("profile.default_content_settings.popups" = 0L,
               "download.prompt_for_download" = FALSE,
               "download.default_directory" = "/home/ua21849/downloads",
               "safebrowsing.enabled" = FALSE # 禁用安全拦截跳过下载校验
  )
))

remDr <- remoteDriver(
  remoteServerAddr = "********",
  port = 4444L,
  browserName = "chrome",
  extraCapabilities = eCaps
)

remDr$open()
# 允许无头Chrome下载文件,适配远程Selenium服务
remDr$executeScript("
  var chrome = window.chrome;
  if (chrome && chrome.send) {
    chrome.send('setDownloadBehavior', {
      behavior: 'allow',
      downloadPath: '/home/ua21849/downloads'
    });
  }
")

remDr$navigate("https://smartrow.fit/#/profile")
# 显式等待工具函数,最多等10秒直到元素加载完成
wait_element <- function(remDr, using, value, timeout = 10) {
  start <- Sys.time()
  elem <- NULL
  while(inherits(elem, "try-error") || is.null(elem)) {
    elem <- try(remDr$findElement(using = using, value = value), silent = TRUE)
    if (Sys.time() - start > timeout) stop("元素加载超时")
    Sys.sleep(0.5)
  }
  return(elem)
}

# 所有元素操作前加等待
username <- wait_element(remDr, "id", "mat-input-0")
username$sendKeysToElement(list("******"))
pwd <- wait_element(remDr, "id", "mat-input-1")
pwd$sendKeysToElement(list("*******"))
login_btn <- wait_element(remDr, "css selector", ".mat-stroked-button")
login_btn$clickElement()

# 登录完成后等待页面跳转
Sys.sleep(2)
remDr$navigate("https://smartrow.fit/#/log")
download_entry <- wait_element(remDr, "css selector", ".mat-icon-no-color")
download_entry$clickElement()

remDr$screenshot(file = "test.png")

# 如下载按钮选择不唯一,可根据文本匹配对应元素,示例如下
# all_items <- remDr$findElements("css selector", "a.mat-list-item.mat-2-line.ng-star-inserted")
# for (item in all_items) {
#   if (grepl("下载|导出", item$getElementText()[[1]])) {
#     b <- item
#     break
#   }
# }

b <- wait_element(remDr, "css selector", "a.mat-list-item.mat-2-line.ng-star-inserted")
b$clickElement()

# 等待下载完成,可根据文件大小调整等待时长
Sys.sleep(5)
remDr$close()

排查指南

  • 如仍下载失败,可先注释掉--headless参数,用可视化模式运行,确认点击的元素是对应的下载按钮,排除选择器匹配错误的问题。
  • 检查Selenium服务日志,确认下载目录有写入权限,目录权限需设置为755及以上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:06:02