ফ্যান্টমজগুলি "পূর্ণ" পৃষ্ঠা লোডের জন্য অপেক্ষা করছে না


137

কিছু ওয়েব পৃষ্ঠাগুলি লোড করতে আমি ফ্যান্টমজেএস v1.4.1 ব্যবহার করছি । তাদের সার্ভার-সাইডে আমার অ্যাক্সেস নেই, আমি কেবল তাদের দিকে ইঙ্গিত করে লিঙ্ক পাচ্ছি। আমি ফ্যান্টমের অপ্রচলিত সংস্করণ ব্যবহার করছি কারণ আমাকে সেই ওয়েব পৃষ্ঠাগুলিতে অ্যাডোব ফ্ল্যাশ সমর্থন করতে হবে।

সমস্যাটি হ'ল অনেক ওয়েব সাইট তাদের ছোটখাট সামগ্রী async লোড করছে এবং এ কারণেই ফ্যান্টমের অনলডফিনিশড কলব্যাক (এইচটিএমএল-এ অন-লডের জন্য অ্যানালগ) খুব তাড়াতাড়ি গুলি করা হয়েছে যখন সমস্ত কিছু এখনও লোড হয় না। কেউ কি পরামর্শ দিতে পারবেন যে আমি কীভাবে কোনও ওয়েবপৃষ্ঠার পূর্ণ বোঝার জন্য অপেক্ষা করতে পারি, উদাহরণস্বরূপ, বিজ্ঞাপনগুলির মতো সমস্ত গতিশীল সামগ্রী সহ একটি স্ক্রিনশট?


3
আমি মনে করি এটির উত্তর গ্রহণের
সময়টি

উত্তর:


76

আরেকটি পন্থা মাত্র PhantomJS পর পাতা, রেন্ডার করছেন নিয়মিত অনুযায়ী সামনে লোড হওয়ার একটু অপেক্ষা করতে বলতে rasterize.js উদাহরণ, কিন্তু একটি লম্বা সময় সমাপ্ত সঙ্গে ফিনিস লোড অতিরিক্ত সম্পদ JavaScript মঞ্জুর করুন:

page.open(address, function (status) {
    if (status !== 'success') {
        console.log('Unable to load the address!');
        phantom.exit();
    } else {
        window.setTimeout(function () {
            page.render(output);
            phantom.exit();
        }, 1000); // Change timeout as required to allow sufficient time 
    }
});

1
হ্যাঁ, বর্তমানে আমি এই পদ্ধতির কাছে গিয়েছি।
নিলফালস

102
এটি একটি ভয়াবহ সমাধান, দুঃখিত (এটি ফ্যান্টমজেএসের দোষ!)। যদি আপনি একটি পূর্ণ সেকেন্ড অপেক্ষা করেন তবে এটি লোড হতে 20 মিমি সময় নেয়, এটি সম্পূর্ণ সময় নষ্ট করে (ব্যাচের কাজগুলি ভাবেন), বা এটি যদি এক সেকেন্ডের চেয়ে বেশি সময় নেয় তবে এটি ব্যর্থ হবে। এই জাতীয় অদক্ষতা এবং অবিশ্বস্ততা পেশাদার কাজের জন্য অসহনীয়।
কোডম্যানএক্স

9
এখানে আসল সমস্যাটি হ'ল আপনি কখনই জানেন না কখন জাভাস্ক্রিপ্ট পৃষ্ঠা লোড করা শেষ করবে এবং ব্রাউজারটি এটি জানবে না। এমন সাইটটি কল্পনা করুন যা কিছু জাভাস্ক্রিপ্ট অসীম লুপে সার্ভার থেকে কিছু লোড করছে। ব্রাউজারের দৃষ্টিকোণ থেকে - জাভাস্ক্রিপ্ট এক্সিকিউশনটি কখনই শেষ হয় না তাই আপনি যে মুহুর্তে ফ্যান্টমজ আপনাকে বলতে চান যে এটি শেষ হয়েছে? সময়সীমা সমাধানের অপেক্ষা এবং সর্বোত্তম হওয়ার আশা ব্যতীত জেনেরিক ক্ষেত্রে এই সমস্যাটি অলসযোগ্য।
ম্যাক্সিম গালুশকা

5
এটি কি এখনও ২০১ solution সালের সেরা সমাধান? মনে হচ্ছে এটির থেকে আমাদের আরও ভাল করতে সক্ষম হওয়া উচিত।
অ্যাডাম থম্পসন

6
আপনি যে কোডটি পড়ার চেষ্টা করছেন তার নিয়ন্ত্রণে থাকলে, আপনি ফ্যান্টম জেএস
অ্যান্ডি স্মিথ

52

আমি বরং সময়ের সাথে সাথে document.readyStateস্ট্যাটাসটি পরীক্ষা করব ( https://developer.mozilla.org/en-US/docs/Web/API/docament.readyState )। যদিও এই পদ্ধতিটি কিছুটা আড়ষ্ট, তবুও আপনি নিশ্চিত হতে পারেন যে অভ্যন্তরীণ onPageReadyফাংশন আপনি সম্পূর্ণ লোডড ডকুমেন্টটি ব্যবহার করছেন।

var page = require("webpage").create(),
    url = "http://example.com/index.html";

function onPageReady() {
    var htmlContent = page.evaluate(function () {
        return document.documentElement.outerHTML;
    });

    console.log(htmlContent);

    phantom.exit();
}

page.open(url, function (status) {
    function checkReadyState() {
        setTimeout(function () {
            var readyState = page.evaluate(function () {
                return document.readyState;
            });

            if ("complete" === readyState) {
                onPageReady();
            } else {
                checkReadyState();
            }
        });
    }

    checkReadyState();
});

অতিরিক্ত ব্যাখ্যা:

নেস্টেড ব্যবহার করা setTimeoutপরিবর্তে setIntervalপ্রতিরোধ checkReadyStateথেকে "ওভারল্যাপিং" এবং জাতি অবস্থার যখন তার মৃত্যুদন্ড কিছু র্যান্ডম কারণে দীর্ঘায়িত করা হয়। setTimeout4ms ( https://stackoverflow.com/a/3580085/1011156 ) এর ডিফল্ট বিলম্ব হয়েছে তাই সক্রিয় পোলিং তাত্পর্যপূর্ণভাবে প্রোগ্রামের কার্য সম্পাদনকে প্রভাবিত করবে না।

document.readyState === "complete"এর অর্থ হ'ল ডকুমেন্টটি সমস্ত সংস্থান (সম্পূর্ণরূপে লোড করা হয়েছে ) ( https://html.spec.whatwg.org/multipage/dom.html#current-docament-readiness )।


4
সেটটাইমআউট বনাম সেটইন্টারওয়াল সম্পর্কে মন্তব্য দুর্দান্ত।
গাল ব্রাচা

1
readyStateডম সম্পূর্ণরূপে লোড হয়ে <iframe>
গেলেই

1
@ আরগ্রাহাম এটি আদর্শ নয় তবে আমি মনে করি আমরা কেবল এই রেন্ডারদের সাথেই এত কিছু করতে পারি। প্রান্তের কেসগুলি হতে চলেছে যেখানে কোনও জিনিস পুরোপুরি লোড হয়েছে কিনা তা আপনি কেবল জানেন না। এমন কোনও পৃষ্ঠা সম্পর্কে চিন্তা করুন যেখানে উদ্দেশ্য হিসাবে এক মিনিট বা দুই মিনিটের মধ্যেই সামগ্রী বিলম্বিত হয়। রেন্ডার প্রক্রিয়াটি প্রায় বসে থাকা এবং একটি অনির্দিষ্ট সময়ের জন্য অপেক্ষা করা অযৌক্তিক। বাহ্যিক উত্স থেকে লোড হওয়া সামগ্রীর ক্ষেত্রেও এটি একই ধরণের হতে পারে slow
ব্র্যান্ডন ইলিয়ট

3
এটি ডিওএম সম্পূর্ণরূপে লোড হওয়ার পরে কোনও জাভাস্ক্রিপ্ট লোডিং বিবেচনা করে না, যেমন ব্যাকবোন / অ্যাম্বার / অ্যাংুলার সহ।
অ্যাডাম থম্পসন

1
আমার পক্ষে মোটেও কাজ করেননি। রেডিস্টেট সম্পূর্ণ ভাল বরখাস্ত থাকতে পারে, তবে পৃষ্ঠাটি এই মুহুর্তে ফাঁকা ছিল।
স্টিভ স্টাপল

21

আপনি ওয়েটারটির সংমিশ্রণ চেষ্টা করতে এবং উদাহরণগুলি রাস্টারাইজ করতে পারেন:

/**
 * See https://github.com/ariya/phantomjs/blob/master/examples/waitfor.js
 * 
 * Wait until the test condition is true or a timeout occurs. Useful for waiting
 * on a server response or for a ui change (fadeIn, etc.) to occur.
 *
 * @param testFx javascript condition that evaluates to a boolean,
 * it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
 * as a callback function.
 * @param onReady what to do when testFx condition is fulfilled,
 * it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
 * as a callback function.
 * @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used.
 */
function waitFor(testFx, onReady, timeOutMillis) {
    var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3000, //< Default Max Timout is 3s
        start = new Date().getTime(),
        condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()), //< defensive code
        interval = setInterval(function() {
            if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
                // If not time-out yet and condition not yet fulfilled
                condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
            } else {
                if(!condition) {
                    // If condition still not fulfilled (timeout but condition is 'false')
                    console.log("'waitFor()' timeout");
                    phantom.exit(1);
                } else {
                    // Condition fulfilled (timeout and/or condition is 'true')
                    console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
                    typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
                    clearInterval(interval); //< Stop this interval
                }
            }
        }, 250); //< repeat check every 250ms
};

var page = require('webpage').create(), system = require('system'), address, output, size;

if (system.args.length < 3 || system.args.length > 5) {
    console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]');
    console.log('  paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"');
    phantom.exit(1);
} else {
    address = system.args[1];
    output = system.args[2];
    if (system.args.length > 3 && system.args[2].substr(-4) === ".pdf") {
        size = system.args[3].split('*');
        page.paperSize = size.length === 2 ? {
            width : size[0],
            height : size[1],
            margin : '0px'
        } : {
            format : system.args[3],
            orientation : 'portrait',
            margin : {
                left : "5mm",
                top : "8mm",
                right : "5mm",
                bottom : "9mm"
            }
        };
    }
    if (system.args.length > 4) {
        page.zoomFactor = system.args[4];
    }
    var resources = [];
    page.onResourceRequested = function(request) {
        resources[request.id] = request.stage;
    };
    page.onResourceReceived = function(response) {
        resources[response.id] = response.stage;
    };
    page.open(address, function(status) {
        if (status !== 'success') {
            console.log('Unable to load the address!');
            phantom.exit();
        } else {
            waitFor(function() {
                // Check in the page if a specific element is now visible
                for ( var i = 1; i < resources.length; ++i) {
                    if (resources[i] != 'end') {
                        return false;
                    }
                }
                return true;
            }, function() {
               page.render(output);
               phantom.exit();
            }, 10000);
        }
    });
}

3
দেখে মনে হচ্ছে এটি ওয়েব পৃষ্ঠাগুলির সাথে কাজ করবে না, যে কোনও সার্ভার পুশ প্রযুক্তি ব্যবহার করে, কারণ অনলোডটি আসার পরেও রিসোর্স এখনও ব্যবহৃত হবে।
নীলফালস

যে কোনও ড্রাইভার করুন, যেমন। পলটারজিস্ট , এর মতো বৈশিষ্ট্য আছে?
জ্যারেড বেক

পুরো এইচটিএমএল পাঠ্যটি পোল করার জন্য এবং সংজ্ঞায়িত কীওয়ার্ড অনুসন্ধানের জন্য অপেক্ষাফরফ ব্যবহার করা সম্ভব? আমি এটি বাস্তবায়নের চেষ্টা করেছি তবে মনে হচ্ছে পোলিংটি সর্বশেষ ডাউনলোড করা এইচটিএমএল উত্সটিতে রিফ্রেশ হয় না।
এফপিড্রাগন

14

অ্যাসিক্রোনাস লোডিং সনাক্ত করতে আপনি onResourceRequestedএবং onResourceReceivedকলব্যাকগুলি ব্যবহার করতে পারেন । তাদের ডকুমেন্টেশন থেকে এই কলব্যাকগুলি ব্যবহার করার উদাহরণ এখানে :

var page = require('webpage').create();
page.onResourceRequested = function (request) {
    console.log('Request ' + JSON.stringify(request, undefined, 4));
};
page.onResourceReceived = function (response) {
    console.log('Receive ' + JSON.stringify(response, undefined, 4));
};
page.open(url);

এছাড়াও, আপনি examples/netsniff.jsএকটি কাজের উদাহরণের জন্য সন্ধান করতে পারেন ।


তবে এই ক্ষেত্রে আমি ফ্যান্টমজেএসের একটি উদাহরণ একবারে একাধিক পৃষ্ঠা লোড করার জন্য ব্যবহার করতে পারি না, তাই না?
নীলফালস

অনারসোর্সেসটেক্টেডরা কি এজেএক্স / ক্রস ডোমেন অনুরোধগুলিতে প্রযোজ্য? অথবা এটি কেবল সিএসএস, চিত্র ইত্যাদি পছন্দ করতে প্রযোজ্য?
সিএমসিডিগ্রাগনকাই

@CMCDragonkai আমি নিজেকে ব্যবহার করেছেন না, কিন্তু উপর ভিত্তি করে এই এটা দেখে মনে হচ্ছে এটা সব অনুরোধ অন্তর্ভুক্ত করা হয়েছে। উদ্ধৃতি:All the resource requests and responses can be sniffed using onResourceRequested and onResourceReceived
Supr

আমি বড় ধরণের ফ্যান্টমজেএস রেন্ডারিং সহ এই পদ্ধতিটি ব্যবহার করেছি এবং এটি বেশ ভালভাবে কাজ করে। অনুরোধগুলি ট্র্যাক করতে এবং সেগুলি ব্যর্থ হয় বা সময়সীমা শেষ হয় কিনা তা দেখতে আপনাকে প্রচুর স্মার্ট দরকার। আরও তথ্য: sorcery.smugmug.com/2013/12/17/using-phantomjs-at-scale
রায়ান দোহার্টি

14

এখানে এমন একটি সমাধান রয়েছে যা সমস্ত সংস্থার অনুরোধগুলি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে। এটি সম্পূর্ণ হয়ে গেলে এটি পৃষ্ঠার সামগ্রীটি কনসোলে লগ করবে এবং রেন্ডার পৃষ্ঠার স্ক্রিনশট তৈরি করবে।

যদিও এই সমাধানটি একটি ভাল সূচনা পয়েন্ট হিসাবে কাজ করতে পারে, আমি পর্যবেক্ষণ করেছি এটি ব্যর্থ হয়েছে সুতরাং এটি অবশ্যই কোনও সম্পূর্ণ সমাধান নয়!

আমার বেশি ভাগ্য লাগেনি document.readyState

ভ্যান্টমজ উদাহরণ পৃষ্ঠায় পাওয়া ওয়েটফোর.জেসের উদাহরণ দ্বারা আমি প্রভাবিত হয়েছি

var system = require('system');
var webPage = require('webpage');

var page = webPage.create();
var url = system.args[1];

page.viewportSize = {
  width: 1280,
  height: 720
};

var requestsArray = [];

page.onResourceRequested = function(requestData, networkRequest) {
  requestsArray.push(requestData.id);
};

page.onResourceReceived = function(response) {
  var index = requestsArray.indexOf(response.id);
  requestsArray.splice(index, 1);
};

page.open(url, function(status) {

  var interval = setInterval(function () {

    if (requestsArray.length === 0) {

      clearInterval(interval);
      var content = page.content;
      console.log(content);
      page.render('yourLoadedPage.png');
      phantom.exit();
    }
  }, 500);
});

একটি থাম্বস আপ দিয়েছিলেন, তবে ব্যবধানের পরিবর্তে 10 দিয়ে সেটটাইমআউট ব্যবহার করেছেন
GDmac

অনুরোধ অ্যারে থেকে অপসারণ করার আগে আপনার সেই প্রতিক্রিয়াটি পরীক্ষা করা উচিত 'স্টেজটি' শেষের 'সমান, অন্যথায় এটি অকালে ঝেড়ে ফেলা হতে পারে।
রেইমন্ড

আপনার ওয়েবপৃষ্ঠাটি
বুদি

13

আমার প্রোগ্রামে, আমি যদি এটি লোড ছিল কিনা তা বিচার করার জন্য কিছু যুক্তি ব্যবহার করি: এটির নেটওয়ার্ক অনুরোধটি পর্যবেক্ষণ করছি, যদি গত 200 মিমি সম্পর্কে কোনও নতুন অনুরোধ না থাকে, তবে আমি এটি লোডটি ট্রিট করি।

এটি লোডফিনিশ () এর পরে ব্যবহার করুন।

function onLoadComplete(page, callback){
    var waiting = [];  // request id
    var interval = 200;  //ms time waiting new request
    var timer = setTimeout( timeout, interval);
    var max_retry = 3;  //
    var counter_retry = 0;

    function timeout(){
        if(waiting.length && counter_retry < max_retry){
            timer = setTimeout( timeout, interval);
            counter_retry++;
            return;
        }else{
            try{
                callback(null, page);
            }catch(e){}
        }
    }

    //for debug, log time cost
    var tlogger = {};

    bindEvent(page, 'request', function(req){
        waiting.push(req.id);
    });

    bindEvent(page, 'receive', function (res) {
        var cT = res.contentType;
        if(!cT){
            console.log('[contentType] ', cT, ' [url] ', res.url);
        }
        if(!cT) return remove(res.id);
        if(cT.indexOf('application') * cT.indexOf('text') != 0) return remove(res.id);

        if (res.stage === 'start') {
            console.log('!!received start: ', res.id);
            //console.log( JSON.stringify(res) );
            tlogger[res.id] = new Date();
        }else if (res.stage === 'end') {
            console.log('!!received end: ', res.id, (new Date() - tlogger[res.id]) );
            //console.log( JSON.stringify(res) );
            remove(res.id);

            clearTimeout(timer);
            timer = setTimeout(timeout, interval);
        }

    });

    bindEvent(page, 'error', function(err){
        remove(err.id);
        if(waiting.length === 0){
            counter_retry = 0;
        }
    });

    function remove(id){
        var i = waiting.indexOf( id );
        if(i < 0){
            return;
        }else{
            waiting.splice(i,1);
        }
    }

    function bindEvent(page, evt, cb){
        switch(evt){
            case 'request':
                page.onResourceRequested = cb;
                break;
            case 'receive':
                page.onResourceReceived = cb;
                break;
            case 'error':
                page.onResourceError = cb;
                break;
            case 'timeout':
                page.onResourceTimeout = cb;
                break;
        }
    }
}

11

আমি এই পদ্ধতিটি কিছু ক্ষেত্রে দরকারী বলে মনে করেছি:

page.onConsoleMessage(function(msg) {
  // do something e.g. page.render
});

আপনি যদি পৃষ্ঠার মালিক হন তবে কিছু স্ক্রিপ্ট ভিতরে রাখলে:

<script>
  window.onload = function(){
    console.log('page loaded');
  }
</script>

এটি দেখতে খুব সুন্দর একটি কাজের মতো মনে হচ্ছে, তবে আমি আমার এইচটিএমএল / জাভাস্ক্রিপ্ট পৃষ্ঠা থেকে ফ্যান্টমজেএস দিয়ে যাওয়ার জন্য কোনও লগ বার্তা পেলাম না ... ব্রাউজার কনসোলে সঠিকভাবে বার্তাগুলি দেখতে পেলাম অনকনসোলম্যাসেজ ইভেন্টটি কখনই ট্রিগার হয়নি, এবং আমার কোন ধারণা নেই, কেন.
ডার্ক

1
আমার দরকার পেইজ.অনসোনসমেসেজ = ফাংশন (msg) {};
অ্যান্ডি বালাম

5

আমি এই সমাধানটি একটি নোডজেএস অ্যাপে দরকারী বলে মনে করেছি। আমি এটি কেবল হতাশর ক্ষেত্রেই ব্যবহার করি কারণ এটি পূর্ণ পৃষ্ঠা লোডের জন্য অপেক্ষা করার জন্য একটি টাইমআউট শুরু করে।

দ্বিতীয় যুক্তি হ'ল কলব্যাক ফাংশন যা প্রতিক্রিয়া প্রস্তুত হওয়ার সাথে সাথে ডাকা হবে।

phantom = require('phantom');

var fullLoad = function(anUrl, callbackDone) {
    phantom.create(function (ph) {
        ph.createPage(function (page) {
            page.open(anUrl, function (status) {
                if (status !== 'success') {
                    console.error("pahtom: error opening " + anUrl, status);
                    ph.exit();
                } else {
                    // timeOut
                    global.setTimeout(function () {
                        page.evaluate(function () {
                            return document.documentElement.innerHTML;
                        }, function (result) {
                            ph.exit(); // EXTREMLY IMPORTANT
                            callbackDone(result); // callback
                        });
                    }, 5000);
                }
            });
        });
    });
}

var callback = function(htmlBody) {
    // do smth with the htmlBody
}

fullLoad('your/url/', callback);

3

এটি সুপারির উত্তরের একটি বাস্তবায়ন। এছাড়াও এটি ম্যাটিউজ চার্যটনিকের পরামর্শ অনুসারে সেটটাইটারের পরিবর্তে সেটটাইমআউট ব্যবহার করে।

কোনও অনুরোধ বা প্রতিক্রিয়া না থাকলে ফ্যান্টমজগুলি 1000 মিমি থেকে প্রস্থান করবে।

// load the module
var webpage = require('webpage');
// get timestamp
function getTimestamp(){
    // or use Date.now()
    return new Date().getTime();
}

var lastTimestamp = getTimestamp();

var page = webpage.create();
page.onResourceRequested = function(request) {
    // update the timestamp when there is a request
    lastTimestamp = getTimestamp();
};
page.onResourceReceived = function(response) {
    // update the timestamp when there is a response
    lastTimestamp = getTimestamp();
};

page.open(html, function(status) {
    if (status !== 'success') {
        // exit if it fails to load the page
        phantom.exit(1);
    }
    else{
        // do something here
    }
});

function checkReadyState() {
    setTimeout(function () {
        var curentTimestamp = getTimestamp();
        if(curentTimestamp-lastTimestamp>1000){
            // exit if there isn't request or response in 1000ms
            phantom.exit();
        }
        else{
            checkReadyState();
        }
    }, 100);
}

checkReadyState();

3

এই কোডটি আমি ব্যবহার করি:

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

page.open('http://....', function(){
      console.log(page.content);
      var k = 0;

      var loop = setInterval(function(){
          var qrcode = page.evaluate(function(s) {
             return document.querySelector(s).src;
          }, '.qrcode img');

          k++;
          if (qrcode){
             console.log('dataURI:', qrcode);
             clearInterval(loop);
             phantom.exit();
          }

          if (k === 50) phantom.exit(); // 10 sec timeout
      }, 200);
  });

মূলত এই সত্যটি প্রদত্ত যে আপনি যখন ডিওএম এ প্রদত্ত একটি উপাদান উপস্থিত হন তখন পৃষ্ঠাটি সম্পূর্ণ ডাউনলোড হয় know সুতরাং স্ক্রিপ্ট এটি না হওয়া পর্যন্ত অপেক্ষা করতে চলেছে।


3

আমি phantomjs একটি personnal মিশ্রন ব্যবহার waitfor.jsউদাহরণস্বরূপ

এটি আমার main.jsফাইল:

'use strict';

var wasSuccessful = phantom.injectJs('./lib/waitFor.js');
var page = require('webpage').create();

page.open('http://foo.com', function(status) {
  if (status === 'success') {
    page.includeJs('https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js', function() {
      waitFor(function() {
        return page.evaluate(function() {
          if ('complete' === document.readyState) {
            return true;
          }

          return false;
        });
      }, function() {
        var fooText = page.evaluate(function() {
          return $('#foo').text();
        });

        phantom.exit();
      });
    });
  } else {
    console.log('error');
    phantom.exit(1);
  }
});

এবং lib/waitFor.jsফাইল (যা waifFor()ফ্যান্টমজ waitfor.jsউদাহরণ থেকে ফাংশনটির কেবল একটি অনুলিপি এবং পেস্ট ):

function waitFor(testFx, onReady, timeOutMillis) {
    var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3000, //< Default Max Timout is 3s
        start = new Date().getTime(),
        condition = false,
        interval = setInterval(function() {
            if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
                // If not time-out yet and condition not yet fulfilled
                condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
            } else {
                if(!condition) {
                    // If condition still not fulfilled (timeout but condition is 'false')
                    console.log("'waitFor()' timeout");
                    phantom.exit(1);
                } else {
                    // Condition fulfilled (timeout and/or condition is 'true')
                    // console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
                    typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condi>
                    clearInterval(interval); //< Stop this interval
                }
            }
        }, 250); //< repeat check every 250ms
}

এই পদ্ধতিটি অবিচ্ছিন্ন নয় তবে কমপক্ষে আমি আশ্বাস দিয়েছি যে সমস্ত উত্সগুলি ব্যবহার করার চেষ্টা করার আগে লোড করা হয়েছিল।


2

এটি একটি পুরানো প্রশ্ন, তবে যেহেতু আমি পুরো পৃষ্ঠার লোডের জন্য সন্ধান করছিলাম তবে স্পুকাইজেস (যেটি ক্যাস্পারজ এবং ফ্যান্টমজ ব্যবহার করে) এবং আমার সমাধানটি খুঁজে পেল না, আমি তার জন্য আমার নিজস্ব স্ক্রিপ্ট তৈরি করেছিলাম, একইভাবে ব্যবহারকারী ডিমনস্টোন হিসাবে approach এই পদ্ধতিটি যা করে তা হ'ল নির্দিষ্ট পরিমাণের জন্য, যদি পৃষ্ঠাটি কোনও অনুরোধ গ্রহণ না করে বা শুরু না করে তবে তা কার্যকর করে শেষ করে।

ক্যাস্পার.জেএস ফাইলটিতে (যদি আপনি এটি বিশ্বব্যাপী ইনস্টল করেন তবে, पथটি /usr/local/lib/node_modules/casperjs/modules/casper.js এর মতো কিছু হবে) নিম্নলিখিত লাইনগুলি যুক্ত করুন:

সমস্ত গ্লোবাল ভার্স সহ ফাইলের শীর্ষে:

var waitResponseInterval = 500
var reqResInterval = null
var reqResFinished = false
var resetTimeout = function() {}

তারপরে ফাংশনটির ভিতরে "ক্রিয়েপেজ (ক্যাস্পার)" এর ঠিক পর "ভার পৃষ্ঠা = প্রয়োজন ('ওয়েবপৃষ্ঠা') create নিম্নলিখিত কোড যুক্ত করুন:

 resetTimeout = function() {
     if(reqResInterval)
         clearTimeout(reqResInterval)

     reqResInterval = setTimeout(function(){
         reqResFinished = true
         page.onLoadFinished("success")
     },waitResponseInterval)
 }
 resetTimeout()

তারপরে "পেজ.অনরেউসোর্স রিসার্ভড = ফাংশন অন রিসোর্স রিসিপ্ট (রিসোর্স) inside" প্রথম লাইনে যুক্ত করুন:

 resetTimeout()

"পেজ.অন. রিসোর্সআরকুইস্টেড = ফাংশন অন রিসোর্স রিসার্চড (অনুরোধডাটা, অনুরোধ) এর জন্য একই করুন Do"

অবশেষে, প্রথম পাতায় "পেজ.অনলয়েডফিনিশড = ফাংশনঅলআডফিনিশড (স্ট্যাটাস) on" এ যুক্ত করুন:

 if(!reqResFinished)
 {
      return
 }
 reqResFinished = false

এবং এটিই হ'ল আশা করি এই ব্যক্তিটি আমার মতো সমস্যায় কাউকে সহায়তা করবে। এই সমাধানটি ক্যাস্পেরজগুলির জন্য তবে স্পোকির জন্য সরাসরি কাজ করে।

শুভকামনা!


0

এটি আমার সমাধান এটি আমার জন্য কাজ করেছে।

page.onConsoleMessage = function(msg, lineNum, sourceId) {

    if(msg=='hey lets take screenshot')
    {
        window.setInterval(function(){      
            try
            {               
                 var sta= page.evaluateJavaScript("function(){ return jQuery.active;}");                     
                 if(sta == 0)
                 {      
                    window.setTimeout(function(){
                        page.render('test.png');
                        clearInterval();
                        phantom.exit();
                    },1000);
                 }
            }
            catch(error)
            {
                console.log(error);
                phantom.exit(1);
            }
       },1000);
    }       
};


page.open(address, function (status) {      
    if (status !== "success") {
        console.log('Unable to load url');
        phantom.exit();
    } else { 
       page.setContent(page.content.replace('</body>','<script>window.onload = function(){console.log(\'hey lets take screenshot\');}</script></body>'), address);
    }
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.