2014-03-04 8 views
4

웹 응용 프로그램에 로그인하여 시뮬레이션을 시작합니다. 즉, 일부 페이지를 방문하고 일부 값을 변경합니다.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 이상인 경우, 오류가 발생합니다 :
[TypeError : 'in'연산자를 사용하여 'compareDocumentPosition'을 (를) null로 검색 할 수 없습니다.
생성 된 브라우저 개체가 많으면 좀비가 관리 할 수없는 것처럼 보입니다. 좀비 라이브러리가 너무 느려서 많은 스레드에서 작동하지 않을 수 있습니까? Zombie.js를 사용하지 않고 node.js 만 사용하여 동일한 작업을 수행 할 수 있습니까? 아니면 내 스크립트의 일부가 Zombie.js와 함께 실행되도록 최적화되어야합니까?

답변

1

오류 메시지 [TypeError: Cannot use 'in' operator to search for 'compareDocumentPosition' in null]은 좀비가 응답 콘텐츠를 Document 개체에로드하려고 시도하지만 응답 콘텐츠가 null 인 것을 의미합니다. 즉 콘텐츠가 아직 응답하지 않음을 의미합니다.

login 함수는 로그인 성공 여부를 확인할 수 없으므로 로그인 프로세스를 올바르게 처리 할 수 ​​없습니다. 적어도 당신은 wait 기능에 뭔가를 추가해야합니다 : 당신의 simpleScenario에 따르면

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

, 그것은 wait 뭔가하지 falsy 값을 반환해야합니다. 또는 좀비는 5 초 동안 기다리게됩니다.

0

나는 또한 브라우저의 인스턴스를 만드는 동안 디버그 옵션을 제거하여 비슷한 문제가 발생하여 해결되었습니다. 2.0이 알파 단계에 있기 때문에 v1.4.1로 다운 그레이드