-
Notifications
You must be signed in to change notification settings - Fork 714
/
wpt_batch_lib.py
executable file
·135 lines (108 loc) · 3.84 KB
/
wpt_batch_lib.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/python3
#
# Copyright 2011 Google Inc. All Rights Reserved.
"""A library to support batch processing of WebPageTest tests.
This module provides a set of APIs for batch processing of
WebPageTest tests. A complete test cycle typically consists of
test submission, checking test status, test result download, etc.
A sample usage of this library can be found in wpt_batch.py.
"""
__author__ = '[email protected] (Qi Zhao)'
import urllib.request
import urllib.parse
from xml.dom import minidom
def __LoadEntity(url, apiKey, urlopen=urllib.request.urlopen):
"""A helper function to load an entity such as an URL.
Args:
url: the URL to load
urlopen: the callable to be used to load the url
Returns:
The response message
"""
headers = {}
if apiKey:
headers = {
"X-WPT-API-KEY" : apiKey
}
request = urllib.request.Request(url, headers=headers)
response = urlopen(request)
return response
def ImportUrls(url_filename):
"""Load the URLS in the file into memory.
Args:
url_filename: the file name of the list of URLs
Returns:
The list of URLS
"""
url_list = []
for line in open(url_filename, 'rb'):
# Remove newline and trailing whitespaces
url = line.rstrip(b' \r\n')
if url:
url_list.append(url)
return url_list
def SubmitBatch(url_list, test_params, apiKey, server_url='http://www.webpagetest.org/',
urlopen=urllib.request.urlopen,):
"""Submit the tests to WebPageTest server.
Args:
url_list: the list of interested URLs
test_params: the user-configured test parameters
server_url: the URL of the WebPageTest server
urlopen: the callable to be used to load the request
Returns:
A dictionary which maps a WPT test id to its URL if submission
is successful.
"""
id_url_dict = {}
for url in url_list:
test_params['url'] = url
request = server_url + 'runtest.php?%s' % urllib.parse.urlencode(test_params)
response = __LoadEntity(request, apiKey, urlopen)
return_code = response.getcode()
if return_code == 200:
dom = minidom.parseString(response.read())
nodes = dom.getElementsByTagName('statusCode')
status = nodes[0].firstChild.wholeText
if status == '200':
test_id = dom.getElementsByTagName('testId')[0].firstChild.wholeText
id_url_dict[test_id] = url
return id_url_dict
def CheckBatchStatus(test_ids, server_url='http://www.webpagetest.org/',
urlopen=urllib.request.urlopen):
"""Check the status of tests.
Args:
test_ids: the list of interested test ids
server_url: the URL of the WebPageTest server
urlopen: the callable to be used to load the request
Returns:
A dictionary where key is the test id and content is its status.
"""
id_status_dict = {}
for test_id in test_ids:
request = server_url + 'testStatus.php?f=xml&test=' + test_id
response = __LoadEntity(request, urlopen)
if response.getcode() == 200:
dom = minidom.parseString(response.read())
nodes = dom.getElementsByTagName('statusCode')
status_code = nodes[0].firstChild.wholeText
id_status_dict[test_id] = status_code
return id_status_dict
def GetXMLResult(test_ids, server_url='http://www.webpagetest.org/',
urlopen=urllib.request.urlopen):
"""Obtain the test result in XML format.
Args:
test_ids: the list of interested test ids
server_url: the URL of WebPageTest server
urlopen: the callable to be used to load the request
Returns:
A dictionary where the key is test id and the value is a DOM object of the
test result.
"""
id_dom_dict = {}
for test_id in test_ids:
request = server_url + 'xmlResult/' + test_id + '/'
response = __LoadEntity(request, urlopen)
if response.getcode() == 200:
dom = minidom.parseString(response.read())
id_dom_dict[test_id] = dom
return id_dom_dict