Рекурсивное индексирование не удалось на уровне 3 - Rselenium

Пользуюсь RSelenium. Следующий код представляет собой команду Javascript. Я использовал его в цикле, и он хорошо работает на первой итерации. Но у меня проблема во второй итерации.

Вот код, который у меня есть:

remDr$executeScript("window.setInterval(function() {window.scrollBy(0, 300);}, 100)", args = list())

Я получаю следующее сообщение об ошибке:

Error in out[[wInd]] : recursive indexing failed at level 3

Вот воспроизводимый пример по запросу:

remDr <- remoteDriver(browserName = "chrome", nativeEvents=FALSE)
remDr$open()

url_site <-'https://www.aliexpress.com/category/1909/digital-camera.html?site=glo&pvId=351-350381&attrRel=or&isrefine=y'

remDr$navigate(url_site) # navigates to webpage

remDr$setImplicitWaitTimeout(10000000)
remDr$setTimeout(type = "page load", milliseconds = 10000000)
Sys.sleep(6)
# remDr$executeScript("document.getElementById('alibaba-login-box').getElementById('fm-login-id').value = '[email protected]';alert();", args = list())

master <- data.frame()
n <- 3 # number of pages to scrape.  80 pages in total.  I just scraped 5 pages for this example.

for(i in 1:n) {

start <- i
if (i == 1 ) {
  i<-''
} 

url_site<-(sprintf('https://www.aliexpress.com/category/1909/digital-camera/%s.html?isrefine=y&site=glo&pvId=351-350381&tag=', i))

cat('display results:',(start),'-',(start+29) ,'in  page', start, 'now \n',url_site,'\n')

site <- url_site
# Sys.sleep(5)
remDr$navigate(site)

remDr$setImplicitWaitTimeout(10000000)
remDr$setTimeout(type = "page load", milliseconds = 10000000)

# Sys.sleep(5)
remDr$executeScript("my_interval = window.setInterval(function() {window.scrollBy(0, 300);}, 100);return;", args = list())
# Sys.sleep(5)
cat('a')

NamewebElems <- remDr$findElements(using = 'css selector', ".detail h3 a")

remDr$executeScript("clearInterval(my_interval);", args = list())
}

Заметил, что если убрать эту строчку

 NamewebElems <- remDr$findElements(using = 'css selector', ".detail h3 a")

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


person Community    schedule 21.10.2016    source источник
comment
Попробуйте добавить возврат remDr$executeScript("window.setInterval(function() {window.scrollBy(0, 300);}, 100); return;", args = list())   -  person jdharrison    schedule 22.10.2016
comment
@jdharrison К сожалению, это не решило проблему. Я все еще получаю сообщение об ошибке, и он останавливает скрипт   -  person    schedule 22.10.2016
comment
Приведите воспроизводимый пример, демонстрирующий возникшую у вас проблему.   -  person jdharrison    schedule 22.10.2016
comment
@jdharrison, пожалуйста, посмотрите воспроизводимый пример, который я только что добавил   -  person    schedule 22.10.2016
comment
Попробуйте версию для разработчиков devtools::install_github("ropensci/RSelenium") исправлена ​​проблема с возвратом нескольких веб-элементов.   -  person jdharrison    schedule 22.10.2016


Ответы (1)


Я нашел решение, которое явно не самое лучшее, но я протестировал его, и оно работает. Используйте try () каждый раз, когда вставляете код javascript. Ошибка все равно появится, но этот метод предотвратит остановку итерации. При этом функция запускается успешно. Итак, ваш код должен быть таким: try(remDr$executeScript("window.setInterval(function() {window.scrollBy(0, 300);}, 100)", args = list())) Это работает и протестировано:

remDr <- remoteDriver(browserName = "chrome", nativeEvents=FALSE)
remDr$open()

url_site <-'https://www.aliexpress.com/category/1909/digital-camera.html?site=glo&pvId=351-350381&attrRel=or&isrefine=y'

remDr$navigate(url_site) # navigates to webpage

remDr$setImplicitWaitTimeout(10000000)
remDr$setTimeout(type = "page load", milliseconds = 10000000)
Sys.sleep(6)
# remDr$executeScript("document.getElementById('alibaba-login-box').getElementById('fm-login-id').value = '[email protected]';alert();", args = list())

master <- data.frame()
n <- 3 # number of pages to scrape.  80 pages in total.  I just scraped 5 pages for this example.

for(i in 1:n) {

start <- i
if (i == 1 ) {
  i<-''
} 

url_site<-(sprintf('https://www.aliexpress.com/category/1909/digital-camera/%s.html?isrefine=y&site=glo&pvId=351-350381&tag=', i))

cat('display results:',(start),'-',(start+29) ,'in  page', start, 'now \n',url_site,'\n')

site <- url_site
# Sys.sleep(5)
remDr$navigate(site)

remDr$setImplicitWaitTimeout(10000000)
remDr$setTimeout(type = "page load", milliseconds = 10000000)

# Sys.sleep(5)
try(remDr$executeScript("my_interval = window.setInterval(function() {window.scrollBy(0, 300);}, 100);return;", args = list()))
# Sys.sleep(5)
cat('a')

NamewebElems <- remDr$findElements(using = 'css selector', ".detail h3 a")

try(remDr$executeScript("clearInterval(my_interval);", args = list()))
}

Вы можете использовать catch, чтобы более правильно отловить ошибку. Очевидно, что лучшее решение - предотвратить эту ошибку, но этот ответ может помочь вам, если ваша цель - просто заставить ваш скрипт работать.

person Community    schedule 22.10.2016