2014-03-04 39 views
4

我想登錄到Web應用程序並開始模擬 - 即訪問某些頁面並更改某些值。node.js zombie.js多個瀏覽器錯誤

我的代碼是:

var Browser = require("zombie"); 

fail = function (error) {console.log(error)} 

function login(browser){ 
    //console.log("login") 

    return browser.visit("http://example.com/login").then(function(){ 
     browser.fill('input[name="email"]', '[email protected]') 
     browser.fill('input[name="password"]', 'example') 
     browser.pressButton("#login") 
     return browser.wait().then(function() { 
      return browser; 
     }) 

    }) 
} 

function simpleScenario(browser, id) { 
    //browser.wait().then(function() { 

     browser.visit("http://example.com/next_page") 
      .then(function() { 
       browser.wait(function() { 

        var n = 5; 
        var step = function() { 
         var period = 100 + n;      

         browser.evaluate("m.productvalue(" + period + ")"); 

         if(n > 0) { 
          setTimeout(step, 1000); 
         }      
         n--; 
        }; 
        step() 

       }) 
       .fail(fail) 
      }); 
    //}); 
} 

function sampleScenario(id) { 
    var browser = new Browser({debug:false}) 
    login(browser) 
     .then(function() { 
      console.log("logged in"); 
      simpleScenario(browser, id); 
     }) 
     .fail(fail); 
} 

function loadTest(numberOfThreads) { 
    for(i = 0; i < numberOfThreads; i++) { 
     sampleScenario(i) 
    } 
} 

loadTest(50); 

我的問題是:當我在一個循環中執行一次我的功能,一切都OK了,但是當numberOfThreads是10個或更多,我得到一個錯誤:
[類型錯誤:不能使用「在」操作來搜索空「compareDocumentPosition」]
看來,如果有很多瀏覽器創建的對象,那麼殭屍不能管理它。 也許殭屍庫太慢,無法使用多線程?如果不使用Zombie.js,只能使用node.js,我可以做同樣的事情嗎?或者,也許我的腳本的某些部分需要優化以運行Zombie.js?

回答

1

錯誤消息[TypeError: Cannot use 'in' operator to search for 'compareDocumentPosition' in null]表示殭屍嘗試將響應內容加載到Document對象中,但響應內容爲null,這表示內容尚未響應。

請注意,您的login功能的目的不是要正確處理登錄過程,因爲沒有什麼衡量登錄成功與否。至少你應該添加一些wait功能:

function login(browser) { 

    return browser.visit('http://example.com/login').then(function() { 
     browser.fill('input[name="email"]', '[email protected]') 
      .fill('input[name="password"]', 'example') 
      .pressButton("#login").then(function() { 
       // check if h1 tag is there in 7 seconds. 
       return browser.wait({waitDuration: '7s', element: "h1"}); 
      }); 
    }) 
} 

根據您的simpleScenario,則必須在wait返回的東西不falsy值。或殭屍會一直等到5秒。

0

我也有過類似的問題,它得到了通過移除調試選項來解決,而創建瀏覽器實例。 另外降級到V1.4.1爲2.0是在alpha階段