javascript - Cannot get link to be clicked and switch to next page using PhantomJS -


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