mirror of
https://github.com/servo/servo.git
synced 2025-08-12 08:55:32 +01:00
Auto merge of #20448 - asoni3:master, r=Manishearth
NCSU Project - Random web content generator <!-- Please describe your changes on the following line: --> Here is the link to our repository which contains the web-page fuzzer: [Link](https://github.com/asoni3/Random-web-content-generator---CSC-517-OSS-Project) **File: start_servo.py** The script is intended to start servo on localhost:7002 **File: servo_automation_screenshot.py** The below program is intended to test rendering mismatches in servo based on random web pages generated by the web page fuzzer. Here is the breakdown of how our code works: * A session is started on localhost:7002 * The randomly generated webpage's (html files) data is sent as JSON to this session * Using curl request, we load the html files for this session ID based on the session we just created * For each html file it renders, it takes the screenshot after rendering which is saved in the current working directory in the format "testing#.png" --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [ ] These changes fix #__ (github issue number if applicable). <!-- Either: --> - [ ] There are tests for these changes OR - [ ] These changes do not require tests because _____ <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/20448) <!-- Reviewable:end -->
This commit is contained in:
commit
625634a027
3 changed files with 157 additions and 1 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -23,7 +23,7 @@ Servo.app
|
||||||
.config.mk.last
|
.config.mk.last
|
||||||
/glfw
|
/glfw
|
||||||
capture_webrender/
|
capture_webrender/
|
||||||
|
/screenshots
|
||||||
# Editors
|
# Editors
|
||||||
|
|
||||||
# IntelliJ
|
# IntelliJ
|
||||||
|
|
132
etc/servo_automation_screenshot.py
Normal file
132
etc/servo_automation_screenshot.py
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
# Copyright 2018 The Servo Project Developers. See the COPYRIGHT
|
||||||
|
# file at the top-level directory of this distribution.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
# option. This file may not be copied, modified, or distributed
|
||||||
|
# except according to those terms.
|
||||||
|
|
||||||
|
"""
|
||||||
|
Created on Mon Mar 26 20:08:25 2018
|
||||||
|
@author: Pranshu Sinha, Abhay Soni, Aayushi Agrawal
|
||||||
|
"""
|
||||||
|
|
||||||
|
"""
|
||||||
|
The below program is intended to test rendering mismatches in servo by taking screenshots of rendered html files.
|
||||||
|
Here is the breakdown of how our code works:
|
||||||
|
* A session is started on localhost:7002
|
||||||
|
* The randomly generated webpage's (html files) data is sent as JSON to this session
|
||||||
|
* Using curl request, we load the html files for this session ID based on the session we just created.
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import requests
|
||||||
|
import start_servo
|
||||||
|
import time
|
||||||
|
import base64
|
||||||
|
import sys
|
||||||
|
import getopt
|
||||||
|
|
||||||
|
|
||||||
|
def print_help():
|
||||||
|
|
||||||
|
print('\nPlease enter the command as shown below: \n')
|
||||||
|
print('python3 ./etc/servo_automation_screenshot.py -p <port>'
|
||||||
|
+ ' -i /path/to/folder/containing/files -r <resolution>'
|
||||||
|
+ ' -n num_of_files\n')
|
||||||
|
|
||||||
|
|
||||||
|
def servo_ready_to_accept(url, payload, headers):
|
||||||
|
while(True):
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Before sending an additional request, we wait for one second each time
|
||||||
|
time.sleep(1)
|
||||||
|
session_request = requests.post(url, data=payload, headers=headers)
|
||||||
|
json_string = session_request.json()
|
||||||
|
# On success, we move on to render the files
|
||||||
|
break
|
||||||
|
except Exception as e:
|
||||||
|
time.sleep(5)
|
||||||
|
print('Exception: ', e)
|
||||||
|
return json_string
|
||||||
|
|
||||||
|
|
||||||
|
def ensure_screenshots_directory_exists():
|
||||||
|
if not os.path.exists('screenshots'):
|
||||||
|
os.makedirs('screenshots')
|
||||||
|
|
||||||
|
|
||||||
|
def render_html_files(num_of_files, url, file_url, json_string, headers, cwd):
|
||||||
|
for x in range(num_of_files):
|
||||||
|
|
||||||
|
json_data = {}
|
||||||
|
json_data['url'] = 'file://{0}file{1}.html'.format(file_url, str(x))
|
||||||
|
print(json_data['url'])
|
||||||
|
json_data = json.dumps(json_data)
|
||||||
|
requests.post('{0}/{1}/url'.format(url, json_string['value']['sessionId']), data=json_data, headers=headers)
|
||||||
|
screenshot_request = requests.get('{0}/{1}/screenshot'.format(url, json_string['value']['sessionId']))
|
||||||
|
image_data_encoded = screenshot_request.json()['value']
|
||||||
|
with open("screenshots/output_image_{0}.png".format(str(x)), "wb") as image_file:
|
||||||
|
image_file.write(base64.decodebytes(image_data_encoded.encode('utf-8')))
|
||||||
|
print("################################")
|
||||||
|
print("The screenshot is stored in the location: {0}/screenshots/"
|
||||||
|
+ " with filename: output_image_{1}.png".format(cwd, str(x)))
|
||||||
|
print("################################")
|
||||||
|
|
||||||
|
|
||||||
|
def main(argv): # take inputs from command line by considering the options parameter i.e -h, -p etc.
|
||||||
|
|
||||||
|
# Local Variables
|
||||||
|
port = ''
|
||||||
|
resolution = ''
|
||||||
|
file_url = ''
|
||||||
|
num_of_files = ''
|
||||||
|
cwd = os.getcwd()
|
||||||
|
url = ''
|
||||||
|
payload = "{}"
|
||||||
|
headers = {'content-type': 'application/json', 'Accept-Charset': 'UTF-8'}
|
||||||
|
json_string = ''
|
||||||
|
try:
|
||||||
|
# input options defined here.
|
||||||
|
opts, args = getopt.getopt(argv, "p:i:r:n:", ["port=", "ifile=", "resolution=", "num-files="])
|
||||||
|
except getopt.GetoptError:
|
||||||
|
# an error is generated if the options provided in commandline are wrong.
|
||||||
|
# The help statement is printed on how to input command line arguments.
|
||||||
|
print_help()
|
||||||
|
sys.exit(2)
|
||||||
|
for opt, arg in opts:
|
||||||
|
if opt == '-h': # -h means help. Displays how to input command line arguments
|
||||||
|
print_help()
|
||||||
|
sys.exit()
|
||||||
|
elif opt in ("-p", "--port"): # store the value provided with the option -p in port variable.
|
||||||
|
port = arg
|
||||||
|
elif opt in ("-i", "--ifile"): # store the value provided with the option -i in inputfile variable.
|
||||||
|
file_url = arg
|
||||||
|
elif opt in ("-r", "--resolution"): # store the value provided with the option -r in resolution variable.
|
||||||
|
resolution = arg
|
||||||
|
elif opt in ("-n", "--num-files"): # store the value provided with the option -n in num_of_files variable.
|
||||||
|
num_of_files = arg
|
||||||
|
|
||||||
|
url = 'http://localhost:{0}/session'.format(port)
|
||||||
|
num_of_files = int(num_of_files)
|
||||||
|
|
||||||
|
# Starting servo on specified port
|
||||||
|
start_servo.start_servo(port, resolution)
|
||||||
|
|
||||||
|
# Waiting until servo is ready to render files
|
||||||
|
json_string = servo_ready_to_accept(url, payload, headers)
|
||||||
|
|
||||||
|
# Making sure the screenshots directory exists, if not, create it
|
||||||
|
ensure_screenshots_directory_exists()
|
||||||
|
|
||||||
|
# Render each HTML file and take a screenshot
|
||||||
|
render_html_files(num_of_files, url, file_url, json_string, headers, cwd)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) < 8:
|
||||||
|
print_help()
|
||||||
|
sys.exit()
|
||||||
|
else:
|
||||||
|
main(sys.argv[1:])
|
24
etc/start_servo.py
Normal file
24
etc/start_servo.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Copyright 2018 The Servo Project Developers. See the COPYRIGHT
|
||||||
|
# file at the top-level directory of this distribution.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
# option. This file may not be copied, modified, or distributed
|
||||||
|
# except according to those terms.
|
||||||
|
|
||||||
|
"""
|
||||||
|
Created on Mon Mar 26 20:08:25 2018
|
||||||
|
@author: Pranshu Sinha, Abhay Soni, Aayushi Agrawal
|
||||||
|
The script is intended to start servo on localhost:7002
|
||||||
|
"""
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
|
def start_servo(port, resolution):
|
||||||
|
|
||||||
|
# Use the below command if you are running this script on windows
|
||||||
|
# cmds = 'mach.bat run --webdriver ' + port + ' --resolution ' + resolution
|
||||||
|
cmds = './mach run --webdriver ' + port + ' --resolution ' + resolution
|
||||||
|
process = subprocess.Popen(cmds, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
return process
|
Loading…
Add table
Add a link
Reference in a new issue