2016-10-21 9 views
2

Ich verwende RSelenium. Dieser folgende Code ist ein JavaScript-Commnad. Ich habe es in einer Schleife verwendet und es funktioniert gut während der ersten Iteration. Aber ich habe ein Problem während der zweiten Iteration. HierRekursive Indizierung auf Ebene 3 fehlgeschlagen - Rselen

ist der Code, den ich habe:

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

Der Fehler, den ich erhalten ist:

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

Hier ist die reproduzierbare Beispiel ist wie gewünscht:

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()) 
} 

Ich habe bemerkt, dass, wenn Ich entferne diese Linie

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

, das Problem ist weg und die Iteration funktioniert ordnungsgemäß. Aber das Problem ist, dass ich diese Zeile brauche und in der zweiten Schleife das Fehler-Popup und das Skript anhalten.

+0

Versuchen Sie eine Rückkehr 'remDr $ executeScript (" window.setInterval (function() {window.scrollBy (0, 300);}, 100); zurückgeben; ", args = list())' – jdharrison

+0

@jdharrison Leider das hat es nicht gelöst. Ich bekomme immer noch den Fehler und es stoppt das Skript –

+1

Bitte geben Sie ein reproduzierbares Beispiel, das das Problem zeigt, das Sie haben. – jdharrison

Antwort

0

Ich fand eine Lösung, die offensichtlich nicht die beste ist, aber ich habe getestet und es funktioniert. Verwenden Sie try() jedes Mal, wenn Sie einen Javascript-Code injizieren. Der Fehler wird weiterhin angezeigt, aber diese Methode verhindert, dass die Iteration gestoppt wird. Gleichzeitig wird die Funktion erfolgreich ausgelöst. So sollte der Code wie folgt sein: try(remDr$executeScript("window.setInterval(function() {window.scrollBy(0, 300);}, 100)", args = list())) Diese Arbeits und getestet:

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())) 
} 

Sie catch verwenden können, um den Fehler in mehr richtige Art und Weise zu fangen. Natürlich ist es die beste Lösung, diesen Fehler zu vermeiden, aber diese Antwort könnte Ihnen helfen, wenn Ihr Ziel nur darin besteht, Ihr Skript zum Laufen zu bringen.