Guest User

phantom.js

a guest
Oct 4th, 2018
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.73 KB | None | 0 0
  1. var page = new WebPage(), testindex = 0, loadInProgress = false, interval;
  2. var fs = require('fs');
  3. var system = require('system');
  4. var clientUrl = system.args[1],
  5. clientName = clientUrl.split('//')[1].split('.')[0],
  6. username = system.args[2],
  7. password = system.args[3],
  8. path = system.args[4],
  9. UserId = system.args[5],
  10. ReportingToIds = JSON.parse(system.args[6]).toString(),
  11. ReportId = system.args[9]=="dashboard" ? system.args[9].toString() : system.args[7].toString(),
  12. ReportName = system.args[8],
  13. pageName = system.args[10] && system.args[10].toString(),
  14. clientAlias = system.args[11] && system.args[11].toString(),
  15. date = system.args[12];
  16.  
  17.  
  18. var logFile = path + '\\output-'+ReportName+'.txt';
  19. var t0 = performance.now() , t1, moveToNextStep = true, timeLimit = 270000; //<5min, as on backened timeout is 0f 5min
  20. page.settings.loadImages = false;
  21. page.settings.clearMemoryCaches = true;
  22. console.log("system arguments", system.args);
  23. page.settings.userAgent = "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0";//"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36";//"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36";
  24.  
  25. // to load all react utilities
  26. page.onInitialized = function () {
  27. //if (page.injectJs(path + '\\core.js'))// live
  28. if (page.injectJs('core.js')) // local testing
  29. {
  30. console.log("Polyfill loaded");
  31. }
  32. }
  33. page.onLoadStarted = function () {
  34. loadInProgress = true;
  35. };
  36.  
  37. page.onLoadFinished = function () {
  38. loadInProgress = false;
  39. };
  40.  
  41. page.onError = function (msg, trace) {
  42. console.log(msg);
  43. }
  44.  
  45. page.onConsoleMessage = function(msg) {
  46. console.log(msg);
  47. };
  48.  
  49. page.viewportSize = {
  50. width: 1200,
  51. height: 900
  52. };
  53.  
  54. page.paperSize = {
  55. width: '950px',
  56. height: '900px',
  57. margin: {
  58. top: '10px',
  59. left: '20px'
  60. }
  61. };
  62.  
  63. function stopInterval() {
  64. t1 = performance.now();
  65. if(t1-t0 > timeLimit){
  66. //console.log("test complete! after time in ms", (t1-t0));
  67. clearInterval(interval);
  68. phantom.exit();
  69. }
  70. }
  71. function holdStep(critera){
  72. moveToNextStep = true;
  73. if(ReportId == 'dashboard' && testindex == 4){
  74. testindex = 8;
  75. }
  76. else if(testindex == 5 && ReportId != 'dashboard' && pageName != 'null'){
  77. testindex = 8;
  78. }
  79. else if(critera){
  80. testindex++;
  81. }
  82. }
  83. var steps = [
  84. //step 0 check page loaded, by checking login button if exists
  85. function(){
  86. var btnLoginLoaded = page.evaluate(function () {
  87. return (!!document.getElementById("btnLogin"));
  88. });
  89. holdStep(btnLoginLoaded);
  90. },
  91. //step 1 fill the login credential and click submit
  92. function() {
  93. var formFilled = page.evaluate(function (username, password) {
  94. function setStateEvent(obj, event) {
  95. var event = new Event(event, { target: obj, bubbles: true });
  96. return obj ? obj.dispatchEvent(event) : false;
  97. }
  98. var userName = document.getElementById("userName");
  99. userName.value = username;
  100. setStateEvent(userName, 'input');
  101. var pass = document.getElementById("password");
  102. pass.value = password;
  103. setStateEvent(pass, 'input');
  104. var chkbox = document.getElementById("rememberMe");
  105. chkbox.checked = true;
  106. setStateEvent(chkbox, 'input');
  107. document.getElementById("btnLogin").click();
  108. return true;
  109. }, username, password);
  110. holdStep(formFilled);
  111. },
  112. //step 2 , check if report nav tab exists
  113. function(){
  114. var reportTabExist = page.evaluate(function () {
  115. return (!!document.getElementById('reportLink'));
  116. })
  117. holdStep(reportTabExist);
  118. },
  119. //step 3, click on report nav tab
  120. function(){
  121. page.evaluate(function () {
  122. document.getElementById('reportLink').click();
  123. })
  124. holdStep(true);
  125. },
  126. //step 4, check if filter input exists on report panel
  127. function(){
  128. var filterReportInputExist = page.evaluate(function () {
  129. return (!!document.getElementById('filterReportInput'));
  130. })
  131. holdStep(filterReportInputExist);
  132. },
  133. //step 5, fill filter input and apply filter
  134. function(){
  135. var data = {
  136. ReportingToIds:ReportingToIds , pageName: pageName
  137. }
  138. var filterInputFilled = page.evaluate(function (data) {
  139. function setStateEvent(obj, event) {
  140. var event = new Event(event, { target: obj, bubbles: true });
  141. return obj ? obj.dispatchEvent(event) : false;
  142. }
  143. var input = document.getElementById('filterReportInput');
  144. input.value = data.ReportingToIds;
  145. setStateEvent(input, 'input');
  146. var pageNameInput = document.getElementById('pageNameInput');
  147. pageNameInput.value = data.pageName;
  148. setStateEvent(pageNameInput, 'input');
  149. document.getElementById("filterReportBtn").click();
  150. return true;
  151. }, data);
  152. holdStep(filterInputFilled);
  153. },
  154. //step 6, check if report tab to capture exists
  155. function(){
  156. var reportTabExist = page.evaluate(function (ReportId) {
  157. return(!!document.getElementById(ReportId));
  158. }, ReportId);
  159.  
  160. holdStep(reportTabExist);
  161. },
  162. //step 7, click on report tab which is to be captured
  163. function(){
  164. page.evaluate(function (ReportId) {
  165. document.getElementById(ReportId).click();
  166. }, ReportId);
  167. holdStep(true);
  168. },
  169. //step 8, set width height of report wrapper to whole screen width height
  170. function(){
  171. var reportContainer = page.evaluate(function (ReportIdOrDashboard) {
  172. var id = ReportIdOrDashboard != "dashboard" ? 'report-'+ReportIdOrDashboard:ReportIdOrDashboard;
  173. var reportWrapper = document.getElementById(id);
  174. reportWrapper ? reportWrapper.style.height = '100vh':'';
  175. reportWrapper ? reportWrapper.style.maxHeight = '100vh':'';
  176. reportWrapper ? reportWrapper.style.width = '100vw':'';
  177. reportWrapper ? reportWrapper.style.maxWidth = '100vw':'';
  178. // if(ReportIdOrDashboard != "dashboard" && !!reportWrapper){
  179. // console.log("id*****************", reportWrapper.getElementsByTagName('iframe')[0].src);
  180. // reportWrapper.getElementsByTagName('iframe')[0].src = reportWrapper.getElementsByTagName('iframe')[0].src;
  181. // }
  182. return (!!reportWrapper);
  183. }, ReportId);
  184.  
  185. holdStep(reportContainer);
  186. },
  187. //step 9, hide all elements except report
  188. function(){
  189. //dont include https over http, it may not let apply jquery inclusion.
  190. page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js', function () {
  191. var element = '#' + (ReportId != "dashboard"?'report-'+ReportId:ReportId );
  192. (page.evaluate(function (element) {
  193. $(element).appendTo('body');
  194. $('body > :not(' + element + ')').hide();
  195. }, element))
  196. });
  197. holdStep(true);
  198. },
  199. //step 10, check if report has been loaded by checking attribute "title"
  200. function(){
  201. var titleExist = page.evaluate(function (ReportId) {
  202. var reportWrapper = document.getElementById((ReportId != "dashboard"? 'report-'+ReportId:ReportId));
  203. return (!!(reportWrapper && reportWrapper.hasAttribute("title")));
  204. }, ReportId);
  205. holdStep(titleExist);
  206. },
  207. //step 11, capture report after time remaining out of time limit
  208. function(){
  209. var timeNow = new Date;
  210. var time = (timeLimit - t1) > 60000 ? 60000 : (timeLimit - t1); //time post capturing should occur
  211. //fs.write(logFile, "\r\n-------Client: "+ clientUrl +",UserId: "+UserId+", ReportName: "+ ReportName+", ReportId: "+ ReportId +", Time: " + (timeLimit - t1), 'a');
  212. setTimeout(function(){
  213. //local testing
  214. page.render(path + "/output-" + clientAlias +"-"+ UserId + "-" + ReportId + "-" + pageName + "-" + date + "/" + ReportName+ ".pdf", { format: 'pdf', quality: '100' });
  215. //live capturing
  216. //page.render(path + "\\output-" + clientAlias + "-" + UserId + "-" + system.args[7].toString() + "-" + pageName + "-" + date + "\\" + ReportName + ".pdf", { format: 'pdf', quality: '100' });
  217. phantom.exit();
  218. }, time);
  219. holdStep(true);
  220. }
  221. ];
  222.  
  223. //main code start here......
  224. page.open(clientUrl, function (status) {
  225. //window.chrome = Object.assign({},{'name': 'chrome'})
  226. console.log(status, window.navigator && window.navigator.userAgent, window.chrome);
  227. if (status == 'success') {
  228. interval = setInterval(function () {
  229. stopInterval();
  230. page.clearMemoryCache();
  231. if (!loadInProgress && typeof steps[testindex] == "function" && moveToNextStep) {
  232. t1 = performance.now();
  233. moveToNextStep = false;
  234. // console.log("----------------------------------------------------step "+testindex+"-----" + (ReportId), " time taken for nextstep", t1-t0);
  235. steps[testindex](clientName, username, password);
  236. }
  237. else if (typeof steps[testindex] != "function") {
  238. //console.log("all functions executed");
  239. stopInterval();
  240. }
  241. }, 2000);
  242. }
  243. else {
  244. clearInterval(interval);
  245. phantom.exit();
  246. }
  247. });
Add Comment
Please, Sign In to add comment