2016-10-11 2 views
1

요즘 나는 악몽 모듈을 매우 놀랐다. 나는 매우 간단하고 유용하다고 생각하지만 질문이있다.내가 nightmarejs에서 아약스를 클릭하면 콜백을 사용하는 방법

내가

var Nightmare = require('nightmare'), 
    nightmare = Nightmare(); 

nightmare 
.goto('https://motul.lubricantadvisor.com/Default.aspx?data=1&lang=ENG&lang=eng') 
.click('input[title="Cars"]') 
.wait(1000) 
.evaluate(function() { 
    //return $('#ctl00_ContentPlaceHolder1_lstModel option'); 
    var links = document.querySelectorAll('#ctl00_ContentPlaceHolder1_lstMake option'); 
    return [].map.call(links, function (e) { 
     return {value: e.value, name: e.text}; 
    }); 
}) 
.end() 
.then(function (items) { 
    console.log(items); 
}); 

방법을 기다리고 있습니다 아약스 버튼

MyCode를 클릭 할 때 콜백을 사용하는 방법에 대해 설명합니다. 대부분의 사람들은 대기 검색을 사용합니다. 나는 검색을 검색했습니다.

.wait(1000) 

저는 대기 방법을 사용하지 않습니다. 네트워크 연결이 끊어 지거나 느린 경우. 좋은 코드가 아닙니다.

콜백 메소드를 도와 주시겠습니까 ??

감사합니다. 그래서 코드를 모방했지만 작동하지 않습니다.

var Nightmare = require('nightmare'), 
    nightmare = Nightmare(); 

nightmare 
.goto('https://motul.lubricantadvisor.com/Default.aspx?data=1&lang=ENG&lang=eng') 
.click('input[title="Cars"]') 
.wait('#result > #ctl00_ContentPlaceHolder1_lstMake option') 
.evaluate(function() { 
    $(document).ajaxSuccess(function() { 
     var links = document.querySelectorAll('#ctl00_ContentPlaceHolder1_lstMake option'); 
     return [].map.call(links, function (e) { 
      return {value: e.value, name: e.text}; 
     }); 
    }); 
}) 
.end() 
.then(function (items) { 
    console.log(items); 
}); 

답변

0

해결 방법에는 여러 가지가 있습니다. 가장 쉬운 방법은 다음과 같습니다.

Ajax 요청이 완료되면 페이지에서 항상 변경됩니다. 이러한 변경 사항의 대부분은 CSS 선택기와 일치 할 수있는 특정 요소가 나타날 때까지 기다릴 때 쉽게 감지 할 수 있습니다.

무언가를 클릭하면 결과는 "#result"과 일치하는 요소에 기록됩니다. 클릭 전 해당 요소가없는 경우이 요소가 존재할 때까지 기다릴 수 있습니다.

.click("button") 
.wait("#result") 
// TODO: do something with the result 

CSS 셀렉터를 사용하여 항목을 계산할 수도 있습니다. 예를 들어 "#result > a"과 일치시킬 수있는 요소가 10 개 있다고 가정 해 보겠습니다. 클릭이 10 개를 추가하는 경우, 당신은 사용 20 기다릴 수 : CSS 선택기의

.click("button") 
.wait("#result > a:nth-of-type(20)") 
// TODO: do something with the result 

세계는 꽤 큽니다. 물론


, 일부 콜백이 완료 될 때마다 알림을받을 $(document).ajaxSuccess(fn) 같은 일반적인 아약스 이벤트 처리기를 추가하려면 evaluate를 사용할 수 있지만 페이지의 소스 코드는 모든 시간을 변경합니다. DOM에서 볼 수있는 결과를 찾으려면 코드를 유지하는 것이 더 쉬울 것입니다. 답변에 대한

+0

감사를. 작동하지 않습니다. 내 코드를 확인할 수 있니? 나는 나의 질문을 모티브로 삼았다. 너무 어려워요. –

+0

왜'ajaxSuccess'를 사용하고 있습니까? 제 질문의 첫 부분이 당신을 위해 일하지 않았습니까? –

+0

첫 부분을 보았습니다. 그러나 그것은 작동하지 않습니다. 좋아, 다시 시도 할게. –

-1

사용이, 아약스 콜백 ..

$.ajax(url,{dataType: "json", type: "POST" }) 
     .then(function successCallback(data) { //successCallback 
     console.log(data); 
    }, function errorCallback(err) { //errorCallback 
     console.log(err); 
     }); 
    // console.log(2); 
});  
+0

나는 그 질문에 대해 오해했다고 생각한다. OP는 웹 사이트를 구현하지 않고 오히려 그것을 자동화하려고합니다. 웹 사이트 자체가 Ajax를 사용하고 있습니다. OP는 웹 사이트의'$ .ajax'에 접근 할 수 없습니다. –

관련 문제