一尘不染

RSelenium和Javascript

selenium

我对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的语法。我将不胜感激。


阅读 274

收藏
2020-06-26

共1个答案

一尘不染

您不需要在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中单击它。

此外,如果您检查按钮后面的源代码,就会发现在按下按钮时它会document.pcode.submit()更简单地调用(在这种情况下,如果您想使用),executeScript您可以执行以下操作:

remDr$executeScript("document.pcode.submit();")
2020-06-26