Advertisement
Guest User

Untitled

a guest
Dec 11th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.56 KB | None | 0 0
  1. from PySiteCapture.modules import wp_login
  2.  
  3. import asyncio
  4. import argparse
  5. import json
  6. from pyppeteer import launch
  7. from time import strftime
  8.  
  9. project_descr = """
  10. PySiteCapture is used to take multiple screenshots of a website and its elements,
  11. and then compare them against one another.
  12. """
  13.  
  14. """Argument management"""
  15. # Create a class instance of ArgumentParser
  16. parser = argparse.ArgumentParser(description=project_descr)
  17.  
  18. # Generate arguments for the argparser
  19. parser.add_argument('-i', type=str, default='test_list.json', help='The input json.')
  20. parser.add_argument('-w', type=int, default=6, help='The number of workers to spawn and use')
  21. parser.add_argument('--width', type=int, default=1920, help='Used to override the width of the viewport.')
  22. parser.add_argument('--height', type=int, default=1080, help='Used to override the height of the viewport.')
  23. parser.add_argument('--max', type=int, default=5, help='Maximum percentage of allowed image difference')
  24. parser.add_argument('-u', type=str, help='User account for logging into sites and retrieving an auth token')
  25. parser.add_argument('-pw', type=str, help='User password for logging into sites and retrieving an auth token')
  26. parser.add_argument('--nologin', type=bool, default=False, help='Used when sites do not require a login for page SS')
  27.  
  28. # Parse the arguments passed in the command line and assign them to an iterable object named "args".
  29. args = parser.parse_args()
  30.  
  31. # PySiteCapture setup
  32. viewport = {'width': args.width, 'height': args.height}
  33. user = {'login': args.u, 'pass': args.pw}
  34. max_workers = args.w
  35. suffix = '_orig'
  36. job_list = json.load(open(args.i))
  37. workers = 0
  38. tasks = []
  39.  
  40.  
  41. class Worker:
  42.     def __init__(self, w_id, w_container):
  43.         self.id = w_id
  44.         self.page = w_container
  45.         self.name = 'Worker {}: '.format(str(self.id))
  46.         self.job = None
  47.         tasks.append(asyncio.ensure_future(self.get_job()))
  48.         print('[{}]'.format(strftime("%H:%M:%S")) + self.name + 'init')
  49.  
  50.     def log(self, message):
  51.         print('[{}]'.format(strftime("%H:%M:%S")) + self.name + message)
  52.  
  53.     async def get_job(self):
  54.         self.job = job_list.pop(0)
  55.         await self.start_job()
  56.  
  57.     async def start_job(self):
  58.         self.log('Starting job "{}" on {}'.format(self.job['name'], self.job['url']))
  59.         await self.page.goto(self.job['url'])
  60.         element = await self.page.querySelector(self.job['selector'])
  61.         await self.page.screenshot(path='screenshots/{}{}.png'.format(self.job['name'], suffix), clip=await element.boundingBox())
  62.         self.log('Finished job "{}" on {}'.format(self.job['name'], self.job['url']))
  63.  
  64.         if len(job_list) == 0:
  65.             print(self.name + 'Shutting down')
  66.             global workers
  67.             workers -= 1
  68.             if workers == 0:
  69.                 print('INFO: All jobs complete.')
  70.                 loop.stop()
  71.         else:
  72.             await self.get_job()
  73.  
  74.  
  75. async def setup():
  76.     # user_auth = await wp_login.get_auth_token(job_list[0]['url'], user)
  77.     browser = await launch({
  78.         'args': ['--no-sandbox']
  79.     })
  80.     print('[{}]'.format(strftime("%H:%M:%S")) + 'INFO: Spawning {} workers'.format(max_workers))
  81.     for _ in range(0, max_workers):
  82.         page = await browser.newPage()
  83.         await page.setJavaScriptEnabled(False)
  84.         await page.setViewport(viewport)
  85.         global workers
  86.         workers += 1
  87.         worker = Worker(workers, page)
  88.  
  89.  
  90. loop = asyncio.get_event_loop()
  91. loop.run_until_complete(setup())
  92.  
  93. # Run all screenshot jobs
  94. loop.run_forever()
  95.  
  96. # Do image comparison
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement