i having issue getting phantomjs click login button on website.
i can see in second screenshot trying select login button, cannot wait , take screenshot on next page.
here js file:
var page = require('webpage').create(); page.viewportsize = {width: 1920,height: 1080}; page.open('http://clubs.bluesombrero.com/default.aspx?portalid=1809', function (status) { console.log("status: " + status); if (status === "success") { var url = page.url; console.log('url: ' + url); console.log("tc0001: pass"); page.render('tc0001.png'); var = page.evaluate(function() { return document.queryselector('#dnn_dnnlogin_cmdlogin'); }); page.sendevent('click', a.offsetleft, a.offsettop); page.render('tc0002.png'); } else { console.log("tc0001: failed, page did not load."); } phantom.exit(); });
i have tried few ways wait take screenshot after page has loaded, have not had luck.
page.sendevent()
synchronous function finishes action done. next call (page.render()
) executed before request triggered click answered.
1. settimeout
javascript provides 2 functions wait static amount of time: settimeout
, setinterval
:
page.sendevent('click', a.offsetleft, a.offsettop); settimeout(function(){ page.render('tc0002.png'); phantom.exit(); }, 5000);
(don't forget remove other phantom.exit()
since don't want exit early)
of course problem on 1 hand page still might not ready after 5 seconds or on other hand page loaded extremely fast , sits there doing nothing.
2. waitfor
a better approach use waitfor()
function provided in examples folder of phantomjs. can wait specific condition of page existence of specific element:
page.sendevent('click', a.offsetleft, a.offsettop); waitfor(function _testfx(){ return page.evaluate(function(){ return !!document.queryselector("#someid"); }); }, function _done(){ page.render('tc0002.png'); phantom.exit(); }, 10000);
3. page.onloadfinished
another approach listen page.onloadfinished
event called when next page loaded, should register before click:
page.onloadfinished = function(){ page.render('tc0002.png'); phantom.exit(); }; page.sendevent('click', a.offsetleft, a.offsettop);
4. page.onpagecreated
whenever new window/tab opened in desktop browser, page.onpagecreated
triggered in phantomjs. provides reference newly created page, because previous page not overwritten.
page.onpagecreated = function(newpage){ newpage.render('tc0002.png'); newpage.close(); phantom.exit(); }; page.sendevent('click', a.offsetleft, a.offsettop);
in other cases, page
instance overwritten new page.
5. "full" page load
that might still not sufficient, because phantomjs doesn't specify means when page loaded , javascript of page may still make further requests build page. q&a has suggestions wait "full" page load: phantomjs not waiting “full” page load
Comments
Post a Comment