Используйте R Selenium для обработки всплывающих окон

#r #selenium #xpath #rselenium

#r #селен #xpath #rselenium

Вопрос:

Как я могу перейти по ссылке, щелкнуть ссылку и извлечь оттуда данные?

Я пробовал этот код, но безуспешно.

 library("RSelenium")
startServer()
mybrowser <- remoteDriver()
mybrowser$open()
mybrowser$navigate("https://finance.yahoo.com/quote/SBUX/balance-sheet?p=SBUX")
# click 'Quarterly' button...
  

Что-то вроде того, что близко, это.

Сейчас тестирую обновленный код; результаты ниже.

 > rm(list=ls())
> 
> 
> library("RSelenium")
> startServer()
Error: startServer is now defunct. Users in future can find the function in
    file.path(find.package("RSelenium"), "examples/serverUtils"). The
    recommended way to run a selenium server is via Docker. Alternatively
    see the RSelenium::rsDriver function.
> mybrowser <- remoteDriver()
> mybrowser$open()
[1] "Connecting to remote server"
Error in checkError(res) : 
  Undefined error in httr call. httr output: Failed to connect to localhost port 4444: Connection refused
> mybrowser$navigate("https://finance.yahoo.com/quote/SBUX/balance-sheet?p=SBUX")
Error in checkError(res) : 
  Undefined error in httr call. httr output: length(url) == 1 is not TRUE
> mybrowser$findElement("xpath", "//button[text() = '
                        
                        OK
                        ']")$clickElement()
Error in checkError(res) : 
  Undefined error in httr call. httr output: length(url) == 1 is not TRUE
> mybrowser$findElement("xpath", "//span[text() = 'Quarterly']")$clickElement()
Error in checkError(res) : 
  Undefined error in httr call. httr output: length(url) == 1 is not TRUE
> 
  

Ответ №1:

Я думаю, что это может быть случай, когда вы сталкиваетесь с этим на веб-сайте.

введите описание изображения здесь

Вы можете просто «нажать» кнопку OK через:

 mybrowser$findElement("xpath", "//button[text() = '

                            OK
                    ']")$clickElement()
  

И затем вы можете нажать «ежеквартально» через:

 mybrowser$findElement("xpath", "//span[text() = 'Quarterly']")$clickElement()
  

(Подсказка: для выявления ошибок такого рода может быть полезно проверить текущее состояние браузера через: remDr$screenshot(TRUE) .)

Я не уверен, что он актуален, но определенные данные также доступны через API, вы могли бы проверить пакет quantmod, чтобы получить более легкий доступ.

Полный пример:

 library("RSelenium")
startServer()
mybrowser <- remoteDriver()
mybrowser$open()
mybrowser$navigate("https://finance.yahoo.com/quote/SBUX/balance-sheet?p=SBUX")
mybrowser$findElement("xpath", "//button[text() = '

                            OK
                    ']")$clickElement()
mybrowser$findElement("xpath", "//span[text() = 'Quarterly']")$clickElement()
  

Комментарии:

1. Я только что обновил свой первоначальный вопрос опубликованным вами кодом. Я получаю эту ошибку: Ошибка: попытка применить нефункциональные Какие-либо мысли? Да, возможно, API сработал бы. Я, конечно, могу разобраться в этом. Мне было любопытно узнать о опции веб-синтаксического анализа. Хотя, возможно, это слишком громоздко. Если у вас есть какие-либо дополнительные идеи, я определенно был бы рад услышать о них.

2. на всякий случай, мой код использует ваш элемент «mybrowser», который является частью вашей попытки rselenium, а не самой первой попытки. Не могли бы вы это перепроверить?

3. Я вставил туда ‘mybrowser’ и получаю эту ошибку: Ошибка в checkError (res): неопределенная ошибка в вызове httr. вывод httr: длина (url) == 1 не соответствует ДЕЙСТВИТЕЛЬНОСТИ

4. 1. Не могли бы вы, пожалуйста, убедиться, что вы можете перейти на страницу, указанную вами через mybrowser$navigate("https://......") 2. Не могли бы вы указать, какая команда выдает ошибку, о которой вы упомянули 3. Не могли бы вы, пожалуйста, запустить код «Полного примера» в моем отредактированном ответе. Возможно, вы изменили код и удалили пробелы и разрывы строк из "//button[text() = ' OK части. Спасибо

5. Хорошо, тогда ваш удаленный драйвер даже не $open() . Это своего рода новый вопрос. Сложно отлаживать это через Интернет. Смешно сказать, но вы пробовали перезапуск? 🙂