Rselenium - 弹出窗口

4
我希望使用RSelenium和Firefox浏览器从网站下载文件。我已经正确执行了所有步骤(导航、选择正确的元素并输入所需内容),现在我点击“下载”按钮,然后Firefox弹出一个窗口询问我是否要下载该文件或者“用其他方式打开...”。
不幸的是,由于隐私限制,我无法提供示例。
我的问题是:当需要时,如何切换到弹出窗口/警报并单击“确定”?
我尝试了以下方法,但均未成功:
remDrv$acceptAlert()     -> tells me: NoAlertOpenError  
remDrv$executeScript("driver.switchTo().alert().accept()")

我也尝试了这种方法。
remDrv$getWindowHandles()

但即使弹出窗口已经打开,该命令仍只返回一个窗口(开始的那个窗口,而不是弹出窗口),因此我无法使用:

remDrv$switchToWindow()

如何切换到弹出窗口?

有什么想法吗? 谢谢。


请先阅读此链接:http://ardesco.lazerycode.com/index.php/2012/07/how-to-download-files-with-selenium-and-why-you-shouldnt/ - reinierpost
1个回答

12

你看到的不是弹窗,而是下载对话框。所有浏览器中的下载对话框都是原生的, 不能通过JavaScript进行控制。你可以配置Firefox自动下载某些文件类型。你没有给我们很多信息。这可以通过设置一个适当的个人资料来完成。以下是一个下载一些财务数据的示例。我们在一个定制的个人资料中设置了四个选项。在下载文件之前,我们必须跳过一些麻烦的选项选择:

require(RSelenium)
fprof <- makeFirefoxProfile(list(browser.download.dir = "C:\\temp"
                                 ,  browser.download.folderList = 2L
                                 , browser.download.manager.showWhenStarting = FALSE
                                 , browser.helperApps.neverAsk.saveToDisk = "application/zip"))
RSelenium::startServer()
remDr <- remoteDriver(extraCapabilities = fprof)
remDr$open(silent = TRUE)
remDr$navigate("https://www.chicagofed.org/applications/bhc_data/bhcdata_index.cfm")
# click year 2012
webElem <- remDr$findElement("name", "SelectedYear")
webElems <- webElem$findChildElements("css selector", "option")
webElems[[which(sapply(webElems, function(x){x$getElementText()}) == "2012" )]]$clickElement()

# click required quarter

webElem <- remDr$findElement("name", "SelectedQuarter")
Sys.sleep(1)
webElems <- webElem$findChildElements("css selector", "option")
webElems[[which(sapply(webElems, function(x){x$getElementText()}) == "4th Quarter" )]]$clickElement()

# click button

webElem <- remDr$findElement("id", "downloadDataFile")
webElem$clickElement()

谢谢您的回复,您的示例有效。 不幸的是,我的下载文件扩展名为.DAT,并且我尝试了browser.helperApps.neverAsk.saveToDisk = "DAT file, application/octet-stream, zz-application/zz-winassoc-dat, application/x-download, application/octet-binary"但没有成功。 我忘了提到我使用的是Mac电脑,这可能会影响什么吗? - GrilloRob
你需要查明服务器为这个文件发送的 Mime 类型。 - jdharrison
嗨@jdharrison,你有没有什么建议让我找到服务器发送的MIME类型?该文件是.dat,建议的MIME类型应为“application/octet-stream”,但我尝试了却没有成功。 是否有任何选项可以告诉火狐“下载所有内容而不需要询问”? 提前致谢 - GrilloRob
Firefox没有下载所有设置。如果您使用Mac,可以尝试使用httpscoop或burpproxy之类的工具来获取mime类型。您可以在Firefox中使用类似HttpFox的工具,这非常简单。".dat"文件可能是任何东西,这实际上取决于服务器发送的mime类型。使用任何流量嗅探器都应该很容易地获取mime类型,但是如果没有特定的URL,我无法为您提供更多帮助。 - jdharrison
你的“.dat”文件是纯文本吗?你可以尝试使用“text/plain” MIME类型。 - jdharrison
感谢 @jdharrison 的帮助,通过 HttpFox,我已经能够了解到 MIME 类型,在这种情况下,它是:application/x-unknown。再次感谢! - GrilloRob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接