使用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
相关产品推荐
相关产品推荐

