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

