2015-01-21 2 views
1

저는 casperJS에 비교적 새 것입니다. 페이지 B에서 작업을 수행 할 위치 (즉, 사용자의 확인 메일 확인)의 스크립트를 가지고 있으며, 페이지 A에서 실행을 계속하십시오.CasperJS 대기 조건이 완료 될 때까지 대기하지 않습니다.

casper.waitFor(function(){ 
    return this.run(function(){ 
    return verifyEmail(user_details['email']); 
    }); 
},function then(){ 
    this.wait(60000, function() { 
    this.reload(function(){ 
    this.echo("Refresh"); 
    this.capture('after-reload-a.png'); 
    }); 
    }); 
}); 

다음과 verifyEmail 같이 정의 된 함수는 다음과 같은 코드는 :

실행 중에
function verifyEmail(email){ 
    return casper.open('someURL').then(function(response){ 
     //extract URL from response 
        this.echo("URL"+url); 
     casper.start().thenOpen(url, function() { 
      this.waitForText('someText',function(){ 
       this.capture("final.jpg"); 
      }); 
     }); 
     return url; 
    }); 
}; 

는 캐스퍼 함수 verifyEmail (URL이 인쇄되지 않는다) 다음으로 진행하여 실행하지() 기능이 뭐지? 내가 여기서 뭐라 구요?

답변

1

스크립트의 casper 인스턴스 당 startrun 함수를 한 번만 사용해야합니다. CasperJS의 실행은 비동기식이기 때문에 반환 할 수 없습니다. 그것을 기다려야합니다.

두 번째 casper 인스턴스를 사용하여 전역 변수를 설정하고 이전 인스턴스의 waitFor을 사용하여 here으로 변경 될 때까지 기다릴 수 있습니다.

응답에서 URL을 추출하는 방법에 따라 페이지 컨텍스트 (casper.evaluate 통해)에서 __utils__.sendAJAX(someURL)을 사용하는 것이 더 쉬울 수도 있습니다. 대기가 필요없는 기본 동기 모드가 있으므로 casper.waitFor에서이 작업을 수행하면 안됩니다. waitFor의 첫 번째 함수 콜백 외에도 값이 변경되었는지 확인하기 위해 매우 자주 호출되므로이 방법을 사용하면 안됩니다.

세 번째 가능성은 단순히 하나의 인스턴스 만 사용하여 탐색하는 것입니다. 다른 페이지를 구문 분석 한 후에 원래 페이지를 다시로드하는 것 같습니다. 대체로 'someURL'thenOpen을 (를) 방문하고 구문 분석을 수행 한 다음 대기없이 thenOpen (으)로 원래 URL을여십시오. get the current URL도 가능하고 (세미) 전역 변수를 저장하여 올바른 페이지로 다시 돌아갈 수 있습니다.

+0

casperJS 테스트 인스턴스를 사용하여 어떻게 구현할 수 있습니까? 두 인스턴스를 생성 할 수 있습니까? – Devi

+0

불가능합니다. 어쩌면 두 번째 인스턴스 또는 아약스를 완전히 잊어 버릴 수도 있습니다. 원본 페이지를 새로 고침 한 것 같습니다. 왜 당신은 정상적으로''thenOpen'을 사용하여''someURL''을 방문하지 않고 파싱을하고 기다리지 않고'thenOpen'을 사용하여 원래 URL을여십시오. 현재 URL을 가져 와서 올바른 페이지로 돌아올 수도 있습니다. –

관련 문제