Advertisement
Guest User

Untitled

a guest
Apr 2nd, 2020
460
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.20 KB | None | 0 0
  1. const http = require('http');
  2. const fs = require('fs');
  3. const express = require('express');
  4. const app = express();
  5. const mysql = require('mysql');
  6. const bodyParser = require('body-parser');
  7. const ejs = require('ejs');
  8. const puppeteer = require('puppeteer');
  9. const faker = require('faker/locale/en_US');
  10.  
  11. // const lion_run = require('./lion');
  12. // let booking_code = lion_run.booking_code;
  13.  
  14. var knex = require('knex')({
  15. client: 'mysql',
  16. connection: {
  17. host : '127.0.0.1',
  18. user : 'root',
  19. password : '',
  20. database : 'pointer_sys_db'
  21. }
  22. });
  23.  
  24. app.use(bodyParser.json());
  25. app.use(bodyParser.urlencoded({ extended: false }));
  26.  
  27. app.set('view engine', 'ejs')
  28.  
  29. app.get('/',(req,res) => {
  30. res.send('Home page')
  31. })
  32.  
  33. app.get('/testbook', async (req,res) => {
  34. if (req.query.airlineCode == "") {
  35. // res.send('Airline Code must not null');
  36. res.json({
  37. response: 'False',
  38. message: 'Airline Code must not null.'
  39. })
  40. return;
  41. }
  42.  
  43. let vendorDetails;
  44. try {
  45. let knex_result = await knex('ms_share').where('id_share', req.query.airlineCode)
  46. vendorDetails = JSON.parse(JSON.stringify(knex_result));
  47. } catch (e) {
  48. console.log(e);
  49. }
  50. console.log('=====================================================================');
  51. // console.log('>> vendorDetails: ', vendorDetails);
  52. console.log('Airline : ', vendorDetails[0].name);
  53. console.log('ID Share : ', vendorDetails[0].id_share);
  54. // return;
  55.  
  56. if (req.query.tripType == "OW") {
  57. let tripType = "OW";
  58. } else if (req.query.tripType == "RT") {
  59. let tripType = "RT";
  60. } else {
  61. // res.send('Type Trip must filled with OW or RT.');
  62. res.json({
  63. response: 'False',
  64. message: 'Type Trip must filled with OW or RT.'
  65. })
  66. return;
  67. }
  68.  
  69. if (req.query.codeDepart == "") {
  70. // res.send('Code Depart Code must not null');
  71. res.json({
  72. response: 'False',
  73. message: 'Code Depart Code must not null.'
  74. })
  75. return;
  76. }
  77.  
  78. if (req.query.codeArrive == "") {
  79. // res.send('Code Arrive Code must not null');
  80. res.json({
  81. response: 'False',
  82. message: 'Code Arrive Code must not null.'
  83. })
  84. return;
  85. }
  86.  
  87. let datetime_test = new Date().toLocaleString();
  88. let booking_code;
  89. let booking_url;
  90. let error_report;
  91. let message;
  92. let vendorName = vendorDetails[0].name;
  93. let vendorId = vendorDetails[0].id_share;
  94. let airlineCode= req.query.airlineCode;
  95. let tripType= req.query.tripType;
  96. let codeDepart= req.query.codeDepart;
  97. let codeArrive= req.query.codeArrive;
  98.  
  99. const lead = {
  100. firstName: faker.name.firstName(),
  101. lastName: faker.name.lastName()
  102. };
  103.  
  104. // Generate phone number
  105. let phone_number = "0812"+Math.floor(100000 + Math.random() * 90000000);
  106.  
  107. // Generate random date
  108. let adding_num = Math.floor(Math.random() * (13));
  109. let date_url = 15 + adding_num;
  110.  
  111. // Generate month (use next 3 months from now)
  112. let date_now = new Date();
  113. let month_url = ("0" + (date_now.getMonth() + 3)).slice(-2);
  114.  
  115. // Generate year
  116. let year_url = date_now.getFullYear();
  117.  
  118. // let date_depart = date_url+'/'+month_url+'/'+year_url;
  119.  
  120. const chromeOptions = {
  121. slowMo: 10,
  122. headless:false,
  123. args: ['--window-size=1200,750'],
  124. };
  125.  
  126. // Generate folder to save screenshot file
  127. let year_dir_format = date_now.getFullYear();
  128. let month_dir_format = date_now.getMonth() + 1; //months from 1-12
  129. let date_dir_format = date_now.getDate();
  130. let hour_dir_format = date_now.getHours();
  131. let minute_dir_format = date_now.getMinutes();
  132. let second_dir_format = date_now.getSeconds();
  133.  
  134. let unique_file_id = '_'+hour_dir_format+'_'+minute_dir_format+'_'+second_dir_format;
  135.  
  136. let images_dir = './images';
  137. let year_dir = images_dir+'/'+year_dir_format.toString();
  138. let month_dir = images_dir+'/'+year_dir_format+'/'+month_dir_format.toString();
  139. let date_dir = images_dir+'/'+year_dir_format+'/'+month_dir_format+'/'+date_dir_format.toString()+'/';
  140.  
  141. if (!fs.existsSync(images_dir)){
  142. fs.mkdirSync(images_dir);
  143. }
  144. if (!fs.existsSync(year_dir)){
  145. fs.mkdirSync(year_dir);
  146. }
  147. if (!fs.existsSync(month_dir)){
  148. fs.mkdirSync(month_dir);
  149. }
  150. if (!fs.existsSync(date_dir)){
  151. fs.mkdirSync(date_dir);
  152. }
  153.  
  154. // console.log(hour_dir_format)
  155. // console.log(minute_dir_format)
  156. // console.log(second_dir_format)
  157. // return;
  158.  
  159. (async function main() {
  160. // launch chromium
  161. const browser = await puppeteer.launch(chromeOptions);
  162. const page = await browser.newPage();
  163. await page.setViewport({width:1200, height:750});
  164. const navigationPromise = page.waitForNavigation({waitUntil: "domcontentloaded"});
  165.  
  166. // login
  167. await page.goto('https://cta-dev.pointer.co.id/login');
  168. await page.waitFor('.card-body');
  169. const username= await page.waitForXPath("/html/body/div[1]/div/div[1]/form/div/div/div[4]/div[1]/input");
  170. await username.type("gaya.banda@yahoo.com");
  171. const password= await page.waitForXPath("/html/body/div[1]/div/div[1]/form/div/div/div[4]/div[2]/input");
  172. await password.type("qapointer");
  173. await page.screenshot({path:date_dir+'fill_login'+unique_file_id+'.png', fullPage: true});
  174. const login_button = await page.waitForSelector("#btn_login");
  175. await login_button.click();
  176. await page.waitFor(1000);
  177.  
  178. // search book
  179. await page.goto('https://cta-dev.pointer.co.id/airline/flight?search='+airlineCode+'.'+codeDepart+'.'+codeArrive+'.'+date_url+'/'+month_url+'/'+year_url+'..1.0.0.1');
  180. booking_url = page.url();
  181. console.log("Booking URL is "+booking_url);
  182. await navigationPromise;
  183.  
  184. if (airlineCode=='2') {
  185. try {
  186. await page.waitFor('.flightsec');
  187. } catch (error) {
  188. console.log(".flightsec didn't appear.");
  189.  
  190. }
  191.  
  192. await page.screenshot({path:date_dir+'pilihpenerbangan'+unique_file_id+'.png', fullPage: true});
  193. // const radio = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/div[2]/div/div/div/div[1]/div[2]/div[1]/div[3]/div/div[12]/label/span");
  194. // if (radio !== null) {
  195. // booking_url = page.url();
  196. // console.log("Booking URL is "+booking_url);
  197. // } else {
  198. // console.log('not found')
  199. // };
  200. // await radio.click();
  201.  
  202. try {
  203. await page.waitForSelector('#message-error');
  204. const title = await page.$x("//h6");
  205. let text = await page.evaluate(h6 => h6.textContent, title[0]);
  206. error_report = text;
  207. console.log(text)
  208. message = 'Fail booking '+vendorName;
  209. try {
  210. await knex('automated_testbook').insert({
  211. "id": "",
  212. "datetime_test": datetime_test,
  213. "vendor_id": vendorId,
  214. "vendor_name": vendorName,
  215. "booking_url": booking_url,
  216. "error_report": error_report
  217. })
  218. res.json({
  219. datetime_test: datetime_test,
  220. vendor_id: vendorId,
  221. vendor_name: vendorName,
  222. booking_url: booking_url,
  223. error_report: error_report,
  224. message: message
  225. })
  226. } catch (e) {
  227. console.log(e);
  228. next(e)
  229. }
  230. await browser.close();
  231. } catch (error) {
  232.  
  233. }
  234.  
  235. try {
  236. // Pilih kelas bagian sisi kanan
  237. const radio = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/div[2]/div/div/div/div[1]/div[2]/div[1]/div[3]/div/div/label/span");
  238. await radio.click();
  239. } catch (error) {
  240. // Pilih kelas bagian sisi kiri
  241. const radio = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/div[2]/div/div/div/div[1]/div[2]/div[1]/div[3]/div/div/label/span");
  242. booking_url = page.url();
  243. // console.log("Booking URL is "+booking_url);
  244. await radio.click();
  245. }
  246.  
  247. await page.screenshot({path:date_dir+'click_radio'+unique_file_id+'.png', fullPage: true});
  248. const bookingnow_button = await page.waitForSelector(".bookingnow");
  249. await bookingnow_button.click();
  250. await page.waitFor(4000);
  251. // await page.screenshot({path:date_dir+'masuk_pnr'+unique_file_id+'.png'});
  252.  
  253. // fill pnr form
  254. const firstname_pnr = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/div[5]/b/form/div/div/div[1]/div/div/div[3]/div[2]/div/div/input");
  255. await firstname_pnr.type(lead.firstName);
  256.  
  257. const lastname_pnr= await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/div[5]/b/form/div/div/div[1]/div/div/div[3]/div[3]/div/div/input");
  258. await lastname_pnr.type(lead.lastName);
  259.  
  260. const firstname_contact_person = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/b/div[1]/div/div/div[3]/div[2]/div/input");
  261. const lastname_contact_person= await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/b/div[1]/div/div/div[3]/div[3]/div/input");
  262.  
  263. const phone_contact_person = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/b/div[1]/div/div/div[3]/div[4]/div/input");
  264. await phone_contact_person.type(phone_number);
  265. // await page.waitFor(5000);
  266.  
  267. // const btf_number = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/b/div[1]/div/div/div[4]/div[1]/div/input");
  268. // await btf_number.type("A4321");
  269. // const unit = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/b/div[1]/div/div/div[4]/div[2]/div/input[1]");
  270. // await unit.click();
  271. // const select_unit = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/b/div[1]/div/div/div[4]/div[2]/div/div/div[3]/div/li/ul/li[1]");
  272. // await select_unit.click();
  273. // const wbs = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/b/div[1]/div/div/div[4]/div[3]/div/input[1]");
  274. // await wbs.click();
  275. // const select_wbs = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/b/div[1]/div/div/div[4]/div[3]/div/div/div[3]/div/li/ul/li[1]");
  276. // await select_wbs.click();
  277.  
  278. // const pemohon = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/b/div[1]/div/div/div[4]/div[1]/div/input");
  279. // await pemohon.type(lead.firstName+" "+lead.lastName);
  280. // const divisi = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/b/div[1]/div/div/div[4]/div[2]/div/input");
  281. // await divisi.type("Testbook");
  282.  
  283. const btf = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/div[5]/b/form/div/div/div[1]/div/div/div[3]/div[4]/div/div/input");
  284. await btf.type("Test");
  285.  
  286. await page.screenshot({path:date_dir+'isi_pnr'+unique_file_id+'.png', fullPage: true});
  287. const submit_pnr = await page.waitForXPath("/html/body/div[5]/div[2]/div[2]/div/b/div[1]/div/div/div[6]/input");
  288. await submit_pnr.click();
  289. await navigationPromise;
  290. // await page.waitFor(55000);
  291. } else if (airlineCode=='50') {
  292. console.log('citilink');
  293. return
  294. }
  295.  
  296. // success booking
  297. const message_success = await page.waitForSelector('#message-success', {visible: true, timeout: 60000});
  298. booking_code = await page.$eval('.booking_code', e => e.innerHTML);
  299. console.log(booking_code);
  300. await page.screenshot({path:date_dir+'sukses_booking_'+booking_code+unique_file_id+'.png', fullPage: true});
  301.  
  302. let save_name = lead.firstName+" "+lead.lastName;
  303. message = 'Success booking '+vendorName;
  304. res.json({
  305. datetime_test: datetime_test,
  306. contact_name: save_name,
  307. booking_code: booking_code,
  308. vendor_id: vendorId,
  309. vendor_name: vendorName,
  310. booking_url: booking_url,
  311. error_report: error_report,
  312. message: message
  313. });
  314. // res.send({
  315. // datetime_test: datetime_test,
  316. // contact_name: save_name,
  317. // booking_code: booking_code,
  318. // vendor_id: vendorId,
  319. // vendor_name: vendorName,
  320. // booking_url: booking_url,
  321. // error_report: error_report,
  322. // message: message
  323. // });
  324. try {
  325. await knex('automated_testbook').insert({
  326. "id": "",
  327. "datetime_test": datetime_test,
  328. "contact_name": save_name,
  329. "booking_code": booking_code,
  330. "vendor_id": vendorId,
  331. "vendor_name": vendorName,
  332. "booking_url": booking_url,
  333. "error_report": error_report
  334. });
  335. console.log(booking_code+" is inserted to db");
  336. res.json({
  337. datetime_test: datetime_test,
  338. contact_name: save_name,
  339. booking_code: booking_code,
  340. vendor_id: vendorId,
  341. vendor_name: vendorName,
  342. booking_url: booking_url,
  343. error_report: error_report,
  344. message: message
  345. });
  346. console.log(booking_code+" is send response json");
  347. } catch (e) {
  348. console.log(e);
  349. // next(e)
  350. }
  351.  
  352. // try {
  353. // await res.json({
  354. // datetime_test: datetime_test,
  355. // contact_name: save_name,
  356. // booking_code: booking_code,
  357. // vendor_id: vendorId,
  358. // vendor_name: vendorName,
  359. // booking_url: booking_url,
  360. // error_report: error_report,
  361. // message: message
  362. // });
  363. // console.log(booking_code+" is send response json");
  364. // } catch (e) {
  365. // console.log(e);
  366. // next(e)
  367. // }
  368.  
  369. // send response and then close the browser
  370. // await res.json({
  371. // airlineCode: req.query.airlineCode,
  372. // tripType: req.query.tripType,
  373. // codeDepart: req.query.codeDepart,
  374. // codeArrive: req.query.codeArrive,
  375. // message: 'Success booking lion'
  376. // })
  377. await browser.close();
  378. })()
  379. })
  380.  
  381. app.use('/assets',express.static('assets'))
  382. app.listen(3000);
  383. console.log("Jalan di port 3000");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement