我RSelenium用来导航到一个网页,其中包含一个下载文件的按钮.我使用RSelenium单击此按钮下载文件.但是,文件默认下载到我的文件夹'downloads'中,而我想将文件下载到我的工作目录中.我尝试指定一个chrome配置文件,如下所示,但这似乎没有做到这一点:
wd <- getwd()
cprof <- getChromeProfile(wd, "Profile 1")
remDr <- remoteDriver(browserName= "chrome", extraCapabilities = cprof)
Run Code Online (Sandbox Code Playgroud)
该文件仍然下载在"downloads"文件夹中,而不是我的工作目录中.怎么解决这个问题?
我正在使用RSelenium导航到网站并与元素进行交互.
问题:使用RSelenium,如何在下拉菜单中阅读选项列表,以便我可以识别可用的最新月份并使用它将下拉列表设置为正确的值?
在某个站点上,为用户提供了一个下拉菜单,用于设置一年中的月份,从而定义用于依次显示或下载月度数据的日期范围的结束点.随着全年提供额外数月的数据,下拉列表中的选项会发生变化.
截至7月底,下降将有1个选项,1月至6月.请注意,特定月份的数据会在该月末后的4-6周内发布,因此您不会在7月底之前获得6月份的数据,依此类推.我可以使用数字1到12设置值而没有任何问题,前提是下拉列表实际上包含相应的选项.
例如,如果7月的数据尚未发布(即,如果7月尚未出现在选项的下拉列表中),并且如果我尝试将下拉列表设置为"7",我将收到错误,我想避免.数据没有定期出现,因此我不能简单地假设月X的数据将出现在日期Y.
我相信Selenium本身有一个辅助类可用,但我不确定我是否可以通过RSelenium访问它.
示例代码如下 - 可能有点松懈,因为我还远未熟悉该软件包.
library(RSelenium)
RSelenium::checkForServer()
RSelenium::startServer()
remDr <- remoteDriver(remoteServerAddr = "localhost",
port = 4444,
browserName = "firefox"
)
remDr <- remoteDriver()
Sys.sleep(5)
remDr$open()
remDr$getStatus()
remDr$navigate("http://jamaserv.jama.or.jp/newdb/eng/index.html")
## Switch to left frame
frameElems <- remDr$findElements(using = "tag name", "frame")
sapply(frameElems, function(x){x$getElementAttribute("src")})
remDr$switchToFrame(frameElems[[1]])
webElem <- remDr$findElement(using = 'xpath', "//select[@name='txtTargetToMm']")
## Use javascript to set values
script <- paste0("arguments[0].value = '", 2, "'; arguments[0].onchange();") # set to February
remDr$executeScript(script, list(webElem))
webElem$getElementAttribute('value') # check to …Run Code Online (Sandbox Code Playgroud) 我试图抓取华盛顿邮报关于警察枪击事件的数据库。由于它不是 html 我不能使用rvest,所以我使用了RSelenium和phantomjs。
library(RSelenium)
checkForServer()
startServer()
eCap <- list(phantomjs.binary.path = "C:/Program Files/Chrome Driver/phantomjs.exe")
remDr <- remoteDriver(browserName = "phantomjs", extraCapabilities = eCap)
remDr$open()
remDr$navigate("http://www.washingtonpost.com/graphics/national/police-shootings/")
Run Code Online (Sandbox Code Playgroud)
检查来源后,很明显我感兴趣的项目具有以下内容id和class
<div id="js-list-690" class="listWrapper cf">
Run Code Online (Sandbox Code Playgroud)
或在 Chrome 中:
我可以访问单个项目的文本:
remDr$findElement("css", "#js-list-691")$getElementText()
Run Code Online (Sandbox Code Playgroud)
返回
[[1]]
[1] "An unidentified person, a 47-year-old Hispanic man, was shocked with a stun gun and shot on July 30, 2015, in Whittier, Calif. Los Angeles County deputies were investigating a domestic disturbance when …Run Code Online (Sandbox Code Playgroud) 有没有办法从 RSelenium 中的 RemoteDriver 获取纯文本?有些人认为:remDr$getPlainText()相当于remDr$getPageSource()。
解决方法:
我设法将 phantomJS 的纯文本保存到文件中,如下所示:
require(RSelenium)
pJS <- phantom()
Sys.sleep(5) # give the binary a moment
remDr = remoteDriver(browserName = 'phantomjs')
remDr$open()
remDr$phantomExecute('var page = this;
var fs = require(\"fs\");
page.onLoadFinished = function(status) {
var txtFile = fs.open(\"url.txt\", \"w\");
txtFile.write(page.plainText);
txtFile.close();
};')
remDr$navigate(some_url)
Run Code Online (Sandbox Code Playgroud)
但后来我必须阅读后记中的文件......
我的解决方法类似于https://cran.r-project.org/web/packages/RSelenium/vignettes/RSelenium-headless.html#id3b
当前正在抓取一个页面,该页面可以具有可变数量的元素,并且有时还使用不同的选择器格式化相同的数据元素。目前正在尝试使用一些 tryCatch 代码忽略 RSelenium 抛出的错误,但当指定的元素不在页面上时仍会停止:
result <- tryCatch({
webElem <- remDr$findElement('xpath', "//tr[(((count(preceding-sibling::*) + 1) = 9) and parent::*)]//span[(((count(preceding-sibling::*) + 1) = 1) and parent::*)]")
}, warning = function(cond) {
rank1_US <- NA
},
error = function(cond) {
rank1_US <- NA
}, finally = {
rank1_US <- webElem$getElementText() %>% unlist(.) %>% ifelse(length(.) == 0, NA, .)
})
Run Code Online (Sandbox Code Playgroud)
当在页面上找不到特定元素时会出现错误:
Selenium message:Unable to locate element: //tr[(((count(preceding-sibling::*) + 1) = 9) and parent::*)]//span[(((count(preceding-sibling::*) + 1) = 1) and parent::*)]
For documentation on this error, …Run Code Online (Sandbox Code Playgroud) 我正在尝试了解如何使用 R/RSelenium 上传文件。信息:
我尝试了这个问题的最高评论:
如何在 Java 中使用 Selenium WebDriver 上传文件
例子:
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)
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误消息:
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
Run Code Online (Sandbox Code Playgroud)
使用的文件夹映射到虚拟机。Autoit是不可能的,因为它只适用于 Windows。
还尝试了upload_btn$sendKeysToElement(list(path))不返回错误的方法,但它也不起作用。
任何帮助表示赞赏。
编辑:
我认为这应该有效,但在查看屏幕截图时看到错误:
default作为共享文件夹挂载到虚拟机并命名win_sharedefault创建了一个文件夹sudo mkdir vm_sharewin_share …我正在尝试使用 Rselenium 抓取网站。但是我收到一个错误:
Error: checkForServer is now defunct. Users in future can find the function in
file.path(find.package("RSelenium"), "examples/serverUtils"). The
recommended way to run a selenium server is via Docker. Alternatively
see the RSelenium::rsDriver function.
Run Code Online (Sandbox Code Playgroud)
我的 chrome 升级到 58 版,moxilla 升级到 45 版,rselenium 以前可以工作,但我不确定发生了什么,请帮助大家。
当使用 Selenium Server 3.4.0 和 Gecko Driver v0.18 时,此 Rselenium 命令有效。
remDr$setImplicitWaitTimeout(milliseconds = 15000)
Run Code Online (Sandbox Code Playgroud)
这是相关的代码块:
remDr <- remoteDriver()
remDr$open(silent = TRUE)
remDr$setImplicitWaitTimeout(milliseconds = 15000)
Run Code Online (Sandbox Code Playgroud)
但是,当使用 Gecko v0.18 或 v0.19 运行 Selenium Server 3.5.3 时,相同的代码会生成以下错误:
Selenium message:POST /session/91a1f43f-18b3-4e11-92a9-d738cd4049a4/timeouts/implicit_wait did not match a known command
Build info: version: '3.5.3', revision: 'a88d25fe6b', time: '2017-08-29T12:54:15.039Z'
System info: host: 'pc', ip: 'xxx.xxx.x.x', os.name: 'Windows 10', os.arch: 'x86', os.version: '10.0', java.version: '1.8.0_144'
Driver info: driver.version: unknown
Error: Summary: UnknownCommand
Detail: The requested resource could not be …Run Code Online (Sandbox Code Playgroud) 似乎这是一个反复出现的问题,但我还没有找到解决我的问题的方法。
我正在运行以下内容:
link <- 'https://www.google.com/'
rD <- rsDriver(verbose = TRUE,
port=4567L,
browserName = 'chrome',
chromever = '83.0.4103.39',
check = TRUE)
remDr <- rD$client
remDr$navigate(link)
Run Code Online (Sandbox Code Playgroud)
当我运行第一个时,我收到错误:
wdman::selenium(port = port, verbose = verbose, version = version, 中的错误:Selenium 服务器信号端口 = 4567 已在使用中。
我的 chrome 驱动程序与我的 R 项目位于同一文件夹中。
我如何使这项工作?我确实遵循了文档,但似乎没有任何效果!!!
任何帮助将非常感激!
溴
我在 R 中有以下代码:
library(RSelenium)
shell('docker run -d -p 4446:4444 selenium/standalone-firefox')
remDr <- remoteDriver(remoteServerAddr = "localhost", port = 4446L, browserName = "firefox")
remDr$open()
remDr$navigate("http://www.google.com/ncr")
remDr$getTitle()
Run Code Online (Sandbox Code Playgroud)
运行它时,它会在以下阶段冻结并且没有任何反应:
> remDr <- remoteDriver(remoteServerAddr = "localhost", port = 4446L, browserName = "firefox")
> remDr$open()
[1] "Connecting to remote server"
Run Code Online (Sandbox Code Playgroud)
我怀疑这可能是因为我通常使用 Chrome 作为浏览器,但即使我按照以下方式将浏览器名称更改为 chrome,也会出现同样的问题:
remDr <- remoteDriver(remoteServerAddr = "localhost", port = 4446L, browserName = "chrome")
Run Code Online (Sandbox Code Playgroud)
然后我还尝试了以下操作:
driver <- rsDriver(port = 4446L, browser = "chrome", chromever = NULL)
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果:
checking Selenium Server versions:
BEGIN: PREDOWNLOAD
BEGIN: DOWNLOAD …Run Code Online (Sandbox Code Playgroud) rselenium ×10
r ×9
selenium ×4
web-scraping ×2
docker ×1
file-upload ×1
phantomjs ×1
plaintext ×1
try-catch ×1