我正在尝试通过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()
我尝试通过这种方式获取单选按钮:
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)
什么都没发生。但是使用葡萄牙语:
langues[[16]]$clickElement()
remDr$screenshot(display = TRUE)
在这里有效。 我看不到这两种情况之间的任何区别,因此找不到在弹出窗口中单击任何单选按钮的解决方案。
有什么想法吗?
我试图单击所有这些。我可以单击“所有语言”,“英语”,“挪威语”和“葡萄牙语”。即使采用了建议的解决方案,其他方法也无法起作用:
我确实加载了弹出菜单,并且之前删除了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)
结果如下:
实际上,我只有12种语言,但仍然无法单击所需的按钮。
这对我也不起作用:我都尝试过:
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)
没有工作:
答案 0 :(得分:3)
问题的根源:
使用班级选择器,您还可以捕获首页平板电脑版本(?)的潜在语言设置。查看以下屏幕截图:
在第一行中,您将看到类choice is-shown-at-tablet
。
解决方案:
您应该可以通过修改选择器来避免该问题(并排除数位板选项)。一种方法是使用完整的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()
选项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()
答案 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()