2017-02-27 12 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] 'が未定義であると理解できました(もちろん非同期であると仮定します)。定義されていない...それはちょうど不可能です –

+0

Seconded。これはナンセンスのようです。 JSFiddleでこのエラーを再現することをお勧めします。あなたが報告しているエラーが実際に発生しているとは信じられません。 – AmericanUmlaut

+0

クロムウェブドライバを使用しているため、jsfiddleで再現できません。私はクラウド9を試してみましたが、それもうまくいきません。 – 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ダウン票..私はまた、ここで孤立スコープと思われる。 @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します –

関連する問題