javascript - PhantomJS - öppna sida med LocalStorage som standard


Jag använder PhantomJS för att få den genererade koden av en webbsida efter att JavaScript DOM-manipulationer har ägt rum. Denna webbsida har BARA en <body> och inget annat.

Viktigt: Denna webbsida använder webbläsarens localStorage för att generera sidan.

Jag vill ändra LocalStorage i PhantomJS innan jag öppnar sidan.

App.js:

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

page.open("https://sample.com")
setTimeout(function(){
    // Where you want to save it    
    page.render("screenshoot.png")  
    // You can access its content using jQuery
    var fbcomments = page.evaluate(function(){
        return $("body").contents().find(".content") 
    }) 
    phantom.exit();
}, 1000)

Svar #1

localStorage för en viss domän är endast tillgängligt när du öppnar en sida på den domänen. Du kan

  1. öppna någon URL på domänen du är intresserad av,
  2. ändra localStorage enligt dina behov,
  3. öppna din måladress på samma domän.

Detta kan se ut så här:

page.open("https://sample.com/asdfasdf", function(){
    page.evaluate(function(){
        localStorage.setItem("something", "whatever");
    });

    page.open("https://sample.com", function(){
        setTimeout(function(){
            // Where you want to save it    
            page.render("screenshoot.png")  
            // You can access its content using jQuery
            var fbcomments = page.evaluate(function(){
                return $("body").contents().find(".content") 
            }) 
            phantom.exit();
        },1000)
    });    
});

Det är också möjligt att inte öppna en fullständig sida i steg 1. Du kan också använda en dummy-sida med någon URL.

page.setContent("", "https://sample.com"); // doesn't actually open any page

page.evaluate(function(){
    localStorage.setItem("something", "whatever");
});

page.open("https://sample.com", function(){
    setTimeout(function(){
        // Where you want to save it    
        page.render("screenshoot.png")  
        // You can access its content using jQuery
        var fbcomments = page.evaluate(function(){
            return $("body").contents().find(".content") 
        }) 
        phantom.exit();
    }, 1000)
});    

Svar #2

Jag löste mitt problem med hjälp av en vän. Min lösning är:

Meddelande: Jag satte Timeout 10000 (10 sekunder) för fullständig inladdning av sidan.

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

page.open("https://sample.com", function(){
    page.evaluate(function(){
        var i = 0,
        oJson = jsonData,
        sKey;
        localStorage.clear();

        for (; sKey = Object.keys(oJson)[i]; i++) {
            localStorage.setItem(sKey,oJson[sKey])
        }
    });

    page.open("https://sample.com", function(){
        setTimeout(function(){
         page.render("screenshoot.png") 
            // Where you want to save it    
           console.log(page.content); //page source
            // You can access its content using jQuery
            var fbcomments = page.evaluate(function(){
                return $("body").contents().find(".content") 
            }) 
            phantom.exit();
        },10000)
    });    
});