CasperJS 문서 에 따르면 :
then()
서명: then(Function then)
이 방법은 간단한 기능을 제공하여 스택에 새 탐색 단계를 추가하는 표준 방법입니다.
casper.start('http://google.fr/');
casper.then(function() {
this.echo('I\'m in your google.');
});
casper.then(function() {
this.echo('Now, let me write something');
});
casper.then(function() {
this.echo('Oh well.');
});
casper.run();
필요한만큼 단계를 추가 할 수 있습니다. 현재 Casper
인스턴스 this
는 단계 함수 내 에서 키워드를 자동으로 바인딩합니다 .
정의한 모든 단계를 실행하려면 run()
메서드를 호출하면됩니다 .
참고 : 당신은해야한다 start()
순서 캐스퍼 인스턴스가 사용하는 then()
방법을.
경고 :에 추가 된 단계 함수 then()
는 두 가지 다른 경우에 처리됩니다.
- 이전 단계 기능이 실행되면
- 이전 메인 HTTP 요청이 실행되고 페이지가 로드 되었을 때 ;
로드 된 페이지의 단일 정의는 없습니다 . DOMReady 이벤트가 트리거되었을 때입니까? "모든 요청이 완료 중"입니까? "모든 응용 프로그램 논리가 수행되고"있습니까? 아니면 "렌더링되는 모든 요소"? 대답은 항상 상황에 따라 다릅니다. 따라서 waitFor()
실제로 기대하는 것을 명시 적으로 제어하기 위해 항상 가족 방법을 사용하도록 권장됩니다 .
일반적인 트릭은 다음을 사용하는 것입니다 waitForSelector()
.
casper.start('http://my.website.com/');
casper.waitForSelector('#plop', function() {
this.echo('I\'m sure #plop is available in the DOM');
});
casper.run();
이면의 소스 코드Casper.prototype.then
는 다음과 같습니다.
/**
* Schedules the next step in the navigation process.
*
* @param function step A function to be called as a step
* @return Casper
*/
Casper.prototype.then = function then(step) {
"use strict";
this.checkStarted();
if (!utils.isFunction(step)) {
throw new CasperError("You can only define a step as a function");
}
// check if casper is running
if (this.checker === null) {
// append step to the end of the queue
step.level = 0;
this.steps.push(step);
} else {
// insert substep a level deeper
try {
step.level = this.steps[this.step - 1].level + 1;
} catch (e) {
step.level = 0;
}
var insertIndex = this.step;
while (this.steps[insertIndex] && step.level === this.steps[insertIndex].level) {
insertIndex++;
}
this.steps.splice(insertIndex, 0, step);
}
this.emit('step.added', step);
return this;
};
설명:
즉, then()
탐색 프로세스의 다음 단계를 예약합니다.
를 then()
호출하면 단계로 호출 될 매개 변수로 함수가 전달됩니다.
인스턴스가 시작되었는지 확인하고 시작되지 않은 경우 다음 오류를 표시합니다.
CasperError: Casper is not started, can't execute `then()`.
다음으로 page
객체가 null
.
조건이 참이면 Casper는 새 page
개체를 만듭니다 .
그 후 매개 변수의 then()
유효성 step
을 검사하여 함수가 아닌지 확인합니다.
매개 변수가 함수가 아닌 경우 다음 오류가 표시됩니다.
CasperError: You can only define a step as a function
그런 다음이 함수는 Casper가 실행 중인지 확인합니다.
Casper가 실행 중이 아니면 then()
대기열 끝에 단계를 추가합니다.
그렇지 않고 Casper가 실행 중이면 이전 단계보다 한 단계 더 깊은 하위 단계를 삽입합니다.
마지막으로 then()
함수는 step.added
이벤트를 생성하여 종료하고 Casper 객체를 반환합니다.
flow
casperjs 의 일반 에 대한 설명을 찾고 있지만 기본적으로evaluate
호출 내에서 casper를 참조 할 수 없다는 것을 발견했습니다 . (즉, 새 URL, 로그, 에코 등을 열 수 없습니다). 그래서 제 경우에는 평가가 호출되었지만 외부 세계와 상호 작용할 방법이 없었습니다.