Rselenium不能单击所有单选按钮(只有其中一些)

时间:2019-07-04 21:52:32

标签: javascript r selenium web-scraping rselenium

我正在尝试通过RSelenium获得一些抓取技能,但遇到了困难。

我想为此page中的评论选择语言。但是,当弹出单选按钮列表出现时,我设法单击其中一些而不是其他。我想我确实正确地获得了元素。这是我尝试过的:

library(RSelenium)

remDr <- remoteDriver(
  remoteServerAddr = "localhost",
  port = 4445L,
  browserName = "firefox"
)

url <- "https://www.tripadvisor.com/Restaurant_Review-g187438-d12718258-Reviews-Prohobitox-Malaga_Costa_del_Sol_Province_of_Malaga_Andalucia.html"

remDr$navigate(url)

# click more language popup
webElems <- remDr$findElements(using = "css selector", ".taLnk") # taLnk is for dropdown like
webElemstext <- unlist(lapply(webElems, function(x) {x$getElementText()}))
webElems[[which(webElemstext == "More languages")]]$clickElement() 

enter image description here

我尝试通过这种方式获取单选按钮:

langues <- remDr$findElements(using = "class", "ui_radio")
langues_txt <-  unlist(lapply(langues, function(x) {x$getElementText()}))

> langues_txt
 [1] "All languages"  "English (120)"  "Spanish (66)"   "Norwegian (25)" "All languages" 
 [6] "English (120)"  "Spanish (66)"   "Norwegian (25)" "Dutch (22)"     "Swedish (13)"  
[11] "French (12)"    "German (10)"    "Italian (7)"    "Danish (3)"     "Finnish (2)"   
[16] "Portuguese (1)"

奇怪的是,我可以单击最后一个单选按钮,但不能单击其他按钮,但我不明白。如果我确实尝试单击完成,则:

langues[[14]]$clickElement() 
remDr$screenshot(display = TRUE)

enter image description here

什么都没发生。但是使用葡萄牙语:

langues[[16]]$clickElement() 
remDr$screenshot(display = TRUE)

enter image description here

在这里有效。 我看不到这两种情况之间的任何区别,因此找不到在弹出窗口中单击任何单选按钮的解决方案。

有什么想法吗?

编辑

我试图单击所有这些。我可以单击“所有语言”,“英语”,“挪威语”和“葡萄牙语”。即使采用了建议的解决方案,其他方法也无法起作用:

BigDataScientist解决方案

我确实加载了弹出菜单,并且之前删除了cookie:

remDr$deleteAllCookies()
remDr$navigate(url)

# click more language
webElems <- remDr$findElements(using = "css selector", ".taLnk") # taLnk est le css pour etendre des menus.
webElemstext <- unlist(lapply(webElems, function(x) {x$getElementText()}))
webElems[[which(webElemstext == "More languages")]]$clickElement() 

这是给出的解决方案

langues <- remDr$findElements(
  using = "xpath", 
  value = "/html/body/div/div/div/div[@class = 'ui_radio item']"
)
langues_txt <-  unlist(lapply(langues, function(x) {x$getElementText()}))
langues[[8]]$clickElement() # It should be german
remDr$screenshot(display = TRUE)

结果如下:

enter image description here

实际上,我只有12种语言,但仍然无法单击所需的按钮。

supputuri解决方案

这对我也不起作用:我都尝试过:

langElement <- remDr$findElement(using = "css", ".more-options .ui_radio.item:nth-of-type(8) input")
langElement$clickElement()
remDr$screenshot(display = TRUE)

langElement <- remDr$findElement(using = "css", ".more-options div[data-tracker='German'] input")
# click on language radio button
langElement$clickElement()
remDr$screenshot(display = TRUE)

没有工作:

enter image description here

3 个答案:

答案 0 :(得分:3)

问题的根源:

使用班级选择器,您还可以捕获首页平板电脑版本(?)的潜在语言设置。查看以下屏幕截图:

在第一行中,您将看到类choice is-shown-at-tabletenter image description here

解决方案:

您应该可以通过修改选择器来避免该问题(并排除数位板选项)。一种方法是使用完整的xpath(因为它与平板电脑选项的xpath不同)。

xpath将是:

/html/body/div/div/div/div[@class = 'ui_radio item']

测试:

从代码的可复制性开始:

url <- "https://www.tripadvisor.com/Restaurant_Review-g187438-d12718258-Reviews-Prohobitox-Malaga_Costa_del_Sol_Province_of_Malaga_Andalucia.html"

remDr$navigate(url)
# click more language popup
webElems <- remDr$findElements(using = "css selector", ".taLnk") # taLnk is for dropdown like
webElemstext <- unlist(lapply(webElems, function(x) {x$getElementText()}))
webElems[[which(webElemstext == "More languages")]]$clickElement()

然后使用新的选择器查找元素:

langues <- remDr$findElements(
  using = "xpath", 
  value = "/html/body/div/div/div/div[@class = 'ui_radio item']"
)

langues_txt <-  unlist(lapply(langues, function(x) {x$getElementText()}))
> langues_txt
[1] "All languages"  "English (120)"  "Spanish (67)"   "Norwegian (25)" "Dutch (22)"     "Swedish (13)"  
[7] "French (12)"    "German (10)"    "Italian (7)"    "Danish (3)"     "Finnish (2)"    "Portuguese (1)"

如您所见,您从16种语言选项降至12种语言(不包括双精度词),而只获得了屏幕截图中的一种。

您可以测试点击它们(例如德语):

langues[[8]]$clickElement()

注意:

您可能已经知道了,但是出于完整性考虑:如果要测试多种语言并单击一种语言,则必须在我的注释“开始”之后运行代码部分,再次弹出语言弹出窗口“ up”。以及代码的可重复性:”。

编辑:

很遗憾,我无法重现您的错误。您可以尝试一下吗?

langues <- remDr$findElements(
  using = "xpath", 
  value = "/html/body/div/div/div/div[@class = 'ui_radio item']/label[contains(text(), 'German')]"
)[[1]]$clickElement()

langues <- remDr$findElements(
      using = "xpath", 
      value = "/html/body/div/div/div/div[@class = 'ui_radio item']/label[contains(text(), 'German')]"
    )
remDr$executeScript("arguments[0].click();", args = langues[1])

答案 1 :(得分:1)

让我保持简单明了。

我建议使用以下CSS选择语言。

选项1:结合使用CSS和语言

.more-options div[data-tracker='Finnish'] input

这是脚本。

# find element using css
langElement <- remDr$findElement(using = "css", ".more-options div[data-tracker='XXXchangeLangHereXXX'] input")
# click on language radio button
langElement$clickElement()

截屏: enter image description here

选项2:基于索引使用CSS

如果要按索引选择语言(我相信不是您要找的语言),则可以使用以下方法。

# this css will get `Finnish` radio button
.more-options .ui_radio.item:nth-of-type(11) input 

这是脚本

# find element using css
langElement <- remDr$findElement(using = "css", ".more-options .ui_radio.item:nth-of-type(XXXChangeIndexHereXXX) input")
# click on language radio button
langElement$clickElement()

截屏: enter image description here

答案 2 :(得分:1)

当名称在所单击的容器内不够长时,单选按钮不会收到click事件。

单击元素时,驱动程序会将所有事件发送到位于所提供元素中心顶部的元素。

但是对于您而言,对于大多数元素,容器的中心点是容器本身,而不是预期的单选按钮。

如果您要可靠地单击单选按钮,请改为点击<label>

item <- remDr$findElement(using = 'css selector', "[data-tracker='German'] label")
item$clickElement()

或通过带有XPath的文本:

item <- remDr$findElement(using = 'xpath', '//label[contains(.,"German")]')
item$clickElement()