2017-02-27 2 views
-1

Ich kann names Array innerhalb driver.executeScript nicht zugreifen. Bitte schlagen Sie eine Lösung vor;brauche Hilfe, um den Variablenbereich zu lösen Problem

var webdriver = require('selenium-webdriver'), 
    By = webdriver.By, 
    until = webdriver.until; 
var driver = new webdriver.Builder().forBrowser('chrome').build(); 

var flow = webdriver.promise.controlFlow(); 
var names = ["name1", "name2"]; 
var len = names.length; 
var j = 0 
for (var i = 0; i < len; i++) { 
    flow.execute(function() { 
    console.log(names[j]); //this works fine. 
    driver.executeScript(function() { 
     //console.log(names[j]); //this gives errror [WebDriverError: unknown error: names is not defined] 
     //console.log('testing'); //this never logs 
    }); 
    j++; 
    }); 
} 
+1

wie geschrieben, ist dieses Problem nicht möglich. Ich könnte verstehen, wenn 'Namen [j]' undefiniert sind, weil 'j 'am Ende 2 wäre, bevor irgendein asynchroner Code in executeScript Callback ausgeführt wurde (vorausgesetzt, dass asynchron ist), aber Sie sagen, der Fehler ist, dass' Namen' ist undefined ... das ist einfach nicht möglich –

+0

abgeordnet. Das scheint Unsinn zu sein. Ich schlage vor, dass Sie versuchen, diesen Fehler in einem JSFiddle neu zu erstellen - ich kann einfach nicht glauben, dass der Fehler, den Sie melden, wirklich auftritt, wenn Sie ihn beschreiben. – AmericanUmlaut

+0

Ich kann es nicht auf jsfiddle reproduzieren, weil es Chrome-Web-Treiber verwendet. Ich habe sogar cloud9 ide probiert, aber das hat auch nicht funktioniert. – Triven

Antwort

2

Sie können die Funktion mit einem Parameter definieren und Namen darin eingeben;

for(var i=0;i<len;i++){ 
    flow.execute(function(){ 
     console.log(names[j]); //this works fine. 
     driver.executeScript(func(names[j])) 
     j++; 
    }); 
} 

function func(name) { 
    console.log(name); 
    console.log('testing'); 
} 

Bessere Zugriff auf globale Variablen zu umgehen, versuchen Sie Variablen zu übergeben & sie geben einen lesbaren & wartbaren Code zu halten.

+0

Warum gibt der Zugriff auf die globale Variable des OPs, wie in der Frage gezeigt, einen Fehler aus? – nnnnnn

+0

Es sollte nicht, aber irgendwie könnte der Fahrer einen isolierten Bereich haben, aber meine Antwort löst es, ohne sich darum zu kümmern, oder? –

+0

Nicht sicher, warum 3 Stimmen runter .. Ich vermute auch isoliert Scoping hier. @bureaquete Antwort löste das Problem. Hinweis: Es hat etwas länger gedauert, bis ich geantwortet habe, weil ich versucht habe, eine funktionierende Demo dieses Problems zu erstellen. Ich habe versucht, cloud9, runnable.com/ etc, aber kein Glück .. Wenn Sie denken, dass es unmöglich ist, dann bitte ich Sie zu versuchen, auf Ihrem System zu reproduzieren. – Triven

1

Hinweis: Danke @bureaquete für Sie zu beantworten. Das hat auch für mich funktioniert.

var webdriver = require('selenium-webdriver'), 
    By = webdriver.By, 
    until = webdriver.until; 
var driver = new webdriver.Builder().forBrowser('chrome').build(); 

var flow = webdriver.promise.controlFlow(); 
var names = ["name1","name2"]; 
var len = names.length; 
var j=0 
for(var i=0;i<len;i++){ 
    flow.execute(function(name) { 
    return function(){ 
     var str = console.log(name); 
    } 
    }(names[j])); 
j++ 
} 
+1

Siehe aktualisierte Kommentare :) – Triven

+0

@trieven Können Sie das überprüfen? Sie hatten dieses Problem richtig? jsbin.com/boholukafa/edit?js,console,output Mit meiner Antwort erhalten Sie das richtige Protokoll, aber auch ein Fehler ist das? Auch wenn Sie meine Bearbeitung genehmigen können, werde ich Ihre Frage auffrischen –

Verwandte Themen