【问题标题】:How to upload files with RSelenium?如何使用 RSelenium 上传文件?
【发布时间】:2017-09-05 09:26:29
【问题描述】:

我正在尝试了解如何使用 R/RSelenium 上传文件。资料:

  • 操作系统:Win 8.1,RSelenium_1.7.1,带有 docker 映像(linux,standalone-chrome 3.2.0)。

我尝试了这个 SO 问题的最高评论:

How to upload file using Selenium WebDriver in Java

例子:

url <- "https://www.freepdfconvert.com/pdf-word"
path <- "C:/path_to_folder/filename.pdf"

remDr$navigate(url)

upload_btn <- remDr$findElement(using = "id", "clientUpload")
upload_btn$sendKeysToElement(path)

但我收到以下错误消息:

Selenium message:java.lang.String cannot be cast to java.util.List

Error:   Summary: UnknownError
     Detail: An unknown server-side error occurred while processing the command.
     class: java.lang.ClassCastException
     Further Details: run errorDetails method

使用的文件夹映射到虚拟机。 Autoit 是不可能的,因为它只适用于 Windows。

还尝试了upload_btn$sendKeysToElement(list(path)),它不会返回错误,但它也不起作用。

感谢任何帮助。


编辑

我认为这应该可以工作,但是在查看屏幕截图时我看到了一个错误:

  • 将我的工作文件夹作为共享文件夹安装到default 虚拟机并命名为win_share
  • 使用sudo mkdir vm_sharedefault 上创建了一个文件夹
  • 使用sudo mount -t vboxsf win_share vm_sharewin_share 安装到文件夹vm_share。完成此步骤后,我可以成功访问虚拟机上的工作文件夹(由ssh 检查到default)。
  • vm_share文件夹的路径是/home/docker/vm_share

在所有这些执行此脚本之后,它就不起作用了。 (以约翰为例)

library(RSelenium)

remDr <- remoteDriver(remoteServerAddr = "192.168.99.100" 
                                            , port = 4445L
                                            , browserName = "chrome"
)
remDr$open()
remDr$navigate("https://gallery.shinyapps.io/uploadfile")
webElem <- remDr$findElement("id", "file1")

# create a dummy csv 
x <- data.frame(a = 1:4, b = 5:8, c = letters[1:4])
write.csv(x, file = "testcsv.csv", row.names = FALSE)

# post the file to the app
path <- "/home/docker/vm_share/testcsv.csv"
webElem$sendKeysToElement(list(path))

remDr$close()
remDr$closeServer()

截图

【问题讨论】:

  • 您需要在 docker 容器上提供一个文件夹/路径。这又将映射到主机上的相应文件夹/路径。如果您传递一个将主机称为 path 的文件夹,这将不起作用。
  • 您似乎关注了stackoverflow.com/questions/30864466/… 创建了您的共享文件夹。在使用例如docker run -d -v vm_share:/home/docker/vm_share -p 4445:4444 selenium/standalone-chrome 启动 selenium docker 映像时,您需要参考此内容。这应该会在 boot2docker vm 文件夹和容器文件夹 /home/docker/vm_share 之间创建一个映射。 vm 文件夹本身已经映​​射到您的 Windows 主机。
  • 很棒的工作,感谢您抽出宝贵的时间!

标签: r selenium file-upload rselenium


【解决方案1】:

sendKeysToElement 方法需要一个列表。路径需要作为列表传递:

library(RSelenium)
appURL <- "https://www.freepdfconvert.com/pdf-word"
# create sample pdf
tfile <- tempfile("sample", fileext = ".pdf")
pdf(tfile,width=7,height=5)
x=rnorm(100)
y=rnorm(100,5,1)
plot(x,lty=2,lwd=2,col="red")
lines(y,lty=3,col="green")
dev.off()

rD <- rsDriver()
remDr <- rD$client
remDr$navigate(appURL)

upload_btn <- remDr$findElement(using = "id", "clientUpload")
upload_btn$sendKeysToElement(list(tfile))

......
# cleanup when finished
rm(rD)
gc()

另请参阅 RSelenium 包本身中的演示 https://github.com/ropensci/RSelenium/blob/master/demo/selFileUpload.ROpenFileDialog in R Selenium

【讨论】:

  • 嗨,约翰,谢谢您的回答!我确实尝试将路径作为列表传递,但它没有返回错误,但是文件没有上传,要么我收到错误,要么之后我无法单击提交按钮。也检查了这段代码(github.com/ropensci/RSelenium/blob/master/demo/selFileUpload.R),但它不起作用,所以我想我应该检查其他硒版本/浏览器。 (我正在使用 selenium-server-standalone-3.3.1,与 selenium/standalone-chrome:latest,也尝试过 firefox:3.2.0 和 chrome:3.2.0)
  • 我已经更新了使用最新的 chrome 和 selenium 服务器运行的示例
  • 您可能还需要传递依赖于操作系统的路径,例如C:\\path_to_folder\\filename.pdf 用于 Windows。
  • 谢谢,它应该可以工作,但我很好奇为什么我的解决方案不起作用(请参阅我的问题的编辑部分)。如果您能看一下,我将不胜感激。
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 2021-11-01
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多