我对R相当精通,但是对javaScript和其他语言一无所知。我想访问有关此公开可用数据集的信息(http://fyed.elections.on.ca/fyed/zh- CN/form_page_en.jsp)。尤其是,我在数据框中列出了几千个(A1A1A1)形式的邮政编码。我想将这些邮政编码中的每一个都提交到此网站,然后提取返回的选举区的名称。RSelenium似乎很理想,但是我无法弄清楚如何使JavaScript正常工作。我正在使用R 3.0.3和RSelenium_1.3的Mac OS 10.9.5。Firefox是第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这里使用:
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中的零索引)是a webElement,我们要求在JavaScript中单击它。
webElement
此外,如果您检查按钮后面的源代码,就会发现在按下按钮时它会document.pcode.submit()更简单地调用(在这种情况下,如果您想使用),executeScript您可以执行以下操作:
document.pcode.submit()
remDr$executeScript("document.pcode.submit();")