Rselenium - 如何刮取所有下拉列表选项值

时间:2016-10-10 00:12:30

标签: r drop-down-menu rselenium

如何使用Rselenium来删除下拉列表中的所有选项值?

页面来源示例:

<select name="main$ddArea" onchange="javascript:setTimeout(&#39;__doPostBack(\&#39;main$ddArea\&#39;,\&#39;\&#39;)&#39;, 0)" id="main_ddArea" class="groupTextBox">
<option selected="selected" value="95182">Area 1</option>
<option value="95183">Area 2</option>
<option value="95184">Area 3</option>
<option value="95185">Area 4</option>
<option value="95186">Area 4</option>
</select>

需要的结果是一个向量,每个值都作为一个元素。例如,values = c(“95182”,“95183”,“95184”,“95185”,“95186”)

获取值的字符串也可能有效,因为它可以拆分为元素,例如,使用strsplit。

带有'value'或'option'的getElementAttribute()不起作用。如,

dd.areas = remDr$findElement(using='id', value="main_ddArea")
dd.areas$getElementAttribute('option')

dd.areas$getElementAttribute('value')

getElementText()找到一个文本字符串,例如“Area 1 / n Area 2 / n Area 3 / n ....”。但该文本以后不能用于导航下拉列表。换句话说,当使用$findelement()导航下拉列表时,需要一个值来填充下拉列表;文字不起作用。

package documentation似乎不包含对下拉列表的引用,vignette也没有。

1 个答案:

答案 0 :(得分:3)

您可以使用findElement定位select代码,然后获取outerHTML并解析生成的html:

remDr$navigate("https://www.tutorialspoint.com/html/html_select_tag.htm")
webElem <- remDr$findElement("name", "dropdown")
appHTML <- webElem$getElementAttribute("outerHTML")[[1]]
doc <- htmlParse(appHTML)
doc["//option", fun = function(x) xmlGetAttr(x, "value")]

> doc["//option", fun = function(x) xmlGetAttr(x, "value")]
[[1]]
[1] "Data Structures"

[[2]]
[1] "Data Mining"

当使用基于gecko的浏览器运行selenium server 2时,Firefox和get元素属性出现了一些问题,请参阅GetAttribute of WebElement in Selenium Firefox Driver Returns Empty。在这种情况下,您可以使用JavaScript来获取属性

remDr$navigate("https://www.tutorialspoint.com/html/html_select_tag.htm")
webElem <- remDr$findElement("name", "dropdown")
jsScript <- "var element = arguments[0]; return element.outerHTML;"
appHTML <- remDr$executeScript(jsScript, list(webElem))[[1]]
doc <- htmlParse(appHTML)
doc["//option", fun = function(x) xmlGetAttr(x, "value")]

> doc["//option", fun = function(x) xmlGetAttr(x, "value")]
[[1]]
[1] "Data Structures"

[[2]]
[1] "Data Mining"