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

使用R语言webdriver包(PhantomJS)下载文件遇元素选中失效问题

问题

尝试使用R语言的webdriver包(PhantomJS)下载文件,点击目标元素后无任何反应。需求是依次点击“Download dos dados”和“Baixar .csv”按钮完成下载,但即使使用完整XPath也无法选中“Baixar .csv”元素。由于笔记本无法使用RSelenium,且网站每次访问的会话代码都会变化,静态网页抓取不适用,因此选择使用webdriver。代码如下:

library(webdriver)

url <- 'https://idesevis.dee.rs.gov.br/#tab-9023-6'

#webdriver::install_phantomjs() # If it is not installed
pjs <- run_phantomjs()

ses <- Session$new(port = pjs$port)
ses$go(url)
ses$getUrl()

### Click on 'Download dos dados'
search <- ses$findElement(xpath='/html/body/div[2]/nav/div/ul/li[6]/a')
search$sendKeys('html',key$enter)

### Finds and clicks 'Baixar .csv'
search <- ses$findElement(xpath='/html/body/div[2]/div[3]/div/div[7]/div/div[1]/form/a')
search$sendKeys('html',key$enter)
ses$takeScreenshot()
解决方案
  • 添加页面等待逻辑:点击“Download dos dados”后,页面需要加载对应内容,直接查找“Baixar .csv”会因为元素未渲染完成而失败。可以设置固定等待时间,或者用waitForElement()等待元素出现:
    # 点击第一个按钮后等待3秒,让内容加载完成
    Sys.sleep(3)
    
  • 改用稳定的相对XPath定位:绝对XPath容易因页面结构变动失效,优先根据元素文本或属性定位:
    # 定位“Download dos dados”按钮
    download_btn <- ses$findElement(xpath = "//a[contains(text(), 'Download dos dados')]")
    # 定位“Baixar .csv”按钮
    csv_btn <- ses$findElement(xpath = "//a[contains(text(), 'Baixar .csv')]")
    
  • 使用click()方法触发点击:sendKeys(key$enter)的可靠性不如直接调用元素的click()方法:
    download_btn$click()
    # 等待后点击CSV按钮
    Sys.sleep(3)
    csv_btn$click()
    
  • 配置PhantomJS下载路径:默认情况下PhantomJS未指定下载目录,需要在启动时配置:
    # 设置下载路径(替换为你自己的本地目录)
    download_path <- "~/Downloads"
    pjs <- run_phantomjs(args = c("--web-security=no", paste0("--download-path=", download_path)))
    
修改后的完整代码
library(webdriver)

url <- 'https://idesevis.dee.rs.gov.br/#tab-9023-6'
download_path <- "~/Downloads" # 替换为你的本地下载目录

# 启动配置了下载路径的PhantomJS
pjs <- run_phantomjs(args = c("--web-security=no", paste0("--download-path=", download_path)))

ses <- Session$new(port = pjs$port)
ses$go(url)
ses$getUrl()

# 点击“Download dos dados”按钮
download_btn <- ses$findElement(xpath = "//a[contains(text(), 'Download dos dados')]")
download_btn$click()

# 等待页面加载对应内容
Sys.sleep(3)

# 点击“Baixar .csv”按钮
csv_btn <- ses$findElement(xpath = "//a[contains(text(), 'Baixar .csv')]")
csv_btn$click()

# 等待下载启动后截图确认
Sys.sleep(2)
ses$takeScreenshot()

# 关闭会话和PhantomJS进程
ses$close()
pjs$stop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:31:12