2014-10-19 6 views
6

मैं एक वेबपृष्ठ स्क्रीनशॉट करने के लिए फ़ैंटॉमजेएस का उपयोग कर रहा हूं। हालांकि पुस्तकालय कुछ होस्टिलेशन की अनुमति देने के लिए पृष्ठ डीओएम में jQuery कार्यक्षमता को इंजेक्ट करने के लिए एक होस्ट की गई jQuery फ़ाइल को कॉल करता है। यहां देखी गई: http://phantomjs.org/api/webpage/method/include-js.htmlphantomjs page.includeJs के साथ एक स्थानीय फ़ाइल का उपयोग कर?

कोड इस तरह दिखता है:

if (loaded) { 
page.includeJs("http://code.jquery.com/jquery-1.8.3.min.js", 
    function() { . . . 

मैं क्योंकि (क) यह धीमी और (ख) अपने विश्वसनीय नहीं है जे एस के लिए एक बाहरी कॉल करने के लिए नहीं करना चाहती। मैं एक स्थानीय प्रति उपयोग करना चाहते हैं और मैं इस तरह के रूप में है कि पथ सेट, लेकिन यह में लोड हो रहा है नहीं है।

page.includeJs("assets/javascript/jquery.min.js", 
    function() { . . . 

यहाँ क्या समस्या है? मेरा पथ क्यों काम नहीं कर रहा है जैसा कि मैं उम्मीद करता हूं? क्या यह कार्य page.includeJs संबंधित पथों की अनुमति नहीं देता है?

उत्तर

3

प्रलेखन के अनुसार इस फ़ंक्शन में दिए गए URL से स्क्रिप्ट शामिल है जिसे होस्ट किए गए पृष्ठ से एक्सेस करने की आवश्यकता है। जाहिर है कि आपका स्थानीय पथ रिमोट होस्ट (रिश्तेदार और न ही पूर्ण) पर पहुंच योग्य नहीं है, इसलिए आपको स्क्रिप्ट को injectJs के साथ इंजेक्ट करने की आवश्यकता है।

संपादित:

var page = require('webpage').create(); 

page.open("http://ipecho.net/", function(status) { 
    if (status === "success") { 
     if (page.injectJs("jquery.min.js")) { 
      var h1 = page.evaluate(function() { 
       return $("h1:eq(0)").css({fontSize: 10, color: "red"}).text(); 
      }); 
      console.log(h1); 
     } 
    } 
    page.render("test.png"); 
    phantom.exit(); 
}); 


अतिरिक्त कोड भी jQuery के रूप में एक ही तरह से इंजेक्ट किया जा सकता और यह सुनिश्चित करें के लिए काम करेंगे: यहाँ कोड मैं परीक्षण के लिए इस्तेमाल किया है। evaluate() के बारे में सीमाओं याद रखें (लेकिन यह इस मामले में एक बड़ी बात सच नहीं है):

नोट: तर्कों और रिटर्न मान पर का मूल्यांकन समारोह एक सरल आदिम ऑब्जेक्ट होना चाहिए। अंगूठे का नियम: यदि यह JSON के माध्यम से क्रमबद्ध किया जा सकता है, तो यह ठीक है।

क्लोजर, फ़ंक्शन, डोम नोड इत्यादि काम नहीं करेंगे!


संपादित: इसके अलावा अपने filepath समस्या के बारे में: check what is your working directory। सापेक्ष पथ का उपयोग करना मुश्किल हो सकता है इसलिए मैं आपको पूर्ण उपयोग करने का सुझाव देता हूं। webpage.libraryPath आपको बस इतना चाहिए। मुझे उम्मीद है कि मैंने आपकी मदद की है।

+0

भी इंजेक्शनजे कोशिश की। पथ या तो हल नहीं कर रहा है। दस्तावेज़ों को पढ़ने से मुझे लगता है कि उनके पास सूक्ष्म अंतर भी हैं। – fyz

+0

@fab हां, कुछ अंतर हैं लेकिन स्थानीय स्क्रिप्ट चलाने का यही एकमात्र तरीका है। आप शायद गलत फाइलपैथ प्रदान कर रहे हैं। पूर्ण एक का उपयोग करने का प्रयास करें और देखें कि यह काम करता है या नहीं। – ghost

+0

बीटीडब्ल्यू 'इंजेक्टजेएस' सही नहीं है डॉक: "नोट: मूल्यांकन समारोह में तर्क और वापसी मूल्य एक साधारण आदिम वस्तु होना चाहिए। अंगूठे का नियम: यदि इसे JSON के माध्यम से क्रमबद्ध किया जा सकता है, तो यह ठीक है। क्लोजर, फ़ंक्शंस, डोम नोड्स इत्यादि काम नहीं करेंगे! " लिंक देखें: http://phantomjs.org/api/webpage/method/inject-js.html – fyz

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