javascript - RSelenium 和 Javascript

标签 javascript r selenium web-scraping

我相当精通 R,但对 javaScript 和其他语言一无所知。我想访问有关此公开数据集 (http://fyed.elections.on.ca/fyed/en/form_page_en.jsp) 的信息。特别是,我在数据框中列出了数千个形式为 ('A1A1A1') 的邮政编码。我想将这些邮政编码中的每一个提交到该网站,然后提取返回的选区名称。 RSelenium 看起来很理想,但我不知道如何让 javascript 工作。 我正在使用 Mac OS 10.9.5,R 3.0.3 和 RSelenium_1.3。 Firefox 是 v.33,Selenium 是 2.44。以下脚本有效。

require(RSelenium)
checkForServer()
startServer()
remDr<-remoteDriver()
remDr$open()
remDr$getStatus()
remDr$navigate("http://fyed.elections.on.ca/fyed/en/form_page_en.jsp")

#After inspecting the source code, you can see the input box has the id 'pcode', for postal code
webElem<-remDr$findElement(using = 'id', value = "pcode")
webElem$getElementAttribute('id')

#This is where I am stuck
remDr$executeScript(script='arguments[0].click(m1p4v4)', list(webElem))

#Utlimately, I have a list of several thousand postal codes, so I would like to create a loop     through to extract all the district names that are stored on the pages that are returned with a successful javascript (see previous command). Three real postal codes that return results are as follows:  
p.codes<-c('m1p4v4', 'n3t2y3', 'n2h3v1')

我觉得我只是不理解必要的 javascript 命令或 executeScript 的语法来完成这项工作。如果有任何帮助,我将不胜感激。

最佳答案

你不需要在这里使用executeScript:

require(RSelenium)
checkForServer()
startServer()
remDr<-remoteDriver()
remDr$open()
remDr$getStatus()
remDr$navigate("http://fyed.elections.on.ca/fyed/en/form_page_en.jsp")

p.codes<-c('m1p4v4', 'n3t2y3', 'n2h3v1')
webElem<-remDr$findElement(using = 'id', value = "pcode")
webElem$sendKeysToElement(list(p.codes[1])) # send the first post code to the element

remDr$findElement("id", "en_btn_arrow")$clickElement() # find the submit button and click it

如果您想使用 executeScript 代替,您可以将最后一行替换为:

remDr$executeScript("arguments[0].click();"
                , list(remDr$findElement("id", "en_btn_arrow")))

executeScript 将脚本作为参数和列表。如果列表中的任何元素属于类 webElement 然后它们可以在脚本中像 DOM 元素一样被引用。在这种情况下,第一个元素(JavaScript 中的零索引)是一个 webElement 并且我们要求在我们的 JavaScript 中单击它。

此外,如果你检查按钮背后的源代码,你会发现当它被按下时它会调用 document.pcode.submit() 所以在这种情况下如果你想使用 就更简单了executeScript 你可以这样做:

remDr$executeScript("document.pcode.submit();")

关于javascript - RSelenium 和 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27109267/

相关文章:

r - 如何突出 ggplot 上的差异?

r - 最后一个下划线后分隔字符串

c# - 如何在 Windows 安全弹出窗口中按 TAB 按钮

java - 等待列表中的元素之一

javascript - 如何限制下拉值

javascript - 开源 scorm 播放器纯 javascript 和 html?

javascript - 如何在 Ubuntu 中恢复 npm 的默认全局路径?

javascript - 如何创建动态 html 文件

r - 如何在 ggplot2 对象的每个面上放置相同的平滑?

python-3.x - 我想使用 selenium python 从 anchor 标记获取文本我想打印文本 helloworld