2014-04-07 2 views
0

Я пытаюсь создать фиктивные веб-страницы в попытке проверить баланс нагрузки на сервере, я прохожу через 100 экземпляров элемента страниц и создаю его соответствующим образом. У меня возникают трудности при инъекции JS, это не делает его для всех баров последним в цикле.phantom js не впрыскивает javascript до конца цикла

for(var i=0; i<instances; i++) { 
    pages.push(require('webpage').create()); 
} 

console.log('Loading web page'); 
for(var i in pages) { 
    pages[i].customHeaders = { 
     'X-Forwarded-For': '192.111.111.'+i 
    }; 
    var ip = '192.111.111.'+i; 
    var mac = "00:00:00:00:00:"+i; 
    var serial = '000000000'+i; 

    console.log("Loading " + url + " in page " + i); 
    pages[i].onInitialized = function() { 
    if(!pages[i].injectJs("amino/VideoDisplay.js")) { 
     console.log("Can not include script 'VideoDisplay.js'"); 
     phantom.exit(1); 
    } 
    if(!pages[i].injectJs("amino/TVI.js")) { 
     console.log("Can not include script 'TVI.js'"); 
     phantom.exit(1); 
    } 
    if(!pages[i].injectJs("amino/PVR.js")) { 
     console.log("Can not include script 'PVR.js'"); 
     phantom.exit(1); 
    } 
    if(!pages[i].injectJs("amino/CEC.js")) { 
     console.log("Can not include script 'CEC.js'"); 
     phantom.exit(1); 
    } 
    if(!pages[i].injectJs("amino/Browser.js")) { 
     console.log("Can not include script 'Browser.js'"); 
     phantom.exit(1); 
    } 
    if(!pages[i].injectJs("amino/AVMedia.js")) { 
     console.log("Can not include script 'AVMedia.js'"); 
     phantom.exit(1); 
    } 
    if(!pages[i].injectJs("amino/AudioControl.js")) { 
     console.log("Can not include script 'AudioControl.js'"); 
     phantom.exit(1); 
    } 
    if(!pages[i].injectJs("amino/ASTB.js")) { 
     console.log("Can not include script 'ASTB.js'"); 
     phantom.exit(1); 
    } 
    if(!pages[i].injectJs("amino/AminoGeneric.js")) { 
     console.log("Can not include script 'AminoGeneric.js'"); 
     phantom.exit(1); 
    } 

}; 

pages[i].viewportSize = 'width: 1280, height: 720'; 
    pages[i].settings.userAgent = 'Opera/9.80 (Linux sh4 ; U; Amino; en) Presto/2.5.21 Version/10.30'; 
    pages[i].open(url, function() { 
    pages[i].evaluate(function(ip, mac, serial) { 
     ASTB.IpAddress = ip; 
     ASTB.MacAddress = mac; 
     ASTB.Serial = serial 
    }, ip, mac, serial); 
    }); 
} 

Любых идеи, я получаю ошибки говорят переменные ASTB неопределенны

ответ

2

Вы падаете в ловушку закрытия. Когда у вас есть анонимная функция, которая ссылается на переменную цикла, она лексически привязана к значению этой переменной в цикле. Поэтому, когда переменная цикла изменяется, значение, которое закрывает анонимная функция, также изменяется, так как оно указывает на ту же самую переменную. Обратный вызов .evaluate также асинхронен, поэтому он запускается после завершения цикла, после чего i указывает на последний элемент. Вы можете заставить сферу, как это так, используя другую функцию:

(function(i) { 

    page[i].evaluate(...); 

})(i); 

Или вы могли бы вызвать другую функцию:

evaluatePage(page, i); 

... 

function evaluatePage(page, i) { 
    page[i].evaluate(...); 
} 
+0

Im strugling немного здесь, я понимаю, где вы пришли с, однако я пытался в обоих направлениях и все еще не получая больше. 'pages [i] .open (url, function (status, i) {console.log (status) (function (i) { console.log (i); pages [i] .evaluate (function (ip, mac , последовательный) { ASTB.IpAddress = ф; \t ASTB.MacAddress = макинтош; \t \t ASTB.Serial = серийный }, IP, MAC, серийный); }) (я); }); ' – Charabon

Смежные вопросы