내가 지금 하는거는 말야.
capserJS라는 모듈로 웹페이지를 크롤링 하고 있단 말야.
지금 내가 하려는 작업은
어떤 대상 페이지에서 button의 텍스트가 "준비중"에서 "다운로드"로 바뀌면,
그 다운로드 버튼에 해당하는 url을 가져오고 싶어.
원래 내가 생각한 방식은 이렇다.
capser.waitForTextChange("#the_Button", function() {
//뭐 대충 해당 url을 이용해 리다이렉트.
}};
그리고 이게 될 줄 알았는데 문제가 생겼다.
button의 텍스트가 "준비중"에서 바로 "다운로드"로 넘어가는게 아니라
준비중에서 바로 "다운로드"로 넘어갈 때도 있고, "..." 식으로 작업중표시가 뜨다가 "다운로드"로 넘어갈 때도 있다라는거다.
결국 button의 텍스트가 정말 "다운로드"인지 검증할 필요가 생김.
그래서 생각한게
var button_text;
while( button_text != "다운로드" ) {
button_text = capser.evaluate(function() {
return $("the_Button").text().trim(); //문법오류를 지적하지는 말자. 아무튼 잘 리턴함.
});
if( button_text == "다운로드") {
//뭔가를 한다
}
casper.wait(1000); //1초마다
}
이런 방식인거다.
1초마다 비동기 함수이지만 evalute를 실행시켜서 해당 버튼의 텍스트가 "다운도르"로 변경되었는지를 체크하는 과정.
근데 생각만큼 안되네...
일단 구글링해보니까 capserJS는 while 같은 looping을 지원하지 않는데... ㅠㅠ
접근 방식을 바꾸는게 좋겠다. 예전에 팬텀js 캐스퍼js로 크롤링해서 파이썬 차일드에 넘기는 코드 도와준 적 있는데 비슷한 문제에서 다른 방식으로 해결했었음 - dc App
capser.waitFor안에서 검증하면 안됨?
ㄴwaitFor나 waitForTextChage나 그게 그거임 똑같은 거임. 어쨌든 "다운로드"가 아닐 때, 다시 재검증하는 방법이 필요한데 capser는 while을 지원안해...
그니까 waitForTextChage안에서 dom에 접근해서 다운로드인지 아닌지 비교하라고
ㄴ그게 무슨 해결법이야... waitForTextChange(function() { if(this.dom.text == "다운로드) console.log("ok); else { //뭐 어떡해? } );
caspter.waitFor~~~.then(validateCheck).then(fetchURL)
ㄴ 아... waitFor에서... dom.text=="다운로드" 이게 나와야 true가 되고, 그 다음에 then 들어가도록 하겠다는거임?
이게 머가 헷갈린단거지
내 생각엔 waitFor는 무조건 변경값이 생기면, true이고, validCheck.에서는 dom.text 가 "다운로드"가 아니라서 false 로 나오면 그걸로 끝날 것 같음. 다시 waitFor~~~로 절대 안 올라갈 것 같은데.
그럼 false에 걸리면 다시 waitFor걸면 되자늠
_.waitFor~~~.then(validateCheck).then(fetchURL).catch(register)
//else 안에 if 또넣고 그 else에 또 if 넣고 그 else 안에 또 if 넣고... 이런식의 해결법은 당연히 존재하지.. 하지만 아름답진 않잖아.
뭘 if중첩임 if는 하나고 재귀로 도는건데
비동기 재귀라 스택문제도 없음
ㄴ미안하다 니 말이 맞는 것 같다... Signature: waitFor(Function testFx[, Function then, Function onTimeout, Number timeout, Object details])
첫인자가 테스트펑션이구나... 미안하다 맞다...
Signature: waitForSelectorTextChange(String selectors[, Function then, Function onTimeout, Number timeout]) 이거랑 같을줄알았는데 아니었다.
난 이 모듈 본적도 없고 그냥 promise스타일로 쓴거임
js쓰면 맨날 보는 코드인데 저것도 어지간한 레거시코드 아닌이상 promise스타일 있을텐데
그렇구나 고맙다 내가 자바스크립트를 잘 모른다