2017-04-10 1 views
4

J'essaie de savoir comment télécharger un fichier en utilisant R/RSelenium. Informations:Comment télécharger des fichiers avec RSelenium?

  • OS: Win 8.1, RSelenium_1.7.1, avec une image docker (linux, standalone-chrome 3.2.0).

J'ai essayé le commentaire haut de cette question SO:

How to upload file using Selenium WebDriver in Java

Exemple:

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) 

Mais je reçois le message d'erreur suivant:

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 

Le le dossier utilisé est mappe d à la machine virtuelle. Autoit est hors de question car il ne fonctionne que sur Windows.

Également essayé upload_btn$sendKeysToElement(list(path)) qui ne renvoie pas d'erreur, mais cela ne fonctionne pas non plus.

Toute aide est appréciée.


Modifier:

Je pense que cela est censé travailler, mais je vois une erreur lors de l'affichage d'une capture d'écran:

  • Mounted mon dossier de travail à la machine virtuelle default comme un dossier partagé et l'a nommé win_share
  • Créé un dossier sur default avec sudo mkdir vm_share
  • Monté win_share dans le dossier vm_share avec sudo mount -t vboxsf win_share vm_share. Après cette étape, je peux accéder avec succès à mon dossier de travail sur la machine virtuelle (vérifié par ssh dans default).
  • Le chemin du dossier vm_share est /home/docker/vm_share

Après toutes ces exécution de ce script, il ne fonctionne pas. (A pris l'exemple de John)

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() 

Screenshot:

Error

+0

Vous devrez donner un dossier/chemin sur le conteneur docker. Ceci à son tour serait mappé à un dossier/chemin correspondant sur l'hôte.Si vous passez un dossier faisant référence à l'hôte comme votre «chemin» cela ne fonctionnera pas. – jdharrison

+1

Il semble que vous ayez suivi http://stackoverflow.com/questions/30864466/whats-the-best-way-to-share-files-from-windows-to-boot2docker-vm pour créer votre dossier partagé. Vous auriez besoin de faire référence à ceci lors du démarrage de votre image docker selenium en utilisant par exemple 'docker run -d -v vm_share:/home/docker/vm_share -p 4445: 4444 selenium/standalone-chrome'. Cela devrait ensuite créer un mappage entre le dossier boot2docker vm et le dossier de conteneur '/ home/docker/vm_share'. Le dossier vm lui-même déjà mappé à votre hôte Windows. – jdharrison

+0

super travail, merci de prendre votre temps avec ça! – GyD

Répondre

3

La méthode sendKeysToElement attend une liste. Le chemin doit être passé comme une liste:

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() 

Voir aussi la démo en elle-même https://github.com/ropensci/RSelenium/blob/master/demo/selFileUpload.R et OpenFileDialog in R Selenium

package RSelenium
+0

Salut, John, merci pour votre réponse! J'ai essayé de passer le chemin en tant que liste et il ne retourne pas une erreur, cependant le fichier n'est pas téléchargé, soit je reçois une erreur ou je ne peux pas cliquer sur le bouton soumettre après. Vérifié avec ce code (https://github.com/ropensci/RSelenium/blob/master/demo/selFileUpload.R), mais cela ne fonctionne pas, donc je suppose que je devrais vérifier avec d'autres versions/navigateurs de sélénium. (J'utilise sélenium-server-standalone-3.3.1, avec sélenium/standalone-chrome: dernier, aussi essayé firefox: 3.2.0 et chrome: 3.2.0) – GyD

+0

J'ai mis à jour l'exemple qui fonctionne avec le dernier chrome et le sélénium serveur – jdharrison

+0

Vous devrez peut-être également transmettre le chemin d'accès dépendant du système d'exploitation, par exemple 'C: \\ path_to_folder \\ filename.pdf' pour les fenêtres. – jdharrison