Rselenium не может нажать на все радио кнопки (только некоторые из них) - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь получить некоторые навыки скребка с RSelenium, и я сталкиваюсь с трудностью.

Я хочу выбрать языки для комментариев на этой странице .Но когда появляется всплывающий список переключателей, мне удается щелкнуть некоторые из них, а не другие.Я думаю, что я получил элементы правильно, хотя.Вот что я попробовал:

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

Вот это сработало.Я не вижу никакой разницы между этими двумя ситуациями, поэтому я не нахожу решение, чтобы щелкнуть какую-либо радиокнопку во всплывающем окне.

Есть идеи?

edit

Я пытался нажать на все из них.Я могу нажать «Все языки», «Английский», «Норвежский» и «Португальский».Ни один из остальных не работает, даже с предлагаемым решением:

Решение BigDataScientist

Я загрузил всплывающее меню и удалил куки раньше:

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 языков, но явсе еще не могу нажать на нужные мне кнопки.

решение суппутури

У меня тоже не работает: я пробовал оба:

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 ]

3 голосов
/ 07 июля 2019

Корень проблемы:

При использовании селектора классов вы также фиксируете потенциальные языковые настройки для версии планшета (?) Домашней страницы. Посмотрите на следующий скриншот:

В первой строке вы видите класс choice is-shown-at-tablet. enter 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()

Примечание:

Возможно, вы уже знаете это, но для полноты: если вы хотите протестировать несколько языков и уже щелкнули по одному, вам нужно снова вызвать всплывающее окно "вверх", запустив раздел кода после моего комментария "Начало работы" с вашим кодом для воспроизводимости: ".

Edit:

К сожалению, я не могу воспроизвести вашу ошибку. Не могли бы вы попробовать это:

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 голос
/ 09 июля 2019

Радиокнопка не получает событие щелчка, когда имя недостаточно длинное в контейнере, по которому щелкнули.

При щелчке по элементу драйвер отправляет все события элементу, представленному вверху в центре предоставленного элемента.

Но в вашем случае и для большинства элементов центральной точкой контейнера является сам контейнер, а не ожидаемая радиокнопка.

Если вы хотите надежно щелкнуть переключатель, то вместо этого нажмите <label>:

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

Или по тексту с XPath:

item <- remDr$findElement(using = 'xpath', '//label[contains(.,"German")]')
item$clickElement()
1 голос
/ 08 июля 2019

Позвольте мне сделать вещи простыми и прямыми.

Я бы предложил выбрать язык с помощью приведенного ниже 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

...