Ошибка драйвера rselenium с использованием цикла применения

Я использую rselenium для автоматизации навигации по страницам в Firefox. Мой rscript импортирует фрейм данных для различных условий и создает настраиваемую функцию, которая затем вызывается с помощью команды apply. В функции на каждый столбец ссылаются примерно так:

#create the function
example <- function(dat) {
    webElem$sendKeysToElement(list(dat[[column1]]))
    #Enters text from the column in the web driver
}
apply(df, 1, example) #Should repeat the function for each row of the data

У меня есть несколько столбцов, на которые я ссылаюсь в функции apply, чтобы данные из каждого из них могли взаимодействовать с веб-драйвером по-разному - например, dat[[column2]], dat[[column3]] и т. Д. В основном я просто отправляю ключи (вкладки и клавиши со стрелками после findElement(using = 'tag name', 'body') или нажимаю кнопку, которую нахожу с функцией findElement и ее идентификатором.

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

Error:   Summary: NoSuchDriver
     Detail: A session is either terminated or not started
     class: org.openqa.selenium.NoSuchSessionException
     Further Details: run errorDetails method

Я думаю, что это восходит к findElements вызовам в начале функции или sendKeysToElement вызову. Я попытался закрыть, выйти и повторно инициализировать удаленный драйвер, но, похоже, это не имеет значения. Есть какие-нибудь советы по устранению неполадок? Или хороший способ сделать повторную навигацию с селеном в r?


person Andrew Jackson    schedule 28.10.2016    source источник


Ответы (1)


Я смог решить эту проблему, переделав свой код из функции apply в цикл for(...). Созданная мною функция была изменена минимально.

  • Я запустил веб-драйвер в начале цикла

    remDr <- remoteDriver(extraCapabilities = list(marionette = TRUE))       
    remDr$open(silent = TRUE)
    remDr$navigate(url)
    
  • На протяжении всего цикла я тщательно передавал переменные методам, использующим rselenium, например, findElement и sendKeysToElement. Это выглядело примерно так:

    nextBtn(pageBody, remDr)
    

    что было сокращением для:

    nextBtn <- function(element=pageBody, driver=remDr) {
      Sys.sleep(.5)
      driver$findElement(using = 'id',value = "NextButton")$clickElement()
      Sys.sleep(2.5)
    }
    

    Я думаю, что из-за того, что методы вызывались в отдельных функциях, они требовали указания на правильные элементы драйвера (хотя я пытался установить значение по умолчанию)

  • И в конце цикла for код закрыл веб-драйвер:

    remDr$close()
    remDr$quit()
    

Фактический вызов цикла был

for (i in 1:nrow(df)) {
  surveys(df[i,])
}

Конечным результатом является то, что цикл функционирует. Он каждый раз открывает новый экземпляр драйвера, но ошибок не было. Ссылки на конкретную колонку по-прежнему делались с df[[mold0to2]].

person Andrew Jackson    schedule 29.10.2016