2017-02-27 2 views
-1

names 배열 driver.executeScript에 액세스 할 수 없습니다. 해결책을 제안하십시오.가변 범위 문제를 해결하는 데 도움이 필요

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

서면으로,이 문제는 불가능합니다. executeScript 콜백에서 비동기 코드가 실행되기 전에'j'가 2가 될 것이기 때문에'names [j]'가 정의되지 않았다면 이해할 수 있습니다 (당연히 비동기라고 가정)하지만'names'는 정의되지 않았습니다 ... 그건 단지 가능하지 않습니다. –

+0

Seconded. 이것은 말도 안되는 것처럼 보입니다. 나는 당신이 JSFiddle에서이 에러를 다시 만들 것을 제안한다 - 나는 당신이보고하는 에러가 정말로 당신이 그것을 묘사 할 때 발생한다고 믿을 수 없다. – AmericanUmlaut

+0

크롬 웹 드라이버를 사용했기 때문에 jsfiddle에서 재현 할 수 없습니다. 나는 심지어 cloud9 ide 시도했지만 그 또한 효과가 없습니다. – Triven

답변

2

매개 변수로 함수를 정의하고 이름을 전달할 수 있습니다.

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'); 
} 

전역 변수에 접근 회피하기 위해 더 나은, 읽을 수있는 & 유지 보수 코드를 유지하기 위해 그들을 돌아 & 변수를 전달하려고합니다.

+0

질문에 표시된 것처럼 OP의 전역 변수에 액세스하면 오류가 발생하는 이유는 무엇입니까? – nnnnnn

+0

그건 아니지만, 어쨌든 드라이버가 격리 된 범위를 가질 수도 있지만 내 대답은 그 문제를 신경 쓰지 않고 해결합니다. –

+0

확실하지 왜 3 down votes .. 나는 또한 여기에 고립 된 스코프를 의심한다. @bureaquete 대답이 문제를 해결했습니다. 참고 :이 문제에 대한 작업 데모를 만들려고했기 때문에 답장하는 데 약간의 시간이 걸렸습니다. 나는 cloud9, runnable.com/ 등을 시도했지만 운이 없다. 당신이 그것이 불가능하다고 생각된다면 당신의 시스템에서 재생산을 시도 할 것을 요청한다. – Triven

1

참고 : @bureaquete에게 답변 해 주셔서 감사합니다. 이것은 또한 나를 위해 일했다.

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

업데이트 된 댓글보기 :) – Triven

+0

@trieven 이것을 확인할 수 있습니까? 이 문제가 옳았습니까? jsbin.com/boholukafa/edit?js,console,output 제 답변으로 올바른 로그를 얻었지만 오류가 있습니까? 또한 내 편집을 승인 할 수 있으면 귀하의 질문을 upvote 것입니다 –

관련 문제