2015-06-20 10 views
7

के बाद एक पृष्ठ खोलें मैंने वेबसाइट पर लॉगिन करने के लिए एक phantomjs कोड बनाने के लिए इस उदाहरण का उपयोग किया।फ़ैंटॉमजेएस

var page = require('webpage').create(); 
page.open("http://www.facebook.com/login.php", function(status) { 

    if (status === "success") { 
    page.onConsoleMessage = function(msg, lineNum, sourceId) { 
     console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")'); 
    }; 
    page.evaluate(function() { 
     console.log('hello'); 
     document.getElementById("email").value = "email"; 
     document.getElementById("pass").value = "password"; 
     document.getElementById("u_0_1").click(); 
     // page is redirecting. 
    }); 
    setTimeout(function() { 
     page.evaluate(function() { 
     console.log('haha'); 
     }); 
     page.render("page.png"); 
     phantom.exit(); 
    }, 5000); 
    } 
}); 

इस लिंक से। https://gist.github.com/ecin/2473860

लेकिन मैं एक बटन से एक और लिंक खोलना चाहता हूं या सीधे उस पर जाना चाहता हूं। मैं यह कैसे कर सकता हूं?

यहां एक आसान उदाहरण है। काम नहीं करता ...

var page = require('webpage').create(); 
var url = "www.example.com"; 

page.open(url, function (status) { 

    setTimeout(function() { 
     page.evaluate(function() { 
      console.log('haha'); 
     }); 
     page.render("example.png"); 
     phantom.exit(); 
    }, 5000); 

}); 



var url = "www.google.com"; 

page.open(url, function (status) { 

    setTimeout(function() { 
     page.evaluate(function() { 
      console.log('haha'); 
     }); 
     page.render("google.png"); 
     phantom.exit(); 
    }, 5000); 

}); 
+0

फ़ैंटॉमजेएस की तुलना में नोट नोड की तुलना में एक अलग निष्पादन वातावरण है। नोड और फैंटोमजेएस के बीच पुल हैं, लेकिन वे थोड़ा अलग लिखे गए हैं। –

उत्तर

7

बहुत करीब, अब अपने दो स्निपेट को एक में गठबंधन करें।

var page = require('webpage').create(); 
var url = "http://www.example.com"; 

page.onConsoleMessage = function(msg, lineNum, sourceId) { 
    console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")'); 
}; 

page.open(url, function (status) { 
    page.onConsoleMessage = function(msg, lineNum, sourceId) { 
     console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")'); 
    }; 
    page.evaluate(function() { 
     document.getElementById("email").value = "email"; 
     document.getElementById("pass").value = "password"; 
     document.getElementById("u_0_1").click(); 
     // page is redirecting. 
    }); 

    setTimeout(function() { 
     page.evaluate(function() { 
      console.log('haha'); 
     }); 
     page.render("example.png"); 


     var url = "http://www.google.com"; 

     page.open(url, function (status) { 
      setTimeout(function() { 
       page.evaluate(function() { 
        console.log('haha'); 
       }); 
       page.render("google.png"); 
       phantom.exit(); 
      }, 5000); 
     }); 
    }, 5000); 
}); 

वास्तव में देखने के लिए console.log()page.evaluate() के अंदर आप page.onConsoleMessage घटना के लिए रजिस्टर करने के लिए की आवश्यकता होगी: page.open() तुम क्यों अगले पृष्ठ को खोलने के लिए जाने के बाद ही पहले एक समाप्त हो गया है की जरूरत है जो अतुल्यकालिक है। डिबगिंग करते समय और भी अन्य घटनाएं उपयोगी होती हैं।

आपके द्वारा खोलने वाले यूआरएल में प्रोटोकॉल (http: // या फ़ाइल: ///) जोड़ने के लिए मत भूलना। उस संबंध में फैंटॉमजेएस थोड़ा सा पसंद है।

एक स्थिर समय (setTimeout()) प्रतीक्षा करने के बजाय अगले पृष्ठ को कुछ कार्रवाई करने के बाद लोड किया जाता है। आपको page.onLoadFinished ईवेंट का उपयोग करना चाहिए। यह नेविगेशन गहन स्क्रिप्ट के लिए सही पाने के लिए बल्कि बोझिल है। लंबी स्क्रिप्ट के लिए CasperJS का उपयोग करें।

अक्सर Element.click() काम नहीं करता है। This question में उन मामलों के लिए कई समाधान हैं।

+1

ठीक है। इसने काम किया है, लेकिन अगर मैं Google खोज बॉक्स में कुछ दर्ज करना चाहता हूं और खोजने के लिए बटन दबाता हूं। तो मुझे खोज परिणाम प्रदान किए जाते हैं? – macroscripts

+1

@macroscripts Google PhantomJS के साथ प्रयोग शुरू करने के लिए एक बहुत ही खराब साइट है। लेकिन आप एक इनपुट फ़ील्ड के मान को बदलने के लिए 'page.evaluate() 'का उपयोग करेंगे और [क्लिक] (http://stackoverflow.com/questions/15739263/phantomjs-click-an-element) खोज बटन। आप फ़ील्ड भरने के लिए 'page.sendEvent() 'का भी उपयोग कर सकते हैं और आशा करते हैं कि तत्काल परिणाम फ़ैंटॉमजेएस के लिए सक्षम हैं। –

+0

मैं एक उदाहरण के रूप में Google का उपयोग कर रहा हूँ। मैं वेबसाइट पर यह कोड कर रहा हूँ। इसमें अलग-अलग डोमेन हैं। मुझे sub1.domain.com से लॉगिन करना है और sub2.domain.com तक पहुंच प्राप्त करना है। मैं इससे कुछ डेटा प्राप्त करना चाहता हूं। आपने जो कोड दिया है वह काम करता है लेकिन पूरी तरह से नहीं। यह उप 1 पर जाता है लेकिन ठीक से लॉगिन नहीं करता है। और यह उप 2 पर जाता है लेकिन मुझे अपना उपयोगकर्ता नाम लॉग इन नहीं दिखता है। मैं बाद में उपयोग किए गए उदाहरण को पेस्ट कर दूंगा। – macroscripts

संबंधित मुद्दे