├── Developer-Interfaces ├── batch-library.md ├── batch-processing-command-line-tool.md ├── raw-test-tesults.md └── restful-apis.md ├── Other-Resources ├── 2011-fcc-broadband-data.md ├── hosting-a-test-location.md └── optimization-resources.md ├── Private-Instances ├── agent-setup.md ├── locations.md ├── nodejs-agent.md ├── private-instances.md └── web-page-replay.md ├── README.md ├── System-Design ├── mobile-testing.md ├── overview.md └── webpagetest-relay.md ├── Using-WebPagetest ├── custom-metrics.md ├── metrics-speed-index.md ├── metrics.md ├── quick-start-guide.md ├── result-codes.md └── scripting.md ├── assets └── img │ ├── other │ ├── down.png │ ├── latency.png │ ├── net.png │ └── up.png │ ├── private │ ├── ec2config.png │ └── locations.png │ ├── qrcode.png │ ├── system │ ├── WebPagetest_Mobile_Network.png │ ├── overview.png │ ├── replay1.png │ ├── replay2.png │ └── replay3.png │ └── using │ ├── guide │ ├── WebPagetest_example.jpeg │ ├── browser.png │ ├── change.png │ ├── dom.jpg │ ├── grades.png │ ├── map.png │ ├── start.png │ └── url.png │ └── metrics │ ├── chart-index-a-small.png │ ├── chart-index-b-small.png │ ├── chart-line-small.png │ ├── chart-progress-a-small.png │ ├── chart-progress-b-small.png │ ├── compare_progress.png │ ├── compare_trimmed.png │ ├── distribution.png │ ├── performance.png │ ├── si-cable.png │ └── speedindexformula.png └── demo.md /Developer-Interfaces/batch-library.md: -------------------------------------------------------------------------------- 1 | # 批处理库 2 | 3 | ## 一、API介绍 4 | 我们目前为用户提供以下Python API,帮助他们实现自己的特别批处理测试,添加更多的API。 如果你要添加新的API,可以通过详细说明向wpt-eng@google.com发送请求。我们将评估你的请求,并回复您。 5 | 6 | ## 二、API描述 7 | ### 2.1 创建批处理测试 8 | ```python 9 | def ImportUrls(url_filename): 10 | """Load the URLS in the file into memory. 11 | 12 | Args: 13 | url_filename: the file name of the list of interested URLs 14 | 15 | Returns: 16 | The list of URLS 17 | """ 18 | ``` 19 | 20 | ### 2.2 提交批处理测试 21 | ```python 22 | def SubmitBatch(url_list, test_params, server_url): 23 | """Submit the tests to WebPageTest server. 24 | 25 | Args: 26 | url_list: the list of interested URLs 27 | test_params: the user-configured test parameters 28 | server_url: the URL of the WebPageTest server 29 | 30 | Returns: 31 | A dictionary which maps a WPT test id to its URL if submission 32 | is successful. 33 | """ 34 | ``` 35 | 36 | ### 2.3 检查批处理测试的测试状态 37 | ```python 38 | def CheckBatchStatus(test_ids, server_url): 39 | """Check the status of tests. 40 | 41 | Args: 42 | test_ids: the list of interested test ids 43 | server_url: the URL of the WebPageTest server 44 | 45 | Returns: 46 | A dictionary where key is the test id and content is its status. 47 | """ 48 | ``` 49 | 50 | ### 2.4 获取批处理测试的测试结果 51 | ```python 52 | def GetXMLResult(test_ids, server_url): 53 | """Obtain the test result in XML format. 54 | 55 | Args: 56 | test_ids: the list of interested test ids 57 | server_url: the URL of WebPageTest server 58 | 59 | Returns: 60 | A dictionary where the key is test id and the value is a DOM object of the 61 | test result. 62 | """ 63 | ``` -------------------------------------------------------------------------------- /Developer-Interfaces/batch-processing-command-line-tool.md: -------------------------------------------------------------------------------- 1 | # 批处理命令行工具 2 | 3 | ## 一、工具介绍 4 | 此命令行工具执行简单的一次性批处理测试。它将批量加载输入文件中的一组URL,将所有URL提交到执行测试的WebPageTest服务器,然后下载成功测试的结果并报告失败的测试。该工具主要由我们的批处理库中的API实现,因此也可以作为批处理API的示例使用。 5 | 6 | ## 二、用法说明 7 | ```python 8 | Usage: wpt_batch.py [options] 9 | 10 | Options: 11 | 12 | -h, --help 13 | 显示此帮助消息并退出 14 | 15 | -s SERVER, --server=SERVER 16 | wpt服务器URL。 默认值为“http://www.webpagetest.org/”,它是公用实例,但需要API密钥。 17 | 18 | -i URLFILE, --urlfile=URLFILE 19 | 输入网址文件的路径(文件的每一行都应为http网址,例如“http://www.google.com/”。 20 | 21 | -f OUTPUTDIR, --outputdir=OUTPUTDIR 22 | 要保存测试结果的输出目录的路径。默认值是当前目录下名为“result”的子目录。测试结果文件由url_wpt-test-id.xml命名。 23 | 24 | -y CONNECTIVITY, --connectivity=CONNECTIVITY 25 | 将连接设置为预定义类型:DSL,拨号(Dial),Fios和自定义(区分大小写)。当是自定义连接时,您可以使用以下选项-u / d / l / p设置自定义连接。 26 | 27 | -u BWUP, --bwup=BWUP 28 | 测试的上传带宽(单位:kbps)。默认值为1500(即1.5Mbps)。 29 | 30 | -d BWDOWN, --bwdown=BWDOWN 31 | 下载带宽(单位:kbps)的测试。 默认值为384。 32 | 33 | -l LATENCY, --latency=LATENCY 34 | RTT(单位:ms)。 35 | 36 | -p PLR, --plr=PLR 37 | 测试的包丢失(百分比)率。默认值为0。 38 | 39 | -v FVONLY, --fvonly=FVONLY 40 | 仅第一视图。重复视图通常用于测试缓存。默认值为True。 41 | 42 | -t, --tcpdump 43 | 启用tcpdump。默认值为False。 44 | 45 | -c SCRIPT, --script=SCRIPT 46 | 托管脚本文件 47 | 48 | -r RUNS, --runs=RUNS 49 | 每次测试的运行次数。默认值为9。 50 | 51 | -o LOCATION, --location=LOCATION 52 | 测试位置。默认位置是Dulles。 53 | 54 | -m MV, --mv=MV 55 | 仅为中值运行(median run)保存视频。默认值为1。 56 | ``` 57 | 58 | ## 三、用法示例 59 | ### 3.1 所有默认设置的批处理测试 60 | ```python 61 | ./wpt_batch.py 62 | ``` 63 | 此测试使用所有默认配置。该脚本读取`./urls.txt`文件,将所有文件提交到`http:// latencylab WPT服务器`并将结果(以XML格式)保存在目录`./result`中。用`DSL连接`,重复测试`9次`,并不丢包。 64 | ### 3.2 使用用户指定的输入文件,连接条件和运行次数进行批处理测试 65 | ```python 66 | ./wpt_batch.py --urlfile=/foo/bar/urls.txt --runs=3 --connectivity=custom --bwup=384 --bwdown=1500 --latency=100 --plr=1 67 | ``` 68 | 此测试从`/foo/bar/urls.txt`加载网址。 所有测试重复3次,`384kbps`上传带宽,`1500kbps`下载带宽,`100ms`往返时间,丢包率`1%`。 69 | ### 3.3 使用用户指定的脚本进行帐户登录的测试 70 | ```python 71 | ./wpt_batch.py --urlfile=/foo/urls.txt --script=/foo/script.txt 72 | ``` 73 | 74 | `/foo/urls.txt`的内容: 75 | ```python 76 | http://www.gmail.com/ 77 | ``` 78 | 79 | `script.txt`的内容: 80 | ```python 81 | logData 0 82 | // bring up the login screen 83 | navigate http://www.gmail.com 84 | logData 1 85 | // log in 86 | setValue name=Email latency.testing@gmail.com 87 | setValue name=Passwd tester123= 88 | submitForm id=gaia_loginform 89 | ``` 90 | 这个脚本测试输入信息后登录gmail。 -------------------------------------------------------------------------------- /Developer-Interfaces/raw-test-tesults.md: -------------------------------------------------------------------------------- 1 | # 原始测试结果 2 | ## 一、页面数据字段 3 | 这些是页面级(摘要)结果文件中,从“Raw Page data”链接导出的CSV文件中列。 4 | 5 | 1. Date 6 | 2. Time 7 | 3. Event Name 8 | 4. URL 9 | 5. Load Time (ms) 10 | 6. Time to First Byte (ms) 11 | 7. unused 12 | 8. Bytes Out - 这将总是包含测试的总和,而不考虑测量类型 - Added in build 53 13 | 9. Bytes In - As of build 53 this will always contain the total for the test, regardless of measurement type 14 | 10. DNS Lookups - 同上 15 | 11. Connections - 同上 16 | 12. Requests - 同上 17 | 13. OK Responses - 同上 18 | 14. Redirects - 同上 19 | 15. Not Modified - 同上 20 | 16. Not Found - 同上 21 | 17. Other Responses - 同上 22 | 18. Error Code 23 | 19. Time to Start Render (ms) 24 | 20. Segments Transmitted 25 | 21. Segments Retransmitted 26 | 22. Packet Loss (out) 27 | 23. Activity Time(ms) 28 | 24. Descriptor 29 | 25. Lab ID 30 | 26. Dialer ID 31 | 27. Connection Type 32 | 28. Cached 33 | 29. Event URL 34 | 30. Pagetest Build 35 | 31. Measurement Type - (DWORD - 1表示Web 1.0,2表示Web 2.0) 36 | 32. Experimental (DWORD) 37 | 33. Document Complete Tims (ms) 38 | 34. Event GUID - (与对象数据中的事件GUID匹配) - Added in build 42 39 | 35. DOM Element Time (ms) - 在build 45中添加 40 | 36. Includes Object Data - 指示对象数据是否可用的标志(1表示yes,0表示否) 41 | 37. Cache Score - 具有过期标头的静态资产百分比,以便启用浏览器缓存 - Added in build 51 42 | 38. Static CDN Score - 从CDN提供的静态资产的百分比 - Added in build 51 43 | 39. One CDN Score - 100 - 10 *不同的CDN的使用数量 - Added in build 51 44 | 40. GZIP Score - gzip编码的文本或js资源的百分比 - Added in build 51 45 | 41. Cookie Score - 写入Cookie而不是aol.com域的响应的百分比 - Added in build 51 46 | 42. Keep-Alive Score -服务器中使用持久连接的响应百分比 - Added in build 51 47 | 43. DOCTYPE Score - 具有有效DOCTYPE的html或xhtml资源的百分比 48 | 44. Minify Score - 被缩小的html或js资源的百分比(小于10%的行有前导/尾随空格或注释),在build 51中添加 49 | 45. Combine Score - 从给定主机提供的该类型的唯一资产的js或css资产的百分比(来自同一主机的多个类型中的多个可以组合),在build 51中添加 50 | 46. Bytes Out (Document) - Added in build 53 51 | 47. Bytes In (Document) - Added in build 53 52 | 48. DNS Lookups (Document) - Added in build 53 53 | 49. Connections (Document) - Added in build 53 54 | 50. Requests (Document) - Added in build 53 55 | 51. OK Responses (Document) - Added in build 53 56 | 52. Redirects (Document) - Added in build 53 57 | 53. Not Modified (Document) - Added in build 53 58 | 54. Not Found (Document) - Added in build 53 59 | 55. Other Responses (Document) - Added in build 53 60 | 56. Compression Score - 通过图像压缩测试的图像对象百分比 - Added in build 54 61 | 57. Host - 检索的URL的主机名部分 - Added in build 57 62 | 58. IP Address - 页面上第一个请求的IP地址 - Added in build 66 63 | 59. ETag Score - 通过ETag标头检查的请求百分比- Added in build 170 64 | 60. Flagged Requests - 计数“标记”请求,内部仅在此时使用 - Added in build 179 65 | 61. Flagged Connections - 计数“标记”网络的连接 - Added in build 179 66 | 62. Max Simultaneous Flagged Connections - 同时“标记”连接的最大数量的计数 - Added in build 179 67 | 63. Time to Base Page Complete (ms) - 从测试开始到基本HTML页面完成下载的时间(包括DNS查找,套接字连接,重定向等) - Added in build 179 68 | 64. Base Page Result - 基页(200,404等)的响应代码。如果重定向到位,这将是重定向后基本网页的结果 - Added in build 179 69 | 65. Gzip Total Bytes - Gzip压缩的适用资源总大小 - Added in build 179 70 | 66. Gzip Savings - 可以通过Gzip压缩保存的字节 - Added in build 179 71 | 67. Minify Total Bytes - 缩小的适用资源总大小 - Added in build 179 72 | 68. Minify Savings - 通过缩小保存的字节数 - Added in build 179 73 | 69. Image Compression Total Bytes - 图像压缩的适用资源总大小 - Added in build 179 74 | 70. Image Compression Savings - 通过图像优化保存的字节 - Added in build 179 75 | 71. Base page redirect count - 基页的重定向数 - Added in build 180 76 | 72. Optimization Checked - 如果运行优化检查,则为1,如果不是,则为0 - Added in build 209 77 | 73. Above-the-Fold Time (ms) - 时间直到above-the-fold稳定(如果明确要求) - Added in build 260 78 | 74. DOM Element Count - 文档上的DOM元素数(包括框架中的子文档) - Added in build 274 79 | 75. Page Speed Version - 使用的Page Speed SDK版本 - Added in build 281 80 | 76. Page Title - 所得文件的标题(最终标题) - Added in build 289 81 | 77. Time to Title - 从操作开始到标题第一次更改的时间(以ms为单位) - Added in build 289 82 | 78. Load Event Start 83 | 79. Load Event End 84 | 80. DOM Content Ready Start 85 | 81. DOM Content Ready End 86 | 82. Last Visual Change - 最后一次可视更改页面的时间(以ms为单位,仅在启用视频捕获时可用) 87 | 83. Browser Name 88 | 84. Browser Version 89 | 85. Base Page Server Count - 为基本网页的DNS查找返回的IP地址数 90 | 86. Server RTT - 到基本服务器的估计往返时间(从基页的套接字连接时间获取),如果不可用,则为空 91 | 87. Base Page CDN - 用于提供基本HTML网页的CDN的名称(如果有) 92 | 88. Adult Site Flag - 0不可能是成人网站,1可能是成人内容 93 | 89. Fixed Viewport - 1的页面定义了一个元视口 94 | 90. Progressive JPEG Score - -1为N / A,否则为渐进式JPEG的JPEG字节的百分比 95 | 91. First Paint - 浏览器报告的第一个绘制时间(IE特定属性 - window.performance.timing.msFirstPaint) 96 | 92. Peak Memory across browser processes (deprecated) 97 | 93. Peak browser process count (deprecated) 98 | 94. Doc Complete CPU Time (ms) 99 | 95. Fully Loaded CPU Time (ms) 100 | 96. Doc Complete CPU Utilization (%) 101 | 97. Fully Loaded CPU Utilization (%) 102 | 98. Is Site Responsive (deprecated) 103 | 99. Browser Process Count - 在页面测试结束时测量 104 | 100. Working set size for the main browser process (KB) - 在页面测试结束时测量 105 | 101. Child Private Working Set Size (KB) - 除了主进程之外的所有浏览器进程的私有工作集合总和,在页面测试结束时测量 106 | 102. Time to DOM Interactive - 从导航(Navigation)时间 107 | 103. Time to DOM Loading - 从导航时间 108 | 104. Base Page TTFB - 从请求到基本页面元素的响应的时间 109 | 105. Visually Complete - 第一次当视觉进度达到100% 110 | 106. SpeedIndex - 计算速度指数 111 | 107. Certificate Bytes - 服务器提供的TLS证书中的总字节数 112 | ## 二、请求数据字段 113 | 这些是对象级(摘要)结果文件中,从“Raw Object data”链接导出的CSV文件中列。 114 | 115 | 1. Date 116 | 2. Time 117 | 3. Event Name 118 | 4. IP Address 119 | 5. Action 120 | 6. Host 121 | 7. URL 122 | 8. Response Code 123 | 9. Time to Load (ms) 124 | 10. Time to First Byte (ms) 125 | 11. Start Time (ms) 126 | 12. Bytes Out 127 | 13. Bytes In 128 | 14. Object Size 129 | 15. Cookie Size (out) 130 | 16. Cookie Count(out) 131 | 17. Expires 132 | 18. Cache Control 133 | 19. Content Type 134 | 20. Content Encoding 135 | 21. Transaction Type 136 | 22. Socket ID 137 | 23. Document ID 138 | 24. End Time (ms) 139 | 25. Descriptor 140 | 26. Lab ID 141 | 27. Dialer ID 142 | 28. Connection Type 143 | 29. Cached 144 | 30. Event URL 145 | 31. IEWatch Build 146 | 32. Measurement Type - (DWORD - 1表示Web 1.0,2表示Web 2.0) 147 | 33. Experimental (DWORD) 148 | 34. Event GUID - (与对象数据中的事件GUID匹配) - Added in build 42 149 | 35. Sequence Number - 对于给定页面的对象数据中的每个记录标识(从0开始) 150 | 36. Cache Score - -1:N / A,0:失败,50:被警告,100:通过(有符号字节) Added in build 51 151 | 37. Static CDN Score - -1 if N/A, 0 if it failed, 100 if it passed (signed byte). Added in build 51 152 | 38. GZIP Score - -1 if N/A, 0 if it failed, 100 if it passed (signed byte). Added in build 51 153 | 39. Cookie Score - -1 if N/A, 0 if it failed, 100 if it passed (signed byte). Added in build 51 154 | 40. Keep-Alive Score - -1 if N/A, 0 if it failed, 100 if it passed (signed byte). Added in build 51 155 | 41. DOCTYPE Score - -1 if N/A, 0 if it failed, 100 if it passed (signed byte). Added in build 51 156 | 42. Minify Score - -1 if N/A, 0 if it failed, 100 if it passed (signed byte). Added in build 51 157 | 43. Combine Score - -1 if N/A, 0 if it failed, 100 if it passed (signed byte). Added in build 51 158 | 44. Compression Score - -1 if N/A, 0 if it failed, 50 if it was warned, 100 if it passed (signed byte). Added in build 54 159 | 45. ETag Score - -1 if N/A, 0 if it failed, 100 if it passed (signed byte). Added in build 170 160 | 46. Flagged - 这是一个标记的请求(0 - 否,1 - 是) - Added in build 179 161 | 47. Secure - 这是一个安全的https请求(0 - 否,1 - 是) - Added in build 179 162 | 48. DNS Time (ms) - DNS查找时间(如果N / A,则为-1) - Added in build 179 163 | 49. Socket Connect time (ms) - Socket连接时间(如果N / A,则为-1) - Added in build 179 164 | 50. SSL time (ms) - SSL握手时间(如果N / A,则为-1) - Added in build 179 165 | 51. Gzip Total Bytes - Gzip压缩的适用资源总大小 - Added in build 179 166 | 52. Gzip Savings - 通过Gzip压缩保存的字节数 - Added in build 179 167 | 53. Minify Total Bytes - 缩小的适用资源总大小 - Added in build 179 168 | 54. Minify Savings - 通过缩小保存的字节数 - Added in build 179 169 | 55. Image Compression Total Bytes - 图像压缩的适用资源总大小 - Added in build 179 170 | 56. Image Compression Savings - 通过图像优化保存的字节 - Added in build 179 171 | 57. Cache Time (sec) - 缓存对象的时间(以s为单位)(如果不存在,则为-1) 172 | 58. Real Start Time (ms) - 这是请求开始时的偏移时间(dns查找或Socket连接) - Added in build 205 173 | 59. Full Time to Load (ms) - 这是给定请求的完整时间,包括任何DNS或Socket连接时间 - Added in build 205 174 | 60. Optimization Checked - 1:请求被检查优化,0:不是 - Added in build 209 175 | 61. CDN Provider - 提供请求的CDN提供商 - Added in build 260 176 | 62. DNS Lookup Start - DNS查找的起始偏移量(从测试开始),如果不存在,则为<= 0 177 | 63. DNS Lookup End - DNS查找的结束偏移量(从测试开始),如果不存在,则为<= 0 178 | 64. Socket Connect Start - Socket连接的起始偏移量(从测试开始),如果不存在,则为<= 0开始偏移 179 | 65. Socket Connect End - Socket连接的结束偏移量(从测试开始),如果不存在,则为<= 0开始偏移 180 | 66. SSL Negotiation Start - SSL Negotiation的起始偏移量(从测试开始),如果不存在,则为<= 0开始偏移 181 | 67. SSL Negotiation End - SSL Negotiation的结束偏移量(从测试开始),如果不存在,则为<= 0开始偏移 182 | 68. Initiator - 引发此请求的资源URL,如果不可用,则为空 183 | 69. Initiator Line - 启动程序文件中的行号,如果不可用,则为空 184 | 70. Initiator Column - 启动程序文件中的列偏移,如果不可用,则为空 185 | 71. Server Count - 为给定域的DNS查找返回的IP地址数 186 | 72. Server RTT - 服务器的往返时间(从最快的Socket连接时间到该IP),如果不可用则为空 187 | 73. Local Port - 客户端上用于请求的TCP端口 188 | 74. JPEG Scan Count - JPEG图像中的图像扫描数量(0表示N / A) 189 | 75. Request Priority - 请求的初始优先级(仅限Chrome) 190 | 76. Request ID - 请求的唯一标识符 191 | 77. Server Pushed - 标志,1 =推送 192 | 78. Initiator Type 193 | 79. Initiator Function 194 | 80. Initiator Detail 195 | 81. Protocol - 当前为空白或“HTTP / 2” 196 | 82. HTTP/2 Stream ID 197 | 83. HTTP/2 Priority Parent Stream (depends on) 198 | 84. HTTP/2 Priority Weight 199 | 85. HTTP/2 Exclusive Flag 200 | 86. Certificate Bytes - 任何服务器提供的TLS证书的大小 201 | 87. Uncompressed Object Size - 以字节为单位 202 | 203 | ## 三、聚合结果(批量测试) 204 | 批量测试仅适用于私有实例。在批量测试结果的底部是一个链接来下载一个csv的聚合结果(假设多次运行,每个测试的平均值和中值)。聚合csv每行具有一个测试,并且各种不同的度量被聚合到各列中。csv中的第一行具有包括视图(第一个/重复)以及聚合方法的列描述: 205 | > FV - 第一个视图(缓存清除) 206 | > RV - 重复查看(浏览器关闭,重新打开,页面再次测试) 207 | > Median - 给定测试的所有运行中的给定度量的`中间值`(The median value of the given metric across all of the runs for the given test) 208 | > Average - 给定测试的所有运行中的给定度量的`平均值` 209 | > Std. Dev - 给定测试的所有运行中的给定度量的`值的标准偏差` 210 | 211 | 目前汇总的指标有: 212 | > Successful Tests - 成功测试的运行次数(聚合中包括数据点的数量) 213 | > Document Complete - 从导航(navigation)开始到onload事件触发的时间(由WebPagetest衡量,而不是导航计时) 214 | > Fully Loaded - 从导航开始到网络活动在onload事件后完成的时间 215 | > First Byte - 从导航开始到返回基页的第一个字节的时间(在执行任何重定向之后) 216 | > Start Render - 从导航开始到第一个非白色内容被绘到屏幕的时间 217 | > Bytes In (Doc) - 在文档完成(Document Complete)时间之前下载的字节数 218 | > Requests (Doc) - 文档完成时间之前的http(s)请求数 219 | > Load Event Start - 从W3C导航时序开始加载事件的报告时间(如果浏览器支持) 220 | > Speed Index - 计算[速度指数](/Using-WebPagetest/metrics-speed-index.md) 221 | -------------------------------------------------------------------------------- /Developer-Interfaces/restful-apis.md: -------------------------------------------------------------------------------- 1 | # RESTful API 2 | 3 | ## 一、提交测试请求 4 | 你可以通过执行POST或GET将测试提交到WebPagetest:http://www.webpagetest.org/runtest.php 5 | 响应后,将被重定向到结果页面,或者获得一个xml响应(如果请求了xml)。 6 | ### 1.1 参数 7 | | 参数名 | Required | 描述 | 默认值 | 8 | | :------------|---------------|:-------------|----------| 9 | | url | 必选 | 要测试的URL | | 10 | | label | | 测试的标签 | | 11 | | location | | 测试地点 | Dulles 5Mbps Cable | 12 | | runs | | 测试运行次数(公共实例上为1-10) | 1 | 13 | | fvonly | | 设置为1可跳过重复视图测试 | 0 | 14 | | domelement | | DOM用于记录子测量的元素 | | 15 | | private | | 设置为1时,会隐藏测试日志 | 0 | 16 | | connections | | 覆盖IE使用的并发连接数(0表示不覆盖) | 0 | 17 | | web10 | | 设置为1时,测试在文档完全停止(onload) | 0 | 18 | | script | | 脚本测试执行 | | 19 | | block | | 空格分隔的URL列表(子字符串匹配) | | 20 | | login | | 用于验证测试的用户名(http验证) | | 21 | | password | | 用于验证测试的密码(http验证) | | 22 | | authType | | 使用的认证类型:0 =基本认证,1 = SNS | 0 | 23 | | video | | 设置为1捕获视频(捕获视频用于计算`Speed Index`) | 0 | 24 | | f | | 格式。设置为“xml”以请求XML响应,而不是重定向,或者请求JSON编码响应的“json” | | 25 | | r | | 当使用xml接口时,将在响应中打印 | | 26 | | notify | | 通过电子邮件地址,通知测试结果 | | 27 | | pingback | | 测试完成时ping的URL(测试ID将作为“id”参数传递) | | 28 | | bwDown | | 下载带宽(以Kbps为单位)(在指定自定义连接配置文件时使用) | | 29 | | bwUp | | 上传带宽(Kbps)(指定自定义连接配置文件时使用) | | 30 | | latency | | 第一跳往返时间(以毫秒为单位)(指定自定义连接配置文件时使用) | | 31 | | plr | | 丢包率 - 要丢弃的数据包的百分比(在指定自定义连接配置文件时使用) | 32 | | k |部分必选| API密钥(如果已分配) - 仅适用于`runtest.php`调用。 如果需要,请与网站所有者联系以获取密钥(http://www.webpagetest.org/getkey.php用于公共实例)| | 33 | | tcpdump | | 设置为1以启用tcpdump捕获 | 0 | 34 | | noopt | | 设置为1以禁用优化检查(用于更快的测试) | 0 | 35 | | noimages | | 设置为1以禁用屏幕截图捕获 | 0 | 36 | | noheaders | | 设置为1以禁用保存http头(以及浏览器状态消息和CPU利用率) | 0 | 37 | | pngss | | 设置为1可将完全加载的屏幕截图的全分辨率版本保存为png | | 38 | | iq | | 为屏幕截图和视频捕获指定jpeg压缩级别(30-100) | | 39 | | noscript | | 设置为1以禁用JavaScript(IE,Chrome,Firefox) | | 40 | | clearcerts | | 设置为1以清除操作系统证书缓存(如果证书尚未缓存,则导致IE在SSL协商期间执行OCSP / CRL检查)。 于2.11加入 | 0 | 41 | | mobile | | 设置为1可让Chrome模拟移动浏览器(屏幕分辨率,UA字符串,固定视口)。 于2.11加入 | 0 | 42 | | keepua | | 设置为1以保留原始浏览器用户代理字符串(不要向其附加PTST) | | 43 | | uastring | | 要使用的定制用户代理字符串 | | 44 | | width | | 视口(Viewport)宽度(以css像素为单位) | | 45 | | height | | 视口(Viewport)高度(以css像素为单位) | | 46 | |browser_width | | 浏览器窗口宽度(以显示像素为单位) | | 47 | |browser_height| | 浏览器窗口高度(以显示像素为单位) | | 48 | | dpr | | 模拟移动设备时使用的设备像素比率 | | 49 | | mv | | 在捕获视频时设置为1,以便只存储来自中值运行的视频。 | 0 | 50 | | medianMetric | | 计算中值运行时使用的默认指标 | loadTime | 51 | | cmdline | | 自定义命令行选项(仅限Chrome) | | 52 | | htmlbody | | 设置为1以保存第一个响应(基页)的内容,而不是所有文本响应(bodies= 1) | | 53 | | tsview_id | | 将结果提交到tsviewdb时使用的测试名称(tsviewdb集成的私有实例) | | 54 | | custom | | 在测试结束时收集的自定义指标 | | 55 | | tester | | 指定测试应运行的特定测试程序(必须与`/getTesters.php`中的PC名称匹配)。如果测试不可用,作业将永远不会运行。 | | 56 | | affinity | | 将测试哈希到特定测试代理的字符串。测试人员将根据可用测试人员的指数进行选择。如果测试器的数量改变,则测试将被分发到不同的机器,但是如果计数保持一致,则相同的字符串将总是在同一测试机器上运行测试。这可以用于在比较给定的URL随时间或不同的参数(使用URL作为哈希字符串)时控制可变性。 | | 57 | | timeline | | 设置为1可让Chrome捕获Dev Tools时间轴 | 0 | 58 | |timelineStack | | 设置为1到5之间,以使Chrome包含JavaScript调用堆栈。必须与“时间轴”结合使用。 | 0 | 59 | | ignoreSSL | | 设置为1以忽略SSL证书错误,例如 名称不匹配,自签名证书等。 | 0 | 60 | | mobileDevice | | 来自mobile_devices.ini的设备名称,用于移动模拟(仅当指定mobile = 1才能启用模拟功能且仅适用于Chrome) | | 61 | | appendua | | 要附加到用户代理字符串的字符串。 这是默认的`PTST/ver`字符串之外的。如果还指定了“keepua”,它将仍然附加。允许替换一些测试参数:
%TESTID% - 替换当前测试的测试ID
%RUN% - 用当前运行编号替换
%CACHED% - 用1代替重复视图测试,用0代替初始视图
%VERSION% - 使用当前wptdriver版本号替换| | 62 | 63 | ### 1.2 指定连接 64 | 如果未指定连接,则默认情况下将获取电缆(5/1 Mbps,28ms RTT)配置文件。格式如下: 65 | ```bash 66 | location:browser.connectivity 67 | ``` 68 | 69 | 示例: 70 | ```bash 71 | Dulles_IE7.DSL 72 | Frankfurt.Dial 73 | China.custom 74 | Dulles:Chrome.DSL 75 | ``` 76 | 公共实例支持的配置文件有: 77 | + DSL - 1.5 Mbps下行,384 Kbps上行,50 ms第一跳RTT,0%分组丢失 78 | + Cable - 5 Mbps下行,1 Mbps上行,28ms第一跳RTT,0%丢包 79 | + FIOS - 20 Mbps下行,5 Mbps上行,4 ms第一跳RTT,0%丢包(不是所有位置都将获得全带宽) 80 | + Dial - 49 Kbps下行,30 Kbps上行,120 ms第一跳RTT,0%分组丢失 81 | + 3G - 1.6 Mbps下行,768 Kbps上行,300 ms第一跳RTT,0%丢包 82 | + 3GFast - 1.6 Mbps下行,768 Kbps上行,150 ms第一跳RTT,0%丢包 83 | + Native - No synthetic traffic shaping applied 84 | + custom - 自定义配置文件,带宽和延迟必须使用指定的bwIn,bwOut,latency和plr参数 85 | 86 | 浏览器只需在Chrome、Firefox安装,在多个浏览器中配置wptdriver。 87 | 88 | ### 1.3 XML响应 89 | XML响应遵循REST API的格式。你将获得一个200的HTTP响应,结果是一个XML格式的信息。有关完整示例XML响应的示例,请参阅示例。 90 | ```xml 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | ``` 104 | + statusCode - 200表示成功提交。任何其他的都是一个错误(并将回到400与描述性文本) 105 | + statusText - 故障的错误信息 106 | + requestId - 请求ID来自于前面的`r参数`。如果未指定,将不存在。requestId使跟踪异步请求更容易。 107 | + testId - 分配给测试请求的ID(在所有网址中使用) 108 | + xmlUrl - 用于以XML格式获取结果的URL 109 | + userUrl - 将用户定向到结果页面的网址(如果不使用XML界面,通常会被重定向到的网址) 110 | + summaryCSV - 以CSV格式(页面级数据和时间)的摘要结果的网址。 如果测试尚未完成,将返回404。 111 | + detailCSV - URL格式的完整详细结果(请求级数据和时间)。 如果测试尚未完成,将返回404。 112 | 113 | ### 1.4 Sample 114 | 测试`www.aol.com`并重定向到结果页面: 115 | ```javascript 116 | http://www.webpagetest.org/runtest.php?url=www.aol.com 117 | ``` 118 | 119 | 测试`www.aol.com` 10次,首先查看并重定向到结果页面: 120 | ```javascript 121 | http://www.webpagetest.org/runtest.php?url=www.aol.com&runs=10&fvonly=1 122 | ``` 123 | 124 | 测试`www.aol.com` 2次,得到响应为xml,请求ID为“12345”嵌入响应: 125 | ```javascript 126 | http://www.webpagetest.org/runtest.php?url=www.aol.com&runs=2&f=xml&r=12345 127 | ``` 128 | 129 | ```xml 130 | 131 | 200 132 | Ok 133 | 12345 134 | 135 | 091111_2XFH 136 | http://www.webpagetest.org/xmlResult/091111_2XFH/ 137 | http://www.webpagetest.org/result/091111_2XFH/ 138 | 139 | 140 | ``` 141 | 142 | ## 二、检查测试状态 143 | 可以通过使用测试ID对`http://www.webpagetest.org/testStatus.php`执行GET请求,来检查测试的状态。 144 | ```javascript 145 | http://www.webpagetest.org/testStatus.php?f=xml&test=your_test_id 146 | ``` 147 | 148 | ```xml 149 | 150 | 151 | 100 152 | Test Started 153 | 154 | 100 155 | Test Started 156 | your_test_id 157 | 9 158 | 1 159 | Dulles_IE8 160 | 02/12/11 1:06:16 161 | 1 162 | 0 163 | 164 | 165 | ``` 166 | + statusCode - 200表示测试完成。 1XX表示测试仍在进行中。 和4XX表示一些错误。 167 | + statusText - 状态的说明 168 | + data - 一些测试信息包括测试ID,所请求测试的运行次数,开始时间等(非xml) 169 | 170 | ## 三、获取测试结果 171 | 在正常使用(非xml)下,将被重定向到结果页面。当使用XML API时,应该使用响应测试请求时提供的xmlUrl。 XML url也可以采用一些可选参数: 172 | 173 | | 参数名 | 描述 | 174 | | :------------|:-------------| 175 | | r | 请求ID将会在响应中显示 | 176 | | requests | requests = 1将请求数据包含在XML中(更慢,导致更大的响应) | 177 | | pagespeed | pagespeed = 1在响应中包含PageSpeed分数(可能更慢) | 178 | | domains | domains = 1包括请求和字节的细分 | 179 | | breakdown | breakdown = 1包括按MIME类型的请求和字节的细分 | 180 | 181 | 测试详细信息的响应与提交请求(使用不同的数据)的格式相同。所有时间均以`ms`为单位。 182 | ```xml 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | ... 224 | 225 | 226 | 227 | ``` 228 | + statusCode - 200表示测试完成并且结果可用。1xx表示测试仍然待处理(在合理的时间内再次尝试- 5-10秒)。 400表示无效的测试ID。 229 | + statusText - 失败说明 230 | + requestId - requestId来自于请求 231 | + runs - 响应中的运行数 232 | + average - 所有成功运行的平均测试结果(第一和重复视图数据的块) 233 | + run - 每个测试运行的块以及该运行的结果 234 | + id - 运行编号(从1开始按顺序递增) 235 | + firstView/repeatView - 每个用于First和Repeat视图数据的结果块 236 | + results - 测试结果(所有时间均以`ms`为单位) 237 | + pages - 到用户页面的URL 238 | + thumbnails - 各种图像的缩略图的URL(瀑布,清单,屏幕截图) 239 | + images - 全尺寸图片的URL(瀑布,清单,屏幕截图) 240 | + rawData - 标题和制表符分隔结果文件的URL 241 | 242 | ### 3.1 Sample 243 | 使用前面的测试请求样例(并添加一个requestId),我们将得到: 244 | ```javascript 245 | http://www.webpagetest.org/xmlResult/091111_2XFH/?r=12345 246 | ``` 247 | 248 | ```xml 249 | 250 | 251 | 200 252 | Ok 253 | 12345 254 | 255 | 2 256 | 257 | 258 | 4495 259 | 315 260 | 392645 261 | 392645 262 | 44 263 | 44 264 | 1904 265 | 4495 266 | 4495 267 | 0 268 | 1 269 | 270 | 271 | 3266 272 | 359 273 | 102151 274 | 102151 275 | 13 276 | 13 277 | 682 278 | 3266 279 | 3266 280 | 0 281 | 1 282 | 283 | 284 | 285 | 1 286 | 287 | 288 | http://www.aol.com 289 | 4467 290 | 346 291 | 22403 292 | 22403 293 | 386528 294 | 386528 295 | 43 296 | 43 297 | 0 298 | 1963 299 | 4467 300 | 0 301 | 1 302 | 4467 303 | 0 304 | 48 305 | 96 306 | 100 307 | 87 308 | 94 309 | 91 310 | 75 311 | 99 312 | 93 313 | 1257974116 314 | 315 | 316 |
http://www.webpagetest.org/result/091111_2XFH/1/details/
317 | http://www.webpagetest.org/result/091111_2XFH/1/performance_optimization/ 318 | http://www.webpagetest.org/result/091111_2XFH/1/optimization_report/ 319 | http://www.webpagetest.org/result/091111_2XFH/1/breakdown/ 320 | http://www.webpagetest.org/result/091111_2XFH/1/domains/ 321 | http://www.webpagetest.org/result/091111_2XFH/1/screen_shot/ 322 |
323 | 324 | http://www.webpagetest.org/result/091111_2XFH/1_waterfall_thumb.png 325 | http://www.webpagetest.org/result/091111_2XFH/1_optimization_thumb.png 326 | http://www.webpagetest.org/result/091111_2XFH/1_screen_thumb.jpg 327 | 328 | 329 | http://www.webpagetest.org/results/09/11/11/2XFH/1_waterfall.png 330 | http://www.webpagetest.org/results/09/11/11/2XFH/1_optimization.png 331 | http://www.webpagetest.org/results/09/11/11/2XFH/1_screen.jpg 332 | 333 | 334 | http://www.webpagetest.org/results/09/11/11/2XFH/1_report.txt 335 | http://www.webpagetest.org/results/09/11/11/2XFH/1_IEWPG.txt 336 | http://www.webpagetest.org/results/09/11/11/2XFH/1_IEWTR.txt 337 | 338 |
339 | 340 | 341 | http://www.aol.com 342 | 3418 343 | 357 344 | 8762 345 | 8762 346 | 108138 347 | 108138 348 | 14 349 | 14 350 | 0 351 | 682 352 | 3418 353 | 1 354 | 1 355 | 3418 356 | 0 357 | 35 358 | 83 359 | 100 360 | 66 361 | 83 362 | 100 363 | 100 364 | 100 365 | 93 366 | 1257974129 367 | 368 | 369 |
http://www.webpagetest.org/result/091111_2XFH/1/details/cached/
370 | http://www.webpagetest.org/result/091111_2XFH/1/performance_optimization/cached/ 371 | http://www.webpagetest.org/result/091111_2XFH/1/optimization_report/cached/ 372 | http://www.webpagetest.org/result/091111_2XFH/1/breakdown/ 373 | http://www.webpagetest.org/result/091111_2XFH/1/domains/ 374 | http://www.webpagetest.org/result/091111_2XFH/1/screen_shot/cached/ 375 |
376 | 377 | http://www.webpagetest.org/result/091111_2XFH/1_Cached_waterfall_thumb.png 378 | http://www.webpagetest.org/result/091111_2XFH/1_Cached_optimization_thumb.png 379 | http://www.webpagetest.org/result/091111_2XFH/1_Cached_screen_thumb.jpg 380 | 381 | 382 | http://www.webpagetest.org/results/09/11/11/2XFH/1_Cached_waterfall.png 383 | http://www.webpagetest.org/results/09/11/11/2XFH/1_Cached_optimization.png 384 | http://www.webpagetest.org/results/09/11/11/2XFH/1_Cached_screen.jpg 385 | 386 | 387 | http://www.webpagetest.org/results/09/11/11/2XFH/1_Cached_report.txt 388 | http://www.webpagetest.org/results/09/11/11/2XFH/1_Cached_IEWPG.txt 389 | http://www.webpagetest.org/results/09/11/11/2XFH/1_Cached_IEWTR.txt 390 | 391 |
392 |
393 | 394 | 2 395 | 396 | 397 | http://www.aol.com 398 | 4523 399 | 283 400 | 22772 401 | 22772 402 | 398762 403 | 398762 404 | 44 405 | 44 406 | 0 407 | 1845 408 | 4523 409 | 0 410 | 1 411 | 4523 412 | 0 413 | 48 414 | 96 415 | 100 416 | 88 417 | 97 418 | 91 419 | 75 420 | 98 421 | 93 422 | 1257974140 423 | 424 | 425 |
http://www.webpagetest.org/result/091111_2XFH/2/details/
426 | http://www.webpagetest.org/result/091111_2XFH/2/performance_optimization/ 427 | http://www.webpagetest.org/result/091111_2XFH/2/optimization_report/ 428 | http://www.webpagetest.org/result/091111_2XFH/2/breakdown/ 429 | http://www.webpagetest.org/result/091111_2XFH/2/domains/ 430 | http://www.webpagetest.org/result/091111_2XFH/2/screen_shot/ 431 |
432 | 433 | http://www.webpagetest.org/result/091111_2XFH/2_waterfall_thumb.png 434 | http://www.webpagetest.org/result/091111_2XFH/2_optimization_thumb.png 435 | http://www.webpagetest.org/result/091111_2XFH/2_screen_thumb.jpg 436 | 437 | 438 | http://www.webpagetest.org/results/09/11/11/2XFH/2_waterfall.png 439 | http://www.webpagetest.org/results/09/11/11/2XFH/2_optimization.png 440 | http://www.webpagetest.org/results/09/11/11/2XFH/2_screen.jpg 441 | 442 | 443 | http://www.webpagetest.org/results/09/11/11/2XFH/2_report.txt 444 | http://www.webpagetest.org/results/09/11/11/2XFH/2_IEWPG.txt 445 | http://www.webpagetest.org/results/09/11/11/2XFH/2_IEWTR.txt 446 | 447 |
448 | 449 | 450 | http://www.aol.com 451 | 3113 452 | 360 453 | 7426 454 | 7426 455 | 96163 456 | 96163 457 | 11 458 | 11 459 | 0 460 | 682 461 | 3113 462 | 1 463 | 1 464 | 3113 465 | 0 466 | 25 467 | 66 468 | 100 469 | 58 470 | 77 471 | 100 472 | 100 473 | 100 474 | 91 475 | 1257974152 476 | 477 | 478 |
http://www.webpagetest.org/result/091111_2XFH/2/details/cached/
479 | http://www.webpagetest.org/result/091111_2XFH/2/performance_optimization/cached/ 480 | http://www.webpagetest.org/result/091111_2XFH/2/optimization_report/cached/ 481 | http://www.webpagetest.org/result/091111_2XFH/2/breakdown/ 482 | http://www.webpagetest.org/result/091111_2XFH/2/domains/ 483 | http://www.webpagetest.org/result/091111_2XFH/2/screen_shot/cached/ 484 |
485 | 486 | http://www.webpagetest.org/result/091111_2XFH/2_Cached_waterfall_thumb.png 487 | http://www.webpagetest.org/result/091111_2XFH/2_Cached_optimization_thumb.png 488 | http://www.webpagetest.org/result/091111_2XFH/2_Cached_screen_thumb.jpg 489 | 490 | 491 | http://www.webpagetest.org/results/09/11/11/2XFH/2_Cached_waterfall.png 492 | http://www.webpagetest.org/results/09/11/11/2XFH/2_Cached_optimization.png 493 | http://www.webpagetest.org/results/09/11/11/2XFH/2_Cached_screen.jpg 494 | 495 | 496 | http://www.webpagetest.org/results/09/11/11/2XFH/2_Cached_report.txt 497 | http://www.webpagetest.org/results/09/11/11/2XFH/2_Cached_IEWPG.txt 498 | http://www.webpagetest.org/results/09/11/11/2XFH/2_Cached_IEWTR.txt 499 | 500 |
501 |
502 |
503 |
504 | ``` 505 | 506 | ## 四、取消测试 507 | 使用测试ID(如果需要API密钥),如果它没有开始运行,你可以取消测试,。 508 | ```javascript 509 | http://www.webpagetest.org/cancelTest.php?test=&k= 510 | ``` 511 | 512 | ## 五、地点信息 513 | 可以使用getLocations.php接口请求位置列表以及每个位置的待处理测试数量: 514 | ```javascript 515 | http://www.webpagetest.org/getLocations.php?f=xml 516 | ``` 517 | 518 | ```xml 519 | 520 | 200 521 | Ok 522 | 523 | 524 | Dulles_IE7 525 | 526 | IE 7 527 | 1 528 | 529 | 0 530 | 0 531 | 0 532 | 533 | 534 | 535 | Dulles_IE8 536 | 537 | IE 8 538 | 539 | 0 540 | 0 541 | 0 542 | 543 | 544 | 545 | 546 | ``` -------------------------------------------------------------------------------- /Other-Resources/2011-fcc-broadband-data.md: -------------------------------------------------------------------------------- 1 | # 2011 FCC宽带数据 2 | FCC准备了关于美国宽带互联网接入状况的报告,数据对于测试的连接参数是有用的。我在这里列出关键图表,但完整的报告可在[这里](https://www.fcc.gov/reports-research/reports/measuring-broadband-america/measuring-fixed-broadband-report-2016#block-menu-block-4)。 3 | 4 | ## 一、连通性仿真(dummynet) 5 | WebPagetest中连通性仿真的目的:是提供来自测试代理程序“最后一公里”的性能(但不要在进行物理分布的服务器上更改延迟)。这意味着,目标是从FCC报告中真实地模拟网络图,公共互联网段正常路由: 6 | 7 | ![](/assets/img/other/net.png) 8 | 9 | ## 二、延迟和广告带宽 10 | 在FCC测试中使用的测试服务器分布在测量位置附近,并根据供应商网络中的测量点进行验证,因此延迟测量应该是在dummynet中的网络部分的精确测量。 11 | 12 | ![](/assets/img/other/latency.png) 13 | 14 | ## 三、下行带宽 15 | ![](/assets/img/other/down.png) 16 | 17 | ## 四、上行带宽 18 | ![](/assets/img/other/up.png) -------------------------------------------------------------------------------- /Other-Resources/hosting-a-test-location.md: -------------------------------------------------------------------------------- 1 | # 托管测试位置 2 | 3 | ## 一、安全注意事项 4 | 期待被黑! 5 | 6 |   如果要为WebPagetest的公共实例运行测试位置,应该将测试系统视为被黑客入侵。你正在运行一台机器,Internet上的任何人都能浏览任何页面,甚至可以利用浏览器漏洞的页面。你可以采取很多保护措施来最大限度地降低风险,但是永远不能消除这种风险,所以不要将测试系统放在任何权限低的地方。 7 | 有些事情要考虑: 8 | + 如果可以的话,将测试系统放入DMZ,隔离任何敏感内容 9 | + 将测试系统设置为自动安装Windows更新 10 | + 由于视频录像的完成方式,测试系统还需要保持登录到管理员帐户的桌面,因此应该考虑系统的物理安全性。 11 | 12 | ## 二、系统要求 13 | 由于WebPagetest在测试中使用真正的浏览器,所以我们需要测试系统运行Windows。 14 | + Windows(7或更高版本,Server 2003 R2或更高版本)。32或64位都很好(操作系统需要支持您想要提供的浏览器) 15 | + 专用PC(Pentium 4或更新版本,最低2GB RAM)或等效虚拟机(ESX / ESXi和Xen工作良好,KVM已被使用但未经过测试)。 16 | + 互联网连接 - 越快越好(延迟最小)。流量能够设置,从而为连接类型提供更多的可能性。 17 | + 实际上,任何具有<28ms RTT延迟的5MBps(向下)的任何功能都可以使用,因为10Mb以太网将是首选。 18 | 19 | ## 三、我需要配置一个新的位置 20 | 我需要一些有关测试位置和系统本身的基本信息: 21 | + 将支持哪个版本的IE 22 | + 城市,区域(如果适用)和测试系统运行的国家 23 | + 连接信息(上/下带宽和第一跳RTT) 24 | + 如果位置有问题,请联系(电子邮件地址)发送通知的位置 25 | 26 | 此外,通过托管测试位置,将获得网站上显示的促销标志和横幅: 27 | + 当有人正在进行测试或从你的位置查看结果(以及在主要着陆页上显示的轮播)时,主站点横幅将显示你的横幅。横幅广告空间是728x90(虽然较小的横幅也可以使用) 28 | + 还有一个“提供的”标志需要适应180px x 40px的区域。 29 | + 我需要2个标志点的图形文件以及你希望它们链接的位置(和替代文本) 30 | 31 | ## 四、配置测试系统 32 | 一旦我有必要的信息,我将在服务器上配置新的位置,并提供正确配置的测试软件。配置测试系统是相当简单的。 33 | 按照与配置私有实例相同的步骤:[Private Instances](/Private-Instances/private-instances.md) 34 | 如果从RDP进入系统,则在完成操作后重新启动,以免桌面未保持锁定。 35 | 如果提供远程系统访问(RDP或VNC),我也可以在代理上安装软件,并且还要保养它。 36 | 37 | ## 五、持续支持 38 | 除了任何意外的中断,系统应该自己运行。 39 | 如果你提供我远程访问系统,我可以分流任何中断,否则我将需要一个联络点。 -------------------------------------------------------------------------------- /Other-Resources/optimization-resources.md: -------------------------------------------------------------------------------- 1 | # 优化资源 2 | 3 | 现在你知道你的网站的表现,你做了什么? 这是一系列资源,从自助到商业解决方案,可以帮助您提高网站的性能(通常相当大)。 4 | 免责声明:这里列出的商业服务和顾问都以某种方式(通常通过运行测试位置)为WebPagetest做出了贡献。 这并不是详尽的服务清单,但这些服务当然是他们所在地区的良好的专家,并且比大多数人的工作时间长。 5 | 6 | ## 一、 解决方案提供商 7 | ### 1.1 自动站点优化 8 | 这些软件,设备或服务将自动将优化应用于您的网站 9 | + [Akamai ION](https://www.akamai.com/us/en/products/web-performance/web-performance-optimization.jsp) 10 | + [Cloudflare](https://www.cloudflare.com/website-optimization/) 11 | + [Fasterize](https://www.fasterize.com/en/go-beyond-webpagetest/) 12 | + [Instart Logic](https://www.instartlogic.com/solutions/appspeed) 13 | 14 | ### 1.2 网站监控 15 | + [Catchpoint](https://www.catchpoint.com/) 16 | + [Dotcom-Monitor](https://www.dotcom-monitor.com/) 17 | + [ip-label](http://www.ip-label.co.uk/) 18 | + [Speedcurve](https://speedcurve.com/) 19 | 20 | ### 1.3 杂项 21 | + [PSW Group (Germany)](http://www.psw.net/) - 互联网安全解决方案 22 | + [Exceda (Brazil)](https://www.exceda.com/us/) - Akamai CDN和加速服务 23 | + [edgedirector.com](http://edgedirector.com/) - 用于全局负载平衡和故障转移的DNS服务 24 | 25 | ## 二、顾问 26 | + [Aaron Peters](http://www.aaronpeters.nl/en/) 27 | + [Daemon Solutions](http://www.daemonsolutions.com/) 28 | + [Sajal Kayan](http://www.sajalkayan.com/web-speed-consulting-services) 29 | + [Zeroload](http://www.function.fr/) 30 | + [MeasureWorks](http://www.measureworks.nl/) 31 | + [Global Media Systems](http://www.globalis-ms.com/) 32 | + [iCOMcept](http://www.icomcept.de/) 33 | 34 | ### 三、自助 35 | 如果自己做优化或只是想学习更多,这些是开始的好地方。 36 | 37 | ### 3.1 工具 38 | + [Google Page Speed](http://code.google.com/speed/page-speed/) - 用于分析页面的Firefox扩展和用于自动优化的Apache模块 39 | + [Dynatrace Ajax Edition](https://www.dynatrace.com/) - IE浏览器插件,用于分析页面和分析javascript 40 | 41 | ### 3.2 讨论组 42 | + [WebPagetest Forums](http://www.webpagetest.org/forums/forumdisplay.php?fid=4) 43 | + [Make the Web Faster Google group](http://groups.google.com/group/make-the-web-faster) 44 | + [Yahoo Exceptional Performance Group](https://groups.yahoo.com/neo/groups/exceptional-performance/info) 45 | 46 | ### 3.3 在线资源 47 | + [Google's Make the Web Faster site](https://developers.google.com/speed/?csw=1) 48 | + [Yahoo's Exceptional Performance site](https://developer.yahoo.com/performance/) -------------------------------------------------------------------------------- /Private-Instances/agent-setup.md: -------------------------------------------------------------------------------- 1 | # 代理安装 2 | 3 | ## 一、要求 4 |   你需要一个主机来运行代理。我们为每个设备创建一个代理。主机可以运行多个代理。 5 |   任何支持NodeJS和adb的操作系统都应该可以正常工作,但是Linux和Windows是唯一可以进行定期测试的操作系统。 如果你的主机只有USB 3,你可能需要使用Windows(至少截至2014年2月,Linux上的USB 3驱动程序非常不稳定)。 如果你的主机作为USB 2.0端口,那么Linux或Windows是一个好的选择。 6 |   对于Android,您将需要一个运行KitKat(4.4)或更高版本的手机,可以植根(Nexus设备和Motorola G的工作良好)。 7 |   我们假设你使用的是Linux和Nexus4。 8 | 9 | ## 二、准备设备 10 | ### 2.1 Android 11 | + 根设备(首先执行此操作,因为它会清除所有设置) 12 | + Nexus设备(4,5,7) - [cf-auto-root](https://autoroot.chainfire.eu/)(最好是手动“adb reboot bootloader”和“fastboot oem unlock”) 13 | + 摩托罗拉G([解锁引导加载程序](https://motorola-global-portal.custhelp.com/app/standalone/bootloader/unlock-your-device-a/action/auth)然后使用[超级引导](http://www.modaco.com/topic/366771-root-your-moto-g-option-1-superboot/)) 14 | + 进入SuperSU设置(如果已安装)并禁用通知并将默认访问权限设置为grant 15 | + 从Play商店安装Chrome,Chrome测试版和Chrome开发者(请确保Chrome更新到最新版本) 16 | + 启动两者并接受服务条款,并关闭任何“帮助使Chrome更好”对话框 17 | + 确保Google Play已配置为自动安装更新 18 | + 停用滑动即可解锁(可选,在安全设置中) 19 | + 激活开发人员模式(点击操作系统版本7次) 20 | + 启用USB调试(在开发人员选项中) 21 | + 停用屏幕睡眠(在开发者选项中) 22 | + 禁用屏幕自动旋转(除非设置横向测试设备) 23 | + 大多数发行版都有快速设置锁定屏幕方向,否则可能在“显示”菜单下作为“当设备旋转时”设置,选择保持纵向模式。 24 | + 将屏幕亮度降至最低(减少热量和电源使用) 25 | + 静音音量(可选) 26 | + 将手机设置为飞行模式并启用WiFi(可选,仅当未通过蜂窝连接进行测试时) 27 | + 如果在Android 5.0或更高版本(Lollipop)上停用与近期应用的标签集成 28 | + 打开Chrome的每个实例(stable,beta,dev) 29 | + 打开设置 30 | + “合并标签页和应用程序” - 关闭 31 | ### 2.2 iOS (work in progress) 32 | + 越狱的设备(包括Cydia) 33 | + 安装OpenSSH 34 | + 在绑定的主机上创建ssh密钥并另存为`~/.ssh/id_dsa_ios` 35 | + 将ssh公钥添加到`~/.ssh/authorized_keys` 36 | + 安装tcpdump 37 | + 锁定设备旋转(如果需要) 38 | + 启用Web检查器(设置 - > Safari - >高级) 39 | + 用于设备管理的有用应用程序(来自cydia): 40 | + “veency” - VNC服务器远程触发滑动解锁,方便重新启动设备 41 | + “核心实用程序(Core Utilities)” - 包括检查存储使用的 42 | + “支持不支持的附件8” - 防止“此附件可能不支持”消息从间歇性出现(请确保在设置中启用它) 43 | 44 | ## 三、准备主机 45 | Raspberry Pi设备是运行Android设备的主机。[此处](https://github.com/WPO-Foundation/webpagetest/blob/master/docs/Private%20Instances/MobileAgentRaspberryPi.md)提供了描述如何配置它们的文档。 46 | + 安装NodeJS(`shell -v`从shell /命令行验证) 47 | + Ubuntu:`sudo apt-get install nodejs`然后`sudo ln -s /usr/bin/nodejs /usr/sbin/node` 48 | + Windows:安装Windows版本的node.js并将其添加到你的路径(作为安装选项或手动) 49 | + OSX:`brew install node` 50 | + 安装ImageMagick(屏幕截图和视频处理所必需的,从shell /命令行`convert -version`验证) 51 | + Ubuntu:`sudo apt-get install imagemagick` 52 | + Windows:[安装Windows版本的ImageMagick](http://www.imagemagick.org/script/binary-releases.php#windows)并将其添加到您的路径(作为安装选项或手动) 53 | + OSX:`brew install imagemagick` 54 | + 安装ffmpeg与x264支持(视频处理所必需) 55 | + OSX:`brew install ffmpeg` 56 | + 安装python 2.7和支持库 57 | + 安装Pillow库:`pip install pillow` 58 | + 安装ujson(用于更快的跟踪解析):`pip install ujson` 59 | + 安装代理代码 60 | + 手动安装需要`agent/js`目录 61 | + 直接使用git(假设在`~/wpt`,但可以安装在任何地方): 62 | ```bash 63 | cd ~ 64 | git clone http://github.com/WPO-Foundation/webpagetest.git wpt 65 | ``` 66 | + 连接手机 67 | 68 | ### 3.1 Android特定主机配置 69 | + 安装adb并确保它在你的路径(“adb设备”从shell /命令行来验证设备连接后) 70 | + Ubuntu:`sudo apt-get install android-tools-adb` 71 | + 否则,从[Android SDK](http://developer.android.com/sdk/index.html) 72 | + 配置[udev规则](https://developer.android.com/studio/run/device.html)(仅限Linux) 73 | 74 | ### 3.2 iOS特定主机配置(工作进行中) 75 | + 需要OSX Yosemite(10.10)或更高版本进行视频捕获 76 | + 截至目前,OSX只能从一个设备捕获视频。这就需要为每个iPhone使用专用的Mac,用于测试。 77 | + 需要在OSX上的XCode屏幕截图 78 | + 复制`/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport` 到 `wpt/agent/js/lib/ios/DeviceSupport` 79 | + 确保目录名称仅包含操作系统版本(无构建信息) 80 | + 安装`libimobiledevice` - `brew install libimobiledevice` 81 | + 安装`ios_webkit_debug_proxy` - `brew install ios_webkit_debug_proxy` 82 | 83 | ## 四、连接并验证配置 84 | ### 4.1 Android 85 | + 授权并验证与设备的adb连接 86 | + `adb devices` - 确保列出了设备(出现提示时,单击设备屏幕上的授权) 87 | + 验证根 88 | + `adb shell su -c date` 89 | + 验证网络是否已启动 90 | ```bash 91 | adb shell netcfg | grep wlan 92 | wlan0 UP 1.2.3.4/26 0x00001043 ac:47:e8:4b:3a:81 93 | 94 | adb shell ping yahoo.com 95 | ``` 96 | + 验证Chrome是否正常运行 97 | ```bash 98 | adb shell am start \ 99 | -n com.android.chrome/com.google.android.apps.chrome.Main \ 100 | -d http://yahoo.com 101 | ``` 102 | 103 | ## 五、在WPT服务器上配置locations.ini 104 | 修改WPT服务器设置以添加测试位置和浏览器,例如: 105 | ```bash 106 | Test location: Example 107 | Browser: Nexus4 - Chrome 108 | ``` 109 | 通过编辑`settings/locations.ini`: 110 | ```bash 111 | [locations] 112 | 1=Example 113 | 114 | [Example] 115 | 1=Example_Nexus4 116 | label="Example" 117 | 118 | [Example_Nexus4] 119 | browser=Nexus4 - Chrome,Nexus4 - Chrome Beta 120 | label="Nexus 4" 121 | type=nodejs,mobile 122 | connectivity="WiFi" 123 | ``` 124 | 要使用Play商店中的Chrome和Chrome测试版,浏览器名称需要分别以“ - Chrome”和“ - Chrome测试版”结尾。 125 | 126 | ## 六、启动代理 127 | 启动代理: 128 | ```bash 129 | cd ~/wpt/agent/js 130 | ./wptdriver.sh \ 131 | -m debug \ 132 | --browser android:0088a434deadbeef \ 133 | --serverUrl example.com \ 134 | --location Example_Nexus4 \ 135 | --processvideo yes 136 | ``` 137 | 它应该打印: 138 | 139 | NODE_PATH=... 140 | node src/agent_main ... 141 | I 0913Z22:06:45.073 wpt_client.js:293 Client.requestNextJob_ : \ 142 | Get work: http://example.com/work/getwork.php?location= Example_Nexus4&pc=0088a434deadbeef&f=json 143 | ..... 144 | 145 | 它将每10秒轮询上述URL。 146 | 要可选地保持代理运行,如果/当你注销,请包装上述命令为: 147 | ```bash 148 | nohup ... &>0088a434deadbeef.log & 149 | ``` 150 | (可选)指定特定的Chrome浏览器包: 151 | ```bash 152 | --chromePackage com.android.chrome 153 | ``` 154 | 其他可用的命令行选项: 155 | ```bash 156 | --alive // Touch a .alive file while running (集成 adbwatch.exe,用于重新启动死了的代理程序) 157 | --apiKey // 轮询工作时使用指定的api key 158 | --checknet yes // 在轮询工作之前检查IP地址的有效性 159 | --chromePackage com.android.chrome // 指定一个浏览器包 160 | --maxtemp // 最大允许电池温度 - 即最大温度36.8 161 | --name // 使用指定的友好的设备名称进行报告,而不是设备ID 162 | --processvideo yes // 在本地进行视频捕获,而不是在服务器上进行。 需要python 2.7的路径和visualmetrics.py在代理目录(运行“python visualmetrics.py -c”来验证配置) 163 | --rotate // 旋转屏幕截图(适用于景观测试) 164 | --tcpdumpBinary // 要在代理上动态安装tcpdump的arm构建路径 165 | --trafficShaper // 请参阅“流量整形” 166 | --exitTests // 运行指定数量的测试后退出(有助于控制节点的内存使用) 167 | ``` 168 | 169 | ## 七、高级功能 170 | ### 7.1 WebDriver脚本 171 | 在桌面浏览器上,将作业提交到`http://example.com`,例如: 172 | Advanced Settings > Script > Enter Script: 173 | ```javascript 174 | driver = new webdriver.Builder().build(); 175 | driver.get('http://www.google.com'); 176 | driver.findElement(webdriver.By.name('q')).sendKeys('webdriver'); 177 | driver.findElement(webdriver.By.name('btnG')).click(); 178 | driver.wait(function() { 179 | return driver.getTitle(); 180 | }) 181 | ``` 182 | 183 | ### 7.2 Android tcpdump 184 | + 从[omappedia.org](http://omappedia.org/wiki/USB_Sniffing_with_tcpdump)下载一个预编译的tcpdump二进制文件。 185 | + Gunzip并将二进制文件复制到`~/wpt/lib/tcpdump` 186 | + 重新运行wptdriver.sh与其他args:`--tcpdumpBinary ~/wpt/lib/tcpdump` 187 | + 当你提交作业时,通过以下方式启用tcpdump: 188 | + Advanced Settings > Advanced > Capture network packet trace (tcpdump) 189 | + 验证代理是否上传pcap。 190 | 191 | ### 7.3 流量整形 192 | 设备流量整形: 193 | + 例如 Android [tc](https://www.cyberciti.biz/faq/linux-traffic-shaping-using-tc-to-control-http-traffic/)(需要在设备上`/proc/net/psched`和`/system/bin/tc`)。 194 | + 可能通过以下“trafficShaper”脚本方法实现。 195 | 最简单的配置是假设所有流量都通过桌面,例如: 196 | + 将另一个以太网卡添加到您的桌面。 197 | + 将WiFi接入点连接到此附加卡。 198 | + 验证Linux启用IP转发([操作方法](http://www.ducea.com/2006/08/01/how-to-enable-ip-forwarding-in-linux/)) 199 | + 将您的移动设备配置为使用WiFi接入点。 200 | + 验证你设备的WiFi流量是否通过您的桌面路由(通过tcpdump或wireshark) 201 | 如果流量未通过你的桌面路由,请创建本地`trafficShaper`脚本(例如)使用无密码ssh配置远程交换机。 202 | [issue/147](https://github.com/WPO-Foundation/webpagetest/issues/147) 添加了对用户定义的`trafficShaper`脚本的支持: 203 | + 创建流量整形师脚本,例如 `~/wpt/shaper` 204 | + 运行`./wptdriver.sh`与`--trafficShaper ~/wpt/shaper`和可选的`--trafficShaperArg anyString`(例如foo1.2.3.4)。 205 | + 修改WPT服务器的设置`/locations.ini`以删除`connectivity =`行(允许作业选项)。 206 | + 提交作业,`Advanced Settings > Connection`设置为(例如)“56K拨号”,服务器的connectivity.ini定义为: 207 | ```bash 208 | label="56K Dial-Up (49/30 Kbps 120ms RTT)" 209 | bwIn=49000 210 | bwOut=30000 211 | latency=120 212 | plr=0 213 | ``` 214 | Before each run, the agent should call: 215 | ```bash 216 | ~/wpt/shaper -s 0088a434deadbeef start --arg foo1.2.3.4 --bwIn 49 --bwOut 30 --latency 120 217 | ``` 218 | where "0" values are not passed (e.g. the above plr=0) 219 | The agent will check the script's stdout for an optional line matching "stop=VALUE" (e.g. "stop=bar42"). 220 | Verify that pages load slowly due to your traffic shaper. 221 | After each run, the agent should call: 222 | ```bash 223 | ~/wpt/shaper -s 0088a434deadbeef stop --arg bar42 224 | ``` 225 | 226 | 粗糙ipfw注意: 227 | + 安装`ipfw3,sudo chmod 7755 /sbin/ipfw`,验证ipfw3列表打印`65535 allow ip from any to any` 228 | + 从`adb shell netcfg | grep wlan`(例如1.2.3.4),运行`./wptdriver.sh`与`--deviceAddr 1.2.3.4` 229 | + 修改WPT服务器的设置`/locations.ini`以删除`connectivity =`行。 230 | + 通过`Advanced Settings > Connection`设置为(例如)“56K拨号”提交作业。 231 | + 验证代理打印预期的ipfw命令(例如`ipfw add ...`,`ipfw pipe ...`) 232 | + 验证页面由于流量整形而缓慢加载。 233 | 234 | ### 7.4 视频捕获(非Android) 235 | 粗糙笔记: 236 | + 创建捕获脚本,例如 `~/wpt/video/capture` 237 | + 使用`--captureDir ~/wpt/video`和可选的`--videoCard anyString`运行`./wptdriver.sh`(例如将卡名传递给脚本)。 238 | + 代理将调用 239 | ```bash 240 | ~/wpt/video/capture -f pid_video.avi -s 0088a434deadbeef -t mako -d anyString -w 241 | ``` 242 | 243 | + 其中`mako`是Nexus4的`adb shell getprop ro.product.device`代号。 244 | + 当代理想要停止捕获时,它会杀死上面的进程,然后阅读`pid_video.avi`。 245 | 246 | ### 7.5 按每个设备用户运行 247 | 主要用于杀死任何僵尸进程,例如。 剩余视频捕获。 248 | 粗糙笔记: 249 | + 为此设备创建用户,例如通过: 250 | ```bash 251 | sudo useradd -d /home/0088a434deadbeef -m 0088a434deadbeef 252 | ``` 253 | 254 | + 切换到此用户(可选择通过`/etc/sudoers.d/wpt`文件和`sudo -u`) 255 | + 运行`./wptdriver.sh`与`--killall 1` 256 | + 代理将`killall -9`所有由其用户拥有的pids,除了它自己的pid。 这个`killall`确保在作业之间没有僵尸进程,但是注意它也会杀死任何登录shell,所以确保使用nohup运行! -------------------------------------------------------------------------------- /Private-Instances/locations.md: -------------------------------------------------------------------------------- 1 | # 地点 2 | 配置WebPagetest实例的一个更困难的方面是设置位置的配置并将其与测试代理上的位置匹配。 3 | 4 | 在本例中,我们将配置4个不同的测试机器: 5 | + 机器#1 - 配置有安装在内部办公网络上的IE 8,Chrome和Firefox的PC 6 | + 机器#2 - 配置有位于Virginia的IE 8和Chrome的PC 7 | + 机器#3 - 在California配置有IE 8的PC 8 | + 机器#4 - 在California配置有IE 9的PC 9 | 10 | 逻辑上配置将如下所示: 11 | 12 | ![](/assets/img/private/locations.png) 13 | 14 | 有3个不同的物理位置 - Office,Virginia和California。 这些将显示在用户界面中的“测试位置”下拉列表中。 15 | Office和Virginia计算机将运行URLBlast(对于IE)和WptDriver(对于Chrome和Firefox)。 每个加利福尼亚州的计算机将只运行URLBlast(对于IE)。 每个软件实例(URLBlast或WptDriver)都指向服务器上特定于该机器配置(在locations.ini配置中的叶节点)的配置。 16 | 这里是上面例子中的locations.ini配置: 17 | ```bash 18 | [locations] 19 | 1=Office 20 | 2=Virginia 21 | 3=California 22 | default=Office 23 | 24 | ; These are the top-level locations that are listed in the location dropdown 25 | ; Each one points to one or more browser configurations 26 | 27 | [Office] 28 | 1=Office_IE8 29 | 2=Office_wptdriver 30 | label="Office LAN (Virginia - IE8,Chrome,Firefox)" 31 | 32 | [Virginia] 33 | 1=Virginia_IE8 34 | 2=Virginia_wptdriver 35 | label="Virginia (IE8,Chrome)" 36 | 37 | [California] 38 | 1=California_IE8 39 | 2=California_IE9 40 | label="California (IE8,9)" 41 | 42 | ; These are the browser-specific configurations that match the configurations 43 | ; defined in the top-level locations. Each one of these MUST match the location 44 | ; name configured on the test agent (urlblast.ini or wptdriver.ini) 45 | 46 | [Office_IE8] 47 | browser=IE 8 48 | label="Office LAN - IE8" 49 | 50 | [Office_wptdriver] 51 | browser=Chrome,Firefox 52 | label="Office LAN" 53 | 54 | [Virginia_IE8] 55 | browser=IE 8 56 | label="Virginia - IE8" 57 | 58 | [Virginia_wptdriver] 59 | browser=Chrome 60 | label="Virginia" 61 | 62 | [California_IE8] 63 | browser=IE 8 64 | label="California - IE8" 65 | 66 | [California_IE9] 67 | browser=IE 9 68 | label="California - IE9" 69 | ``` 70 | 71 | *重要信息:“Office”,“Virginia”和“California”是在UI中使用的逻辑分组,但测试计算机将永远不会被配置为指向它们。 UrlBlast.ini和wptdriver.ini必须指向浏览器特定的配置。* 72 | 73 | 如果映射设置不正确,还是可以提交测试,但它们永远不会被处理,因为测试机器没有使用正确的位置ID连接。 -------------------------------------------------------------------------------- /Private-Instances/nodejs-agent.md: -------------------------------------------------------------------------------- 1 | # Node.js代理 2 | 3 | ## 一、概述 4 | Node.js代理支持桌面浏览器和移动设备。 5 | 支持的浏览器: 6 | + 桌面Chrome(通过chromedriver2) 7 | + Android Chrome(通过chromedriver2) 8 | + iOS移动Safari(通过[ios-webkit-debug-proxy](https://github.com/google/ios-webkit-debug-proxy)) 9 | 10 | 其他功能包括: 11 | + Android on-device tcpdump支持(通过tcpdump apk)。 12 | + Chrome WebDriver脚本支持(iOS是待处理的[ios驱动程序](https://github.com/ios-driver/ios-driver))。 13 | + 通过用户定义的“捕获”脚本进行视频捕获。 14 | 15 | ## 二、文件 16 | + [如何安装代理](/Private-Instances/agent-setup.md) 17 | + [如何编写异步JavaScript代码](/Developer-Information/async-js.md) -------------------------------------------------------------------------------- /Private-Instances/private-instances.md: -------------------------------------------------------------------------------- 1 | # 私有实例 2 | WebPagetest可安装和运行私有实例的软件包。 3 | 4 | ## 一、发布 5 | 最新版本是[3.0](https://github.com/WPO-Foundation/webpagetest/releases/tag/WebPageTest-3.0) 6 | 7 | ## 二、轻松部署(在EC2上) 8 | 有一个[EC2 AMI](https://github.com/WPO-Foundation/webpagetest/blob/master/docs/EC2/Server%20AMI.md)用于WebPageTest服务器,可以有很多好处: 9 | + 无需配置(在5分钟内启动并运行)。 10 | + 根据需要在所有EC2(亚马逊弹性计算云)区域中自动启动和停止EC2测试代理。 11 | + 自动更新到最新的服务器和代理代码。 12 | 13 | ## 三、手动部署 14 | ### 3.1 系统要求 15 | WebPageTest可以配置在一个系统上运行(Web服务器和测试机器都在同一台PC上运行),或者为Web服务器和测试人员使用单独的系统。 16 | 17 | ### 3.2 Web服务器 18 | Web服务器可以是任何支持PHP的操作系统(Linux或Windows)。 19 | + Nginx (推荐php-fpm) 或者 Apache 2.x+: 20 | + PHP 5.3.0 或更新版本,包括以下模块: 21 | + gd 22 | + zip 23 | + zlib 24 | + mbstring 25 | + curl (如果你想使用远程存储,像S3和谷歌存储) 26 | + sqlite (如果你想要能够编辑测试标签) 27 | + ffmpeg 28 | + 在路径中可用(用于提取视频缩略图) 29 | + 对于移动代理视频支持,需要1.x(Linux,Windows) 30 | + imagemagick (可选) 31 | + 如果使用移动Node.js代理,则需要移动视频处理 32 | + jpegtran (可选) 33 | + 在路径中可用(用于jpeg分析) 34 | + exiftool (可选) 35 | + 在路径中可用(用于jpeg分析) 36 | 37 | ### 3.3 测试机 38 | Windows(Vista或更高版本)(如果使用64位,需要WebPagetest 2.9或更高版本支持流量整形) 39 | 40 | ## 四、Configuring 41 | `zip`存档包含2个文件夹。`www`文件夹是Web服务器软件,代理文件夹用于测试机器。存档中的配置文件具有`.sample`扩展名,因此如果要更新现有安装,则可以使用存档中的新文件覆盖当前文件。 42 | `2.8`的新版本是一个脚本,将检查常见的配置问题。 可以通过`http:///install`访问。 43 | 44 | ### 4.1 Web Server 45 | 1. 使用所需的模块配置Apache,并设置为允许覆盖.htaccess。配置文件可能如下所示: 46 | ```bash 47 | 48 | AllowOverride all 49 | Order allow,deny 50 | Allow from all 51 | 52 | 53 | DocumentRoot /var/www/webpagetest 54 | 55 | ``` 56 | 2. 如果将使用代理,需要上传`.pcap`文件。在`php.ini`中将`upload_max_filesize`和`post_max_size`设置为大值(`10mb`应该足够)。 57 | 3. 如果要收集Chrome开发工具跟踪,请考虑将`memory_limit`设置为较大值或通过将其设置为-1来禁用内存限制。 58 | 4. 使用`PHP DSO`处理程序`mod_php`可以大幅减少CPU使用率。 59 | 5. 重新启动Apache以使用新的配置设置。 60 | 6. 将文件从归档中的`www`文件夹复制到DocumentRoot位置(例如`/var/www/webpagetest`)。 61 | 7. 授予Apache用户对DocumentRoot下的以下文件夹的读/写权限: 62 | + tmp 63 | + dat 64 | + results 65 | + work/jobs 66 | + work/video 67 | + logs 68 | 8. 在设置文件夹中有几个设置文件可用于配置站点。制作所有`.sample`文件的副本(删除`.sample`扩展名)作为配置设置的模板。大多数设置可以按原样使用,除了`locations.ini`(特别是如果要配置多个测试位置)。 69 | 9. 有关配置`locations.ini`的详情,请访问:[locations](/Private-Instances/locations.md) 70 | 71 | ### 4.2 测试机 72 | 1. 安装要用于测试的浏览器 73 | 2. 在测试系统中配置的管理员帐户。最简单和最可靠的方法是使用`Microsoft Technet`的[自动登录应用程序](https://sites.google.com/a/webpagetest.org/docs/private-instances)。 74 | 3. 禁用任何屏幕保护程序(桌面需要保持可见的视频捕获工作) 75 | 4. 停用UAC(Vista或更高版本 - 滑动到“从不通知”) 76 | 5. 卸载IE的增强安全模式(Windows Server) 77 | 6. 在虚拟机(特别是KVM)中运行时使用稳定的时钟 78 | + `/USEPMTIMER到XP`或`Server 2003`的`boot.ini` 79 | + 管理员shell命令“bcdedit / set {default} useplatformclock true” 80 | 7. 配置Windows引导到桌面(Server 2012) 81 | + 安装桌面体验 82 | + [http://www.win2012workstation.com/tag/start-screen/#manual](http://www.win2012workstation.com/tag/start-screen/#manual) 83 | 8. 禁用事件跟踪器(Windows Server - 为了方便) 84 | + 运行`gpedit.msc` 85 | + 打开`Computer Configuration\Administrative Templates\System` 86 | + 打开`Display Shutdown Event Tracker` 87 | + 将其设置为禁用 88 | 9. 将测试软件从代理文件夹复制到系统(本示例为`c:\ webpagetest`) 89 | 10. 对于`Windows 8.1`(或服务器2012 R2)测试代理程序,请安装`DUMMYNET ipfw驱动程序` 90 | + 如果要在64位Windows上安装,请右键单击`c:\webpagetest\dummynet\64bit`文件夹中的`testmode.cmd`,然后选择`以管理员身份运行`。重新启动系统以启用测试模式。如果你不运行,重启后不会开启流量整形。 91 | + 将文件从`webpagetest\dummynet\32bit`或`webpagetest\dummynet\64bit`目录复制到`webpagetest\dummynet`目录(取决于操作系统) 92 | + 拔出用于访问Internet的网络适配器的属性 93 | + 点击`Install` 94 | + 选择`Service`然后点击`Add` 95 | + 点击`Have Disk`并导航到`webpagetest\dummynet` 96 | + 选择`ipfw + dummynet服务`(单击任何有关未签名的驱动程序的警告) 97 | 11. Windows 10中,如果使用Microsoft Edge测试(工作进行中): 98 | + 为所有用户安装[Python 2.7](https://www.python.org/downloads/)到`c:\ Python27`(默认安装目录) 99 | + 从cmd shell安装selenium 100 | + c:\Python27\Scripts\pip install selenium 101 | + 从代理文件夹安装`pyWin32`(可能需要从管理员命令提示符运行) 102 | + 安装[Imagemagick](https://www.imagemagick.org/script/binary-releases.php#windows) 103 | + 安装[Windows性能工具包](https://msdn.microsoft.com/en-us/windows/hardware/commercialize/test/wpt/index?f=255&MSPPError=-2147217396)(取消选中adk设置中的所有其他选项) 104 | 12. 需要为每个版本的IE配置单独的机器/VM,但其余的浏览器都可以在同一台机器上运行,与IE共享一台机器(测试将不会同时运行,将会交替进行) 105 | 13. 创建任务计划程序任务以在登录时运行`wptdriver.exe`: 106 | + 将其配置为以最高权限运行 107 | + 让它在用户帐户登录时运行 108 | + 确保它未配置为在3天后终止(默认任务调度程序配置) 109 | 14. 根据样本创建设置文件(`wptdriver.ini`)的副本 110 | + `wptdriver`可以自动安装Chrome和Firefox(并保持Firefox最新)。如果你想手动安装浏览器,然后删除installer = ...条目为每个你想要tp手动安装的浏览器 111 | + 确保浏览器可执行文件的路径对于系统是正确的(如果正在自动安装Chrome和Firefox,他们只会在首次运行`wptdriver`后安装) 112 | + 将位置配置为与`locations.ini`中服务器上定义的位置匹配 113 | + 配置位置键与`locations.ini`中的服务器匹配 114 | + 确保location.ini文件中的browsers = x,y,z条目中的浏览器名,与ini文件中定义的名字对应。 115 | 15. 启动`wptdriver`,安装它需要安装的任何软件(退出,当出现“waiting for work”)。 116 | 16. 重新启动以确保一切正常启动 117 | 118 | 如果将远程桌面连接到测试机,请确保在完成后重新启动机器,否则桌面将保持锁定,屏幕捕获将不起作用。 119 | 120 | #### 4.2.1 无外设服务器(包括Google Compute Engine) 121 | 屏幕截图和视频捕获都需要桌面可见才能进行测试。 某些服务器没有可用的视频设备或分辨率太低,无法用于测试。在这些情况下,设置变得有点复杂(但仍然可能)。测试机需要2个用户帐户,并且需要为自己运行RDP会话,并在RDP会话中运行测试,这将给它一个虚拟显示使用。这也可以用作一种安全技术,如果你不舒服让桌面解锁在任何时候。 122 | + 1. 创建2个用户帐户。 我们将他们称为“用户”和“管理员”。 “用户”帐户将是在启动时用于创建RDP会话的帐户,“管理员”帐户是将运行测试的地方。 “用户”帐户不需要是管理员帐户 123 | + 2. 设置测试帐户: 124 | + 将RDP连接到“管理员”帐户,并将其设置为使用正常的WPT配置运行测试 125 | + 注销RDP会话(不要仅断开连接,将用户注销,但使系统保持运行) 126 | + 通过RDP重新连接到“管理员”帐户,并确保测试在连接后立即自动启动并正常运行 127 | + 3. 设置RDP主机帐户: 128 | + 用RDP连接到“用户”帐户 129 | + 配置自动登录在启动时自动登录“用户”帐户。我通常使用Microsoft的[自动登录应用程序](https://technet.microsoft.com/en-us/sysinternals/autologon.aspx)来进行配置。 130 | + 使用管理员帐户将RDP连接到127.0.0.2,并记住凭据(不能是localhost或127.0.0.1,因为RDP将阻止这些尝试,但它允许127.0.0.2仍然是本地主机) 131 | + 打开cmd shell 132 | + 使用`cmdkey /generic:TERMSRV/127.0.0.2 /user:administrator /pass:`存储RDP的管理员密码 133 | + 输入`mstsc /w:1920 /h:1200 /v:127.0.0.2`并确保它打开一个RDP连接并开始测试(在验证其工作后关闭会话) 134 | + 创建任务计划程序任务以在运行mstsc.exe的用户帐户的命令行选项`/w:1920 /h:1200 /v:127.0.0.2`登录时运行。 135 | 136 | 现在当你重新启动服务器,它应该自动登录到“用户”帐户,然后RDP到本地实例与“管理员”帐户,测试将在RDP会话内部运行。 137 | ### 4.3 Mobile 138 | 移动代理说明在[这里可用](/System-Design/mobile-testing.md)。 139 | 140 | ## 五、EC2测试代理 141 | 我们为EC2准备了公共AMI,可以用作通过实例用户数据动态配置的WebPagetest测试器。这些映像具有安装和配置测试系统所需的所有软件(包括用于生成视频的`AVISynth`和用于进行流量整形的`dummynet`)。 142 | 143 | ### 5.1 配置 144 | 在启动实例时,通过用户数据字符串来配置测试代理。 145 | 146 | #### 5.1.1 WebPagetest参数 147 | + wpt_server - WebPagetest正在运行的Web服务器(必需) 148 | + wpt_url - (仅限Linux代理)用于获取的工作目录的基本URL。即`https://www.webpagetest.org/work/` 149 | + wpt_loc - 要用于`wptdriver`的位置名称(可选 - 如果未指定,它将回退到`wpt_location`或从区域构建 - 例如`ec2-us-east`) 150 | + wpt_location - 用于`URLBlast`的位置名称 (可选 - 如果没有指定,它将从区域和浏览器(例如ec2-us-east-IE8)构建)。如果wpt_loc未设置,wptdriver将附加_wptdriver到此位置ID。 151 | + wpt_key - 指定位置的秘密密钥(可选) 152 | + wpt_timeout - 每个测试的超时设置(以秒为单位)(可选,默认为60) 153 | + wpt_username - 使用WPT服务器进行基本认证的用户名。 如果未指定wpt_password,则忽略。 (可选的) 154 | + wpt_password - 使用WPT服务器进行基本认证的密码。 如果未指定wpt_username,则忽略。 (可选的) 155 | + wpt_validcertificate - 可如果wpt_server的方案不为“https”,就可忽略。如果值为“0”,则不会检查证书的主机名和到期时间。如果值为'1',则WPT服务器SSL证书的CN必须与wpt_server参数中指定的主机名匹配,证书必须有效。 (可选,默认为'0') 156 | 157 | #### 5.1.2 用户数据字符串示例 158 | wpt_server=www.webpagetest.org wpt_loc=Test wpt_key=xxxxx 159 | 160 | ![](/assets/img/private/ec2config.png) 161 | 162 | #### 5.1.3 locations.ini示例 163 | 服务器的samples.ini示例可用于配置所有可用的EC2区域: [http://webpagetest.googlecode.com/svn/trunk/www/webpagetest/settings/locations.ini.EC2-sample](http://webpagetest.googlecode.com/svn/trunk/www/webpagetest/settings/locations.ini.EC2-sample) 164 | 165 | ### 5.2 AMI Images 166 | 对于AMI(“IE 9”,“IE 10”或“IE 11”)中的IE版本,wptdriver实例(IE 9,10和11)必须在locations.ini中具有匹配的浏览器名称。 167 | 这些实例会在启动时自动安装最新支持的Chrome和Firefox版本(并在运行时自动更新) 168 | 169 | #### 5.2.1 查找图片(又名EC2 AMI search sucks) 170 | 如果无法找到手动启动的AMI,那是因为EC2的AMI搜索功能非常糟糕。 我发现这条路可行: 171 | + 请勿在Images-> AMIs界面中搜索AMI 172 | + 转到Instances - >Instances(或spot instances) 173 | + 登录 Instance 174 | + 选择 "Community AMIs" 175 | + 选中 "Windows" 176 | + 将AMI ID放在搜索框中,然后按Enter键 177 | 178 | #### 5.2.2 us-east (Virginia) 179 | IE9/Chrome/Firefox/Safari - ami-83e4c5e9 180 | IE10/Chrome/Firefox/Safari - ami-0ae1c060 181 | IE11/Chrome/Firefox/Safari - ami-4a84a220 182 | Linux (Chrome Only) - ami-cf68c6d9 183 | 184 | #### 5.2.3 us-east-2 (Ohio) 185 | IE9/Chrome/Firefox/Safari - ami-c86933ad 186 | IE10/Chrome/Firefox/Safari - ami-55742e30 187 | IE11/Chrome/Firefox/Safari - ami-c96933ac 188 | Linux (Chrome Only) - ami-cd4f6ba8 189 | 190 | #### 5.2.4 us-west (California) 191 | IE9/Chrome/Firefox/Safari - ami-03d6a263 192 | IE10/Chrome/Firefox/Safari - ami-05eb9f65 193 | IE11/Chrome/Firefox/Safari - ami-678afe07 194 | Linux (Chrome Only) - ami-2a3c644a 195 | 196 | #### 5.2.5 us-west-2 (Oregon) 197 | IE9/Chrome/Firefox/Safari - ami-03e80c63 198 | IE10/Chrome/Firefox/Safari - ami-fdeb0f9d 199 | IE11/Chrome/Firefox/Safari - ami-b4ab4fd4 200 | Linux (Chrome Only) - ami-9cc049fc 201 | 202 | #### 5.2.6 ca-central-1 (Canada Central) 203 | IE9/Chrome/Firefox/Safari - ami-184efc7c 204 | IE10/Chrome/Firefox/Safari - ami-13328077 205 | IE11/Chrome/Firefox/Safari - ami-0345f767 206 | Linux (Chrome Only) - ami-4140fd25 207 | 208 | #### 5.2.7 eu-west-1 (Ireland) 209 | IE9/Chrome/Firefox/Safari - ami-2d5fea5e 210 | IE10/Chrome/Firefox/Safari - ami-3b45f048 211 | IE11/Chrome/Firefox/Safari - ami-a3a81dd0 212 | Linux (Chrome Only) - ami-cc1423aa 213 | 214 | #### 5.2.8 eu-west-2 (London) 215 | IE9/Chrome/Firefox/Safari - ami-4ad6dc2e 216 | IE10/Chrome/Firefox/Safari - ami-2dd5df49 217 | IE11/Chrome/Firefox/Safari - ami-4bd6dc2f 218 | Linux (Chrome Only) - ami-b7b7a2d3 219 | 220 | #### 5.2.9 eu-central (Frankfurt) 221 | IE9/Chrome/Firefox/Safari - ami-879c85eb 222 | IE10/Chrome/Firefox/Safari - ami-ec9b8280 223 | IE11/Chrome/Firefox/Safari - ami-87f2ebeb 224 | Linux (Chrome Only) - ami-6534e30a 225 | 226 | #### 5.2.10 ap-northeast-1 (Tokyo) 227 | IE9/Chrome/Firefox/Safari - ami-4ed6e820 228 | IE10/Chrome/Firefox/Safari - ami-ebd3ed85 229 | IE11/Chrome/Firefox/Safari - ami-2f221c41 230 | Linux (Chrome Only) - ami-31154856 231 | 232 | #### 5.2.11 ap-northeast-2 (Seoul) 233 | IE9/Chrome/Firefox/Safari - ami-b2e12fdc 234 | IE10/Chrome/Firefox/Safari - ami-76e12f18 235 | IE11/Chrome/Firefox/Safari - ami-15e52b7b 236 | Linux (Chrome Only) - ami-e9ac7f87 237 | 238 | #### 5.2.12 ap-southeast-1 (Singapore) 239 | IE9/Chrome/Firefox/Safari - ami-f87ab69b 240 | IE10/Chrome/Firefox/Safari - ami-ce78b4ad 241 | IE11/Chrome/Firefox/Safari - ami-3e55995d 242 | Linux (Chrome Only) - ami-f3cd7f90 243 | 244 | #### 5.2.13 ap-southeast-2 (Sydney) 245 | IE9/Chrome/Firefox/Safari - ami-306c4853 246 | IE10/Chrome/Firefox/Safari - ami-25644046 247 | IE11/Chrome/Firefox/Safari - ami-e88eab8b 248 | Linux (Chrome Only) - ami-f72f2294 249 | 250 | #### 5.2.14 ap-south-1 (Mumbai) 251 | IE9/Chrome/Firefox/Safari - ami-7a86ec15 252 | IE10/Chrome/Firefox/Safari - ami-bf80ead0 253 | IE11/Chrome/Firefox/Safari - ami-d498f2bb 254 | Linux (Chrome Only) - ami-b787f7d8 255 | 256 | #### 5.2.15 sa-east (Sao Paulo) 257 | IE9/Chrome/Firefox/Safari - ami-79c54515 258 | IE10/Chrome/Firefox/Safari - ami-7cc54510 259 | IE11/Chrome/Firefox/Safari - ami-203abb4c 260 | Linux (Chrome Only) - ami-38eb8a54 261 | 262 | ## 六、更新测试代理 263 | 如果存在更新文件(在服务器上的`/work/update`中),测试代理将自动从服务器更新其代码。 每个更新包括zip文件(实际updata)和包含有关更新的一些元数据(最重要的是软件版本)的ini文件。 IE代理(`update.zip/update.ini`)和Chrome/Firefox代理(`wptupdate.zip/wptupdate.ini`)有不同的更新。 264 | 265 | 每个新版本都包含更新的代理二进制文件,但是如果需要在公用实例上提供,但尚未在新版本中打包的错误修复或功能,则有时更新代理之间的版本是有帮助。在这种情况下,可以从WebPagetest的公共实例下载更新,并将其部署在您的私有实例上(代理向后兼容,所以您不需要更新网页代码,除非您需要更新功能)。 266 | 267 | 使用WebPageTest 2.18或更高版本,服务器可以在发布时自动更新到最新版本。 在服务器的`settings/settings.ini`中,添加: 268 | 269 | agentUpdate=http://cdn.webpagetest.org/ 270 | 271 | 手动下载和更新: 272 | + 下载代理更新: 273 | + http://www.webpagetest.org/work/update/update.zip 274 | + http://www.webpagetest.org/work/update/wptupdate.zip 275 | + 从zip文件中提取ini文件(`update.ini`和`wptupdate.ini`) 276 | + 将zip文件复制到服务器上的`/work/update`文件夹(可能需要备份现有的代理更新,以便在必要时回滚) 277 | + 将ini文件复制到服务器上的`/work/update`文件夹 278 | 279 | 上传更新后,每个代理程序将在运行下一个测试之前自动下载并安装更新,以确保在进行更多测试之前更新被部署。 280 | 281 | ## 七、故障排除 282 | ### 7.1 Web Server 283 | + 等待在队列前面 284 | + 通常的问题是在`location.ini`。仔细检查位置设置是否与代理正在拉动服务器的位置相匹配。还要注意,如果使用的是密钥,它们是否匹配。可以检查Apache访问日志,以便测试代理进行传入请求。 285 | + 测试完成,但没有成功 286 | + 如果您使用的是64位Windows客户端,则无法执行流量整形(换为dummynet)。在`locations.ini`中,将`connectivity=LAN`添加到测试位置。 287 | + 瀑布图丢失 288 | + 检查GD库是否安装。GD库用于绘制瀑布并生成缩略图。 289 | + 看看是否安装了php-zip,php5-zip或类似的zip库。 使用某些默认的PHP发行版,图形库可能会不存在。 290 | + 屏幕截图为黑色 291 | + 从RDP断开连接时,请尝试重新启动实例,而不是从RDP客户端断开连接。当您断开连接时,RDP会锁定桌面,这将导致屏幕截图和视频中断。 292 | + `/var/log/apache2/error.log`中的错误消息: 293 | + [Mon Apr 30 10:18:14 2012] [error] [client 1.2.3.4] PHP Warning: POST Content-Length of 22689689 bytes exceeds the limit of 8388608 bytes in Unknown on line 0 294 | + PHP enforces a limit on the size of uploaded files, and an agent is uploading something larger than this limit. Change upload_max_filesize and post_max_filesize to larger values in php.ini. 295 | 296 | #### 7.1.1 测试代理 297 | 磁盘空间不足 298 | + WebPagetest不会保留任何临时文件,但有时Windows本身会留下东西,磁盘可以填满。当发生这种情况时,可以执行以下几个常见的事情来清理它: 299 | + 可以删除`C:\Windows\SoftwareDistribution\Download`中的所有内容。Windows将为其安装的每个软件更新保持完整的安装程序,并且在安装后不需要它们。 300 | + 尝试 右键单击C盘 -> 属性 -> 磁盘清理。 可能会有一些崩溃报告可以清理 301 | + 如果没有足够的空间,还可以做更多的事情: 302 | + 使用`windirstat`看看占用磁盘空间 303 | + IE临时Internet文件可能被破坏,并且正在失去控制。`CCleaner`有时可以帮助修复 304 | + 确保休眠已禁用(盘上没有·hiberfil.sys`) 305 | + 最糟糕的情况是,可以禁用交换文件来恢复一两次 -------------------------------------------------------------------------------- /Private-Instances/web-page-replay.md: -------------------------------------------------------------------------------- 1 | # 网页重播 2 | 3 | ## 一、背景 4 | [网页重放](https://github.com/chromium/web-page-replay)可以记录实时网页,并在本地重播以进行测试。对于WebPageTest,Replay用于通过记录网站并在更可靠的条件下播放来规范化访问活动网站的结果。重播站点可减少由网络挂起,网络服务器流量峰值以及可能影响基准测试结果的其他因素造成的异常值。设置WebPageReplay非常容易,强烈建议你充分利用WPT私人实例。 5 | 6 | ## 二、要求 7 | + Python 2.6 8 | + Port 80 9 | + Port 53 UDP和TCP支持DNS流量 10 | 网络调节:有很多依赖关系在WPR级别启用网络调节,请参阅[WPR入门](https://github.com/chromium/web-page-replay/blob/master/documentation/GettingStarted.md)。WPT的浏览器代理做网络调节,所以这些步骤可以跳过。 11 | 12 | ## 三、服务器步骤 13 | 1. 检查服务器上的代码 14 | 2. 创建供服务器使用的wpr存档 15 | 3. 在服务器模式下启动WPR(连接到端口80/53所需的root权限)。 我建议用nohup,screen或[supervisord](http://supervisord.org/running.html#adding-a-program)启动它。 16 | 17 | ```bash 18 | $ git clone https://github.com/chromium/web-page-replay.git 19 | $ sudo ./replay.py --record archive.wpr 20 | $ sudo screen 21 | ./replay.py -M ~/archive.wpr 22 | ``` 23 | 在这一点上,你应该有一个工作的服务器。现在可以将DNS设置为此框的IP,应该在服务器上的控制台中看到流量。访问的每个页面都显示错误404,因为我们没有记录。 24 | 25 | ## 四、浏览器步骤 26 | 现在我们有一个工作的WPR服务器,让我们设置一个浏览器代理使用它。幸运的是,WPT已经与WPR具有良好的集成性。测试代理将服务器设置为记录模式,加载网页,然后将WPR置于重放模式并对其运行测试。这都可以从WPR服务器上的控制台查看。 27 | 28 | #### 4.1 在`wptdriver.ini`中指定网页显示`IP ADDRESS` 29 | 我没有在IE8 / IE9 URL Blast测试。 30 | web_page_replay_host=XXX.XXX.XXX.XXX 31 | 32 | 你的配置应该看起来像这样。 33 | ```bash 34 | [WebPagetest] 35 | url=http://wpt-rmn.cloudapp.net/ 36 | location=agent-location 37 | browser=chrome 38 | Time Limit=120 39 | ;key=TestKey123 40 | ;Automatically install and update support software (Flash, Silverlight, etc) 41 | software=http://www.webpagetest.org/installers/software.dat 42 | web_page_replay_host=XXX.XXX.XXX.XXX 43 | 44 | [chrome] 45 | exe="%PROGRAM_FILES%\Google\Chrome\Application\chrome.exe" 46 | options='--load-extension="%WPTDIR%\extension" --user-data-dir="%PROFILE%" --no-proxy-server' 47 | installer=http://www.webpagetest.org/installers/browsers/chrome.dat 48 | 49 | [Firefox] 50 | exe="%PROGRAM_FILES%\Mozilla Firefox\firefox.exe" 51 | options='-profile "%PROFILE%" -no-remote' 52 | installer=http://www.webpagetest.org/installers/browsers/firefox.dat 53 | template=firefox 54 | 55 | [Safari] 56 | exe="%PROGRAM_FILES%\Safari\Safari.exe" 57 | 58 | [IE 11] 59 | exe="C:\Program Files\Internet Explorer\iexplore.exe" 60 | ``` 61 | 62 | #### 4.2 这应该是所有必要的。现在,当您对此代理运行测试时,它将通过webpagereplay服务器发送流量。立即运行测试,并确保这两行显示在WPR服务器上的控制台/日志中。 63 | 2014-07-07 18:11:12,885 DEBUG Served: GET http://XXX.XXX.XXX.XXX/web-page-replay-command-record [('cache-control', 'no-cache'), ('host', 'XXX.XXX.XXX.XXX')] (0ms) 64 | 2014-07-07 18:11:32,055 DEBUG Served: GET http://XXX.XXX.XXX.XXX/web-page-replay-command-replay [('cache-control', 'no-cache'), ('host', 'XXX.XXX.XXX.XXX')] (0ms) 65 | 66 | ## 五、常问问题 67 | 1. 一个WPR服务器可以使用多个代理吗? 68 | 2. 此服务器的性能要求? 69 | 3. WPR是否模拟录音的流量? 70 | 4. 如何存档和重复使用录音? -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WebPageTest 中文文档 2 | 英文文档请参考[WebPageTest Documentation](https://sites.google.com/a/webpagetest.org/docs/) 3 | 4 | + 使用WebPagetest(Using WebPagetest) 5 | + [快速入门指南(Quick Start Guide)](/Using-WebPagetest/quick-start-guide.md) 6 | + [指标(Metrics)](/Using-WebPagetest/metrics.md) 7 | + [首屏展现平均值(Speed Index)](/Using-WebPagetest/metrics-speed-index.md) 8 | + [结果代码(Result Codes)](/Using-WebPagetest/result-codes.md) 9 | + [脚本(Scripting)](/Using-WebPagetest/scripting.md) 10 | + [自定义指标(Custom Metrics)](/Using-WebPagetest/custom-metrics.md) 11 | + 开发者界面(Developer Interfaces) 12 | + [RESTful API(RESTful APIs)](/Developer-Interfaces/restful-apis.md) 13 | + [批处理库(Batch Library)](/Developer-Interfaces/batch-library.md) 14 | + [批处理命令行工具(Batch Processing Command-line tool)](/Developer-Interfaces/batch-processing-command-line-tool.md) 15 | + [原始测试结果(Raw Test Results)](/Developer-Interfaces/raw-test-tesults.md) 16 | + [私有实例(Private Instances)](/Private-Instances/private-instances.md) 17 | + [地点(Locations)](/Private-Instances/locations.md) 18 | + [网页重播(Web Page Replay)](/Private-Instances/web-page-replay.md) 19 | + [Node.js代理(Node.js Agent)](/Private-Instances/nodejs-agent.md) 20 | + [代理安装(Agent Setup)](/Private-Instances/agent-setup.md) 21 | + 系统设计(System Design) 22 | + [概述(Overview)](/System-Design/overview.md) 23 | + [WebPagetest中继(WebPagetest Relay)](/System-Design/webpagetest-relay.md) 24 | + [移动测试(Mobile Testing)](/System-Design/mobile-testing.md) 25 | + Other Resources 26 | + [优化资源(Optimization Resources)](/Other-Resources/optimization-resources.md) 27 | + [托管测试位置(Hosting a Test Location)](/Other-Resources/hosting-a-test-location.md) 28 | + [2011 FCC宽带数据(2011 FCC Broadband Data)](/Other-Resources/2011-fcc-broadband-data.md) 29 | 30 | 31 | # 相关资料 32 | [Using WebPageTest](https://book.douban.com/subject/26588599/)专门介绍WebPageTest的书籍,有中文版,原版是彩色的,中文版是黑白的。在这本书中不但列举了一些分析技巧,还展示了更多的参数说明,结合文档可以更好的运用Webpagetest。 33 | 34 | # 联系方式 35 | 翻译错误、理解有误、或者探讨性能等,大家都可以在QQ群(156140744)中交流。 36 | 37 | -------------------------------------------------------------------------------- /System-Design/mobile-testing.md: -------------------------------------------------------------------------------- 1 | # 移动测试 2 | 3 | 对于移动测试,有几个网络连接选项: 4 | + 实际移动网络具有实际载体 5 | + WiFi没有流量整形 6 | + WiFi具有固定的流量整形配置文件 7 | + WiFi具有每个测试流量整形 8 | 9 | [流量整形](http://baike.baidu.com/link?url=tl7WeKr3B-0Vr0NkUUNY1iqky_R1lsFOYRb2WwGq3dY6VMrkOecrrhKL3-fw4gP8SgMNQqgLm8x8XUU-ZtElqNHJshaVCndxJYQJLcy03epoEDFZvIx6zwHnjeAmm9gF)(traffic shaping)典型作用是限制流出某一网络的某一连接的流量与突发,使这类报文以比较均匀的速度向外发送。 10 | 移动测试网络对于WebPagetest的公共实例来说是至关重要的(至少在2014年的这篇文章中): 11 | 12 | ![](/assets/img/system/WebPagetest_Mobile_Network.png) 13 | 14 | 不同的配置建立在彼此之上: 15 | 16 | ## 一、设备 17 |   使用新的Node.js代理进行测试需要运行4.4(Kit Kat)的Android设备或更高版本,iOS设备运行最新版本的iOS(更多的iOS文档和更新的支持即将推出)。在这两种情况下,设备需要刷机(在iOS的情况下越狱)才能删除浏览器缓存。对于Android,Nexus和Motorola设备的工作效果很好,并提供广泛的功能。需要单独的设备来测试人像与景观(主要是平板电脑测试的问题)。 18 | 19 | ## 二、实际移动网络具有实际载体 20 |   最简单的设置是在运营商网络上运行设备。在这种情况下,您只需要手机和有线主机来控制它们。可以从单个主机控制多个设备(OS将允许USB连接)。任何支持adb和Node.js的操作系统都可以通过Windows和Linux进行测试。 21 |   如果主机有USB 3控制器,并且想要使用Linux,则需要确保它是一个比较新的内核,因为早期版本中的USB 3支持是非常差。 22 |   对于Windows,还有一个支持应用程序[adbwatch](https://github.com/WPO-Foundation/adbwatch/releases)来监视adb,如果它死机(有时会停止响应),它将自动重新启动,允许系统运行,而不需要人为干预。 23 |   公共实例目前有10台设备连接到运行Windows 7的英特尔i5 NUC,具有管理代理实例并保持adb运行的adbwatch。将NUC作为无头服务器(对于不支持AMT的较新的haswell型号)运行的一个提示是使用Windows附带的VNC和Microsoft视频驱动程序,而不是Intel。如果使用英特尔驱动程序,显示屏将被禁用,VNC将无法正常工作。 24 |   测试结果和代理服务器通信的数据流全部发生在系统主机上,因此唯一使用的数据连接将是实际的测试数据(以及任何软件更新)。 25 | 26 | ## 三、WiFi没有流量整形 27 | 通过WiFi连接进行测试可以更好地控制结果的稳定性,通常会产生比运营商网络上测试更加一致的结果。运行稳定WiFi测试连接的主要问题是: 28 | + **使用稳定的接入点**:大多数消费者WiFi设备是可怕的,一直存在,并且不能长时间保持连接。业务设备往往更加可靠,但我发现,苹果Air Port设备的工作非常好,只能使用它们。它们是坚如磐石的,永远不会`冻结/挂起/重新启动`,允许在接入点模式下运行,同时支持2.4和5GHz频段。 29 | + **使用清晰的WiFi频率**:在办公室或城市环境中,这可能是要解决的最困难的问题。我使用inssider找到一个清晰的非重叠频段用于测试网络。对于公共实例,我很幸运,因为没有邻居网络干扰,所以我选择了全方位。 30 | + **不要超载WiFi网络**: 将单个通道上的设备太多或使用相同的网络用于其他流量可能会导致争用,并可能限制实际带宽。使用可以与802.11n或802.11ac通话的设备变得不那么简单,但如果正在部署大量设备,那么值得牢记。解决这个问题的唯一方法是跨多个网络分流流量,将设备和接入点(将它们放在法拉第笼中)或使用rndis有线网络而不是WiFi绝缘。 31 | 32 | 测试未定义的WiFi连接的主要缺点是以ISP的完全连接速度运行,并且可能与最终用户的体验不符。 33 | 34 | ## 四、WiFi具有固定的流量整形配置文件 35 |   将流量整形添加到WiFi测试配置,允许测试用户连接特性,保持常规WiFi测试的一致性。流量整形必须在接入点的远端完成,最好使用将网络连接从接入点桥接到有线网络的其余部分的FreeBSD机器(还有一个dummynet的linux端口,但FreeBSD的实现在我们的测试中已经更加一致了)。 36 |   使用固定流量整形配置文件,必须选择一个配置文件,并将其用于给定设备(或所有设备)的所有流量。设置dummynet配置时,务必记住给每个设备自己的“管道”,以使它们不共享虚拟连接。 37 |   就硬件而言,任何支持FreeBSD并具有2+网络接口的机器都可以工作。我喜欢Supermicro Atom服务器,因为它们便宜,超低功耗,支持远程管理。 38 | 以下是公共实例使用的ipfw配置: 39 | ```bash 40 | # 3G配置文件 - 1.6Mbps下行,768Kbps上行,300ms RTT 41 | # src-ip和dst-ip掩码确保每个客户端都获得自己的管道 42 | ipfw pipe 1 config bw 1600Kbit/s delay 150ms noerror mask dst-ip 0xffffffff 43 | ipfw pipe 2 config bw 768Kbit/s delay 150ms noerror mask src-ip 0xffffffff 44 | 45 | # em1是连接到接入点的网络接口。 46 | # 数据“transmitted”到接入点是设备上的“in”数据。 47 | ipfw add pipe 1 ip from any to any out xmit em1 48 | ipfw add pipe 2 ip from any to any out recv em1 49 | ``` 50 | 51 | ## 五、WiFi具有每个测试流量整形 52 |   不用为所有设备使用固定的连接配置文件,可以使测试代理程序在每个测试的基础上进行配置。Node.js代理可以调用代理上的ipfw shell脚本,其中包含要配置的测试代理和连接配置文件的信息。[github中有示例代码](https://github.com/WPO-Foundation/webpagetest/blob/master/agent/js/ipfw_config) 动态创建管道并分配相应的配置文件。 53 |   对于公共实例,静态配置多个管道,每个设备一对,然后当脚本配置整形时,它将只设置与该设备相关联的管道参数。这就是桌面代理的工作原理,并避免了任何边缘情况,如果某些事情死机,那么在配置中会留下规则。一旦设置和工作,我将提供在公共实例上实现的脚本和配置。 54 | 55 | ## 六、rndis替代WiFi 56 |   配置更大的实验室的一个更困难的问题是管理WiFi网络。可以反转系统的设备,使其网络流量通过USB连接路由到有线主机。这可以提供更一致的结果,但是需要注意不要超载USB总线(这也会传输其他系留设备的视频和测试结果),并且可靠性还不如WiFi(设备往往脱机)。 -------------------------------------------------------------------------------- /System-Design/overview.md: -------------------------------------------------------------------------------- 1 | # 概述 2 | 3 | 以下是WebPagetest的整体系统设计: 4 | 5 | ![](/assets/img/system/overview.png) 6 | 7 | 所有通信均通过HTTP完成,箭头方向表示HTTP请求的方向。 8 | 测试代理人轮询找到工作的服务器,并在测试完成后将结果发回服务器。 9 | 10 | 有关特定系统的更多信息,请参阅相关文档(即将推出): 11 | + 服务器架构 12 | + 自动化API 13 | + 代理API 14 | + 代理架构 15 | + 旧代理(IE8以下使用的UrlBlast) 16 | + 新代理(Chrome/Firefox等使用的WPTDriver) -------------------------------------------------------------------------------- /System-Design/webpagetest-relay.md: -------------------------------------------------------------------------------- 1 | # WebPagetest中继 2 | 3 | 目前的系统架构有每个测试代理直接连接到WebPagetest服务器,用于检索工作和发布结果: 4 | 5 | ![](/assets/img/system/replay1.png) 6 | 7 | 这适用于很多用例,但它要求所有代理可访问服务器,并且每个代理只能为单个服务器运行测试。添加对中继服务器的支持是有用的,该中继服务器一方面公开相同的代理接口,另一方面为WebPagetest服务器提供API来进行通信。 8 | 在简单的用例中,这将允许继电器放置在不安全的位置(例如公共互联网)。但服务器本身可以在防火墙或其他安全区域内运行,在公共互联网上以及防火墙内都有测试代理: 9 | 10 | ![](/assets/img/system/replay2.png) 11 | 12 | 假设WebPagetest服务器上每个定义的“位置”都可以引用不同的中继服务器,并且每个中继服务器可以支持连接到它的多个服务器(使用基于密钥的身份验证),这样可以打开很多有趣的可能性: 13 | + 多个系统可以共享测试代理池(拥有控制对它们的访问的中继器)。 分享可以是直接的协作或更复杂的地方,每个用户对于他们的使用份额进行收费,甚至是直接订阅模式,其中所有者以每个测试的方式销售能力 14 | + 中继服务器可以优先处理服务器请求测试的请求(基于任何对系统有意义的优先级排序) 15 | + 给定的WebPagetest实例可以利用公共和私有测试代理,甚至通过使用多个继电器从多个公共代理池中抽取 16 | 17 | ![](/assets/img/system/replay3.png) 18 | 19 | ### 实施细节 20 | 21 | 任何完整的WebPagetest实例可以作为中继器运行,并进行一些调整 22 | + `runtest.php` - 添加对直接上传的测试作业的支持(并将作业绑定到所使用的API密钥) 23 | + `common.inc` - `getTestPath()` - 组合API密钥和测试ID,形成新的测试ID,并将测试结果存储在不同的树中 24 | + `downloadtest.php` - 添加一个新界面来下载给定测试的zip存档(基本上与发布相同,但在`pull`模式中) 25 | + `deletetest.php` - 添加一个新的界面来显式删除测试(基于匹配的API键) 26 | 27 | WebPagetest接口 28 | + 可以将locations.ini中的任何位置配置为与中继服务器通信,具有以下设置: 29 | + Relay server URL (base URL) 30 | + Relay location ID (中继服务器的位置ID) 31 | + Relay Key (API与中继服务器连接时使用的密钥) 32 | + 当测试提交到本地服务器时,不是将测试作业写入本地文件,而是将其发布到中继服务器 33 | + 检查测试状态时,如果测试不完整,则WebPagetest会询问中继服务器的状态 34 | + 如果中继服务器指示测试完成,则WebPagetest会将中继服务器的结果作为zip压缩并将其解压缩 35 | + 下载/提取后,WPT将表明它已经完成了测试,所以中继服务器可以删除它的副本 36 | 37 | 代理接口 38 | + 代理将与中继进行通信,就像他们正在与WebPagetest进行通信(`work/getwork.php`,`work/resultimage.php`,`work/workdone.php`) 39 | 40 | 中继服务器实施 41 | + 一个专用的中继服务器将只是一个完整WPT的一部分,不需要UI支持(SVN用于将选定的文件放在dist版本的wptrelay目录中) -------------------------------------------------------------------------------- /Using-WebPagetest/custom-metrics.md: -------------------------------------------------------------------------------- 1 | # 自定义指标 2 | WebPagetest可以在测试结束时执行任意的JavaScript来收集自定义指标。这些可以在服务器配置中静态地定义,或者在运行时每个测试中指定。 3 | JavaScript应该写得像是在执行一个函数调用,最后返回自定义指标。下面是一个查找页面的元视口并提取它的示例: 4 | ```javascript 5 | var viewport = undefined; 6 | var metaTags=document.getElementsByTagName("meta"); 7 | for (var i = 0; i < metaTags.length; i++) { 8 | if (metaTags[i].getAttribute("name") == "viewport") { 9 | viewport = metaTags[i].getAttribute("content"); 10 | break; 11 | } 12 | } 13 | return viewport; 14 | ``` 15 | 16 | ## 一、支持的浏览器 17 | + Internet Explorer 18 | + Chrome 19 | + Firefox 20 | 21 | ## 二、注意事项 22 | + 脚本必须阻塞,并直接返回感兴趣的数据。不支持异步操作(计时器,RequestAnimationFrame,Ajax请求等)。 23 | + 自定义指标与内置指标存在于同一命名空间中,如果它们具有相同的名称,则可以覆盖内置指标。 24 | + 指标名称应该是简单的字母数字,并且可能没有空格。 25 | 26 | ## 三、在测试时指定自定义指标 27 | 为了简单起见,度量的文本输入框以ini文件的形式定义: 28 | ```bash 29 | [metric-name] 30 | 31 | 32 | [metric-2-name] 33 | 34 | ``` 35 | 36 | 下面是一个收集3个不同指标的示例(2个数字和一个字符串): 37 | ```javascript 38 | [iframe-count] 39 | return document.getElementsByTagName("iframe").length; 40 | 41 | [script-tag-count] 42 | return document.getElementsByTagName("script").length; 43 | 44 | [meta-viewport] 45 | var viewport = undefined; 46 | var metaTags=document.getElementsByTagName("meta"); 47 | for (var i = 0; i < metaTags.length; i++) { 48 | if (metaTags[i].getAttribute("name") == "viewport") { 49 | viewport = metaTags[i].getAttribute("content"); 50 | break; 51 | } 52 | } 53 | return viewport; 54 | ``` 55 | 如果使用API,自定义指标的表单字段为“custom” - 只需确保正确编码内容(如果使用GET,则为url encode,如果POST,则为form encode)。 56 | 57 | ## 四、静态指定自定义指标(私有实例) 58 | 每个指标在`settings/custom_metrics`下以`.js`扩展名作为单独文件存在。文件名将是度量的记录名称,执行代后返回一个值。 59 | 例如,`settings/custom_metrics/meta-viewport.js`将定义一个自定义变量`meta-viewport` ,内容将如下所示: 60 | ```javascript 61 | var viewport = undefined; 62 | var metaTags=document.getElementsByTagName("meta"); 63 | for (var i = 0; i < metaTags.length; i++) { 64 | if (metaTags[i].getAttribute("name") == "viewport") { 65 | viewport = metaTags[i].getAttribute("content"); 66 | break; 67 | } 68 | } 69 | return viewport; 70 | ``` -------------------------------------------------------------------------------- /Using-WebPagetest/metrics-speed-index.md: -------------------------------------------------------------------------------- 1 | # 首屏展现平均值(速度指数) 2 |   `Speed Index`是显示页面的可见部分的平均时间。它以毫秒为单位表示,会受视图端口大小的影响。 3 |   `Speed Index`已于2012年4月添加到WebPagetest,衡量页面内容填充的速度(越低越好)。它特别适用于比较不同页面之间的差别(在优化之前/之后,我的网站与竞争对手等),与其它指标(`Load Time`,`Start Render`等)结合使用,可以更好地了解网站的性能 。 4 | 5 | ## 一、问题 6 |   过去,我们依赖里程碑计时来确定网页速度的快慢。其中最常见的是浏览器到达主文档(onload)的加载事件之前的时间。这个时间很容易在实验室环境和现实世界中测量到。不幸的是,它不是一个非常好的实际用户的体验指标。随着页面的增长,内容的增多(超过当前屏幕的内容),这个加载事件将会被延迟执行。我们引入了更多的里程碑,尝试更好的表示时间,第一次渲染(First Paint)时间、 DOM内容准备(DOM Content Ready)时间等,但都有根本的缺陷,它们只测量单个点,并不能传达实际用户的体验。 7 | 8 | ## 二、引入Speed Index 9 |   `Speed Index`采用可视页面加载的视觉进度,计算内容绘制速度的总分。为此,首先需要能够计算在页面加载期间,各个时间点“完成”了多少部分。在WebPagetest中,通过捕获在浏览器中加载页面的视频并检查每个视频帧(在启用视频捕获的测试中,每秒10帧)来完成的,这个算法在下面有描述,但现在假设我们可以为每个视频帧分配一个完整的百分比(在每个帧下显示的数字)。翻译的比较生硬,下面是原文: 10 | >The speed index takes the visual progress of the visible page loading and computes an overall score for how quickly the content painted. To do this, first it needs to be able to calculate how "complete" the page is at various points in time during the page load. In WebPagetest this is done by capturing a video of the page loading in the browser and inspecting each video frame (10 frames per second in the current implementation and only works for tests where video capture is enabled). The current algorithm for calculating the completeness of each frame is described below, but for now assume we can assign each video frame a % complete (numbers displayed under each frame): 11 | 12 | ![](/assets/img/using/metrics/compare_progress.png) 13 | 14 | 如果我们绘制一个页面的完整性与时间的折线图,我们将最终得到如下所示的东西: 15 | 16 | ![](/assets/img/using/metrics/chart-line-small.png) 17 | 18 | 然后,我们可以通过计算曲线下的面积将进度转换为数字: 19 | 20 | ![](/assets/img/using/metrics/chart-progress-a-small.png) 21 | ![](/assets/img/using/metrics/chart-progress-b-small.png) 22 | 23 |   如果页面在达到视觉上完成后旋转10秒,分数将继续增加。下图中,涂色的是渲染部分,面积越小,页面载入速度越快。原文如下: 24 | >This would be great except for one little detail, it is unbounded. If a page spins for 10 seconds after reaching visually complete the score would keep increasing. Using the "area above the graph" and calculating the unrendered portion of the page over time instead gives us a nicely bounded area that ends when the page is 100% complete and approaches 0 as the page gets faster: 25 | 26 | ![](/assets/img/using/metrics/chart-index-a-small.png) 27 | ![](/assets/img/using/metrics/chart-index-b-small.png) 28 | ![](/assets/img/using/metrics/speedindexformula.png) 29 | 30 | `Speed Index`是以“ms”为单位计算的“曲线上方区域”,在视觉完成范围内使用0.0-1.0。间隔分数计算公式如下: 31 | > IntervalScore = Interval * (1.0 - (Completeness / 100)) 32 | 33 | Completeness是该帧的完成百分比,Interval是该视频帧以毫秒为单位的间隔时间(这里为100)。总分是各个间隔的总和:SUM(IntervalScore),原文如下: 34 | >The Speed Index is the "area above the curve" calculated in ms and using 0.0-1.0 for the range of visually complete. The calculation looks at each 0.1s interval and calculates IntervalScore = Interval * (1.0 - (Completeness/100)) where Completeness is the % Visually complete for that frame and Interval is the elapsed time for that video frame in ms (100 in this case). The overall score is just a sum of the individual intervals: SUM(IntervalScore) 35 | 36 | 为了比较,下面是两页的视频帧(上面是“A”,下面是“B”): 37 | 38 | ![](/assets/img/using/metrics/compare_trimmed.png) 39 | 40 | ## 三、测量视觉进展(Measuring Visual Progress) 41 |   我用手挥舞着如何计算每个视频帧的“完整性(completeness)” ,`Speed Index`本身的计算是独立的技术,用于确定完整性(可以与其它计算完整性的方法一起使用)。目前使用两种方法: 42 | ### 1. 视频捕获的可视进度(Visual Progress from Video Capture) 43 |   简单方法是将图像的每个像素与最终图像比较,然后计算每个帧匹配的像素百分比。这种方法的主要问题是,网页是流动的,像广告加载可以导致页面的其余部分移动。在像素比较模式下,屏幕上的每个像素的移动都会改变比对结果,即使实际内容只是向下移动一个像素。 44 |   目前的技术是采取图像颜色的直方图(红色,绿色和蓝色各一个),只看一下页面上颜色的整体分布。计算起始直方图(对于第一个视频帧)和结束直方图(最后一个视频帧)之间的差异,并使用该差异作为基线。将视频中的每个帧的直方图与第一个直方图的差异和基线进行比较,以确定该视频帧“完成”了多少。在某些情况下,可能不准确,但大部分情况下,这种方法还是值得做的。 45 |   这是原始机制,用于计算`Speed Index`的视觉进度,但在某些情况下,它有问题(视频播放页面,幻灯片动画或大的插页式广告)。它对结束状态非常敏感,根据最终图像计算进度。它也只能在实验室中测量,并且依赖于视频捕获。 46 | 47 | ### 2. 从绘画事件的可视进展(Visual Progress from Paint Events) 48 |   最近,我们(成功地)试验了Webkit开发者工具时间线(也可以通过扩展和远程调试协议)公开的Paint事件。它适用于所有最新的基于webkit的浏览器,包括桌面、移动所有平台。也非常轻量级,不需要捕获视频。但它依赖给定浏览器中的渲染器,因此不能用于比较不同浏览器的性能。 49 |   为了获得有用的数据,它需要一个公平的过滤和加权。 50 |   我们使用特定算法来计算从dev工具绘制rects的`Speed Index`: 51 | + 在基于Webkit的浏览器的情况下,收集时间线数据,其中包括绘制矩形以及其他有用的事件。 52 | + 过滤掉在接收到第一个响应数据之后,第一个布局之前的任何绘制事件。 53 | + ResourceReceiveResponse -> Layout -> Paint事件. 54 | + 这是因为浏览器在实际处理任何数据之前会执行多个绘制事件。 55 | + 将所有`Paint`事件按他们正在更新的矩形分组(帧ID,x,y,width,height)。 56 | + 绘制的最大`Paint`矩形是“全屏”矩形。 57 | + 每个矩形贡献一个分值。给定矩形的可用点是矩形的面积(width x height)。 58 | + 全屏绘制(最大矩形的任何`Paint`事件)计为50%,以便它们仍然有贡献但不支配进度。 59 | + 总和是每个矩形的点的总和。 60 | + 给定矩形的点在绘制该矩形的所有`Paint`事件上均匀分布。 61 | + 一个带有单个`Paint`事件的矩形将贡献全部区域。 62 | + 具有4个`Paint`事件的矩形将为每个`Paint`事件贡献其区域的25%。 63 | + 任何给定`Paint`事件的结束时间用于该`Paint`事件的时间。 64 | + 通过将每个`Paint`事件的贡献添加到运行总计中,接近总体(100%)来计算视觉进展。 65 | 66 | >+ In the case of Webkit-based browsers, we collect the timeline data which includes paint rects as well as other useful events. 67 | >+ We filter out any paint events that occur before the first layout that happens after the first response data is received. 68 | > + ResourceReceiveResponse -> Layout -> Paint events. 69 | > + This is done because the browser does several paint events before any data has actually been processed. 70 | >+ We group all paint events by the rectangle that they are updating (frame ID, x, y, width, height). 71 | >+ We consider the largest paint rectangle painted to be the "full screen" rectangle. 72 | >+ Each rectangle contributes a score towards an overall total. The available points for a given rectangle is that rectangle's area (width x height). 73 | >+ Full screen paints (any paint events for the largest rectangle) are counted as 50% so that they still contribute but do not dominate the progress. 74 | >+ The overall total is the sum of the points for each rectangle. 75 | >+ The points for a given rectangle are divided evenly across all of the paint events that painted that rectangle. 76 | > + A rectangle with a single paint event will have the full area as it's contribution. 77 | > + A rectangle with 4 paint events will contribute 25% of it's area for each paint event. 78 | >+ The endTime for any given paint event is used for the time of that paint event. 79 | >+ The visual progress is calculated by adding each paint event's contribution to a running total, approaching the overall total (100%). 80 | 81 | ## 四、参考Speed Index结果 82 | ### 1. 5Mbps电缆 83 | Alexa排名前30万来自[HTTP Archive](http://httparchive.org/)的测试: 84 | 85 | ![](/assets/img/using/metrics/si-cable.png) 86 | 87 | ### 2. 1.5Mbps DSL 88 | Alexa排名前10万来自[HTTP Archive](http://httparchive.org/)的测试: 89 | 90 | ![](/assets/img/using/metrics/distribution.png) -------------------------------------------------------------------------------- /Using-WebPagetest/metrics.md: -------------------------------------------------------------------------------- 1 | # 指标 2 | 3 | ### 1. 网页级指标(Page-level Metrics) 4 | 这些是为整个页面捕获并显示的顶级度量值。 5 | 6 | ### 2. 整页加载时间(Load Time) 7 | 测量的时间是从初始化请求,到开始执行`window.onload`事件。 8 | >The Load Time is measured as the time from the start of the initial navigation until the beginning of the window load event (onload). 9 | 10 | ### 3. 页面所有元素加载时间(Fully Loaded) 11 | 从初始化请求,到Document Complete后,2秒内(中间几百毫秒轮询)没有网络活动的时间,但这2秒是不包括在测量中的,所以会出现两个差值大于或小于2秒。 12 | > The Fully Loaded time is measured as the time from the start of the initial navigation until there was 2 seconds of no network activity after Document Complete. This will usually include any activity that is triggered by javascript after the main page loads. 13 | 14 | ### 4. 第一个字节加载时间(First Byte) 15 | 第一个字节时间(通常缩写为TTFB)被测量为从初始化请求,到服务器响应的第一个字节,被浏览器接收的时间(不包括DNS查询、TCP连接的时间)。 16 | 我理解TTFB的计算是从下图中requestStart到responseStart这之间的时间。 17 | 18 | ![](/assets/img/using/metrics/performance.png) 19 | 20 | 21 | ### 5. 页面渲染时间(Start Render) 22 | 测量的时间是从初始化请求,到第一个内容被绘制到浏览器显示的时间。在瀑布图中有两个参数指标`Start Render`和`msFirstPaint`。 23 | + `Start Render`是通过捕获页面加载的视频,并在浏览器第一次显示除空白页之外的其他内容时查看每个帧来衡量的。它只能在实验室测量,通常是最准确的测量。 24 | + `msFirstPaint`(IE专用属性)是由浏览器本身报告的一个测量,它认为绘制的第一个内容。通常是相当准确,但有时它报告的时候,浏览器只画一个空白屏幕。 25 | 26 | ### 6. 首屏展现平均值(Speed Index) 27 | 表示页面呈现用户可见内容的速度(越低越好)。有关如何计算的更多信息,请参见:[Speed Index](/Using-WebPagetest/metrics-speed-index.md)。 28 | 29 | ### 7. DOM元素数量(DOM Elements) 30 | 在测试结束时测试页面上的DOM元素的计数。 31 | 32 | ### 8. 请求级度量标准(Request-level Metrics) 33 | 这些是为每个请求捕获和显示的度量。 -------------------------------------------------------------------------------- /Using-WebPagetest/quick-start-guide.md: -------------------------------------------------------------------------------- 1 | # 快速入门指南 2 | WebPagetest的核心是用于测量和分析网页的性能。有很多选项,看着很吓人,但其实做快速测试是很简单的。 3 | 本指南将引导你提交测试和结果解释。 4 | 5 | ## 一、运行性能测试(Running a Performance Test) 6 | ### 1.1 输入网页网址(Enter The Page URL) 7 | 8 | 你需要做的第一件事是决定一个页面来测试。大多数人从他们的网站的主页开始(但不要忽视人们访问的其他页面)。确定要测试的页面后,转到WebPagetest并为其指定要测试的页面的URL: 9 | 10 | ![](/assets/img/using/guide/url.png) 11 | ### 1.2 选择位置(Select a Location) 12 | 接下来,应该决定从哪里运行测试。WebPagetest具有位于世界各地的测试机器,你应该从接近用户访问的位置进行测试,从列表中选择一个位置,或者单击`Select from Map`按钮,从地图视图中选择一个位置(只需单击气球,然后确定)。如果将指针放在气泡上,它们将显示一条消息,提示位置信息: 13 | 14 | ![](/assets/img/using/guide/map.png) 15 | ### 1.3 选择浏览器(Select a Browser) 16 | 最后,需要决定使用什么浏览器进行测试。**不同的位置支持不同的浏览器**,如果给定的位置没有正在寻找的浏览器,可以尝试不同的位置。 Dulles,VA USA位置支持WebPagetest工作的所有浏览器(IE 6,7,8和9)。现在忽略“dynaTrace”浏览器,这些用于更高级的分析。我们通常建议使用IE7进行初始测试,因为它几乎是最糟糕的情况,并且更容易看到很多问题,所以如果你不知道什么浏览器,开始只需使用IE7。 17 | 18 | ![](/assets/img/using/guide/browser.png) 19 | ### 1.4 提交测试(Submit the Test) 20 | 一切配置完成后,点击`START TEST`按钮,请求将发送到测试位置进行测试。测试可能需要一段时间才能运行,具体取决于有多少次测试(在测试之前至少有一分钟的测试时间,但是它的时间甚至更长)。一旦测试完成,你将得到结果。 21 | 22 | ## 二、解释结果(Interpreting the Results) 23 | 第一次看到结果信息可能有点吓人,信息量有点大,但首先可以先查看一些关键信息。 24 | 25 | ### 2.1 优化等级(Optimization Grades) 26 | 在结果页面的顶部是一组最关键的性能优化等级。涵盖了适用于所有网站的基本优化,任何不是A或B的都需要进行进一步的优化。 27 | 28 | ![](/assets/img/using/guide/grades.png) 29 | 30 | | 字母等级 | 占比 | 31 | | ------------ |:---------------| 32 | | A | 90%+ | 33 | | B | 80% ~ 89% | 34 | | C | 70% ~ 79% | 35 | | D | 60% ~ 69% | 36 | | F | 0% ~ 59% | 37 | 38 | #### 2.1.1 阻塞时间(First Byte Time) 39 | 首字节时间是指浏览器收到HTML内容的第一个字节时间,包括DNS查找、TCP连接、SSL协商(如果是HTTPS请求)和TTFB(Time To First Byte)。 40 | 关于First Byte Time和TTFB的区别在[Metrics](/Using-WebPagetest/metrics.md)一节中做了简单分析。 41 | 42 | 预期首字节 = RTT * 3 + SSL 43 | 比值 = 100 - (实际观测首字节 - 预期首字节) / 10 44 | 其中`RTT`的指往返通信时间。更多网络术语可以参考整理的[网络协议](http://www.cnblogs.com/strick/p/6262284.html) 45 | 46 | #### 2.1.2 长连接已启动(Keep-alive Enabled) 47 | 请求网页上的内容(图像、JavaScript、CSS、Flash等)需要与Web服务器建立连接。每次都重新连接会耗费一些时间,所以最好复用连接,`keep-alive`实现了这个方法。默认情况下,在配置中已启用,而且是HTTP 1.1标准的一部分,但有时它们将被破坏(可能是无意的)。启用`keep-alive`通常只是服务器上的配置更改,不需要对页面本身进行任何更改,通常可以将加载页面的时间减少40-50%。计算公式如下: 48 | 49 | 比值 = 实际复用连接数 / 预期复用连接数 50 | 51 | #### 2.1.3 压缩文本(Compress Text) 52 | 除了图片或视频,剩余的都是某种类型的文本(html,javascript,css等)。HTTP提供了一种以压缩形式传输文件的方法。启用文本资源压缩通常只是服务器配置更改,不需要对页面本身进行任何更改,提高性能降低服务内容的成本(通过减少传输的数据量)。由于文本资源通常在页面的开头(javascript和css)下载,因此,提供文本资源的快慢很影响用户体验。计算公式如下: 53 | 54 | 比值 = 资源压缩后的大小 / 实际资源的大小 55 | 56 | #### 2.1.4 压缩图片(Compress Images) 57 | 图像压缩检查仅查看照片图像(JPEG文件),确保质量不会设置得太高。JPEG图像可以在不降低视觉质量的情况下压缩。我们可以在Photoshop的“网络存储”模式中,使用一种质量级别为“50”的压缩图像的标准。在视觉质量不是很差的情况下,尽量多的压缩图像。在照片中经常包含其他数据,特别是如果照片来自数码相机(包含关于相机,镜头,位置,缩略图的信息),其中一些应该在被发布到网络之前就移除(小心保留任何版权信息)。计算公式如下: 58 | 59 | 比值 = 图片压缩后的尺寸 / 图片实际的尺寸 60 | 61 | #### 2.1.5 缓存静态内容(Cache Static Content) 62 | 静态内容是网页上不经常更改的内容(图片,javascript,css)。可以配置它们,以便用户的浏览器将它们缓存起来,浏览器决定一个资源被缓存多久取决于2个因素:`缓存寿命`和`过期时间`(TTL)。资源的寿命可以通过2个标签配置:实体标签(`ETags`)和首部标签(`Last-Modified`)。过期时间是根据2个TTL首部标签:`Cache-Control的max-age属性`和`Expires Header`。如果用户回到页面(或访问使用相同文件的其他页面),他们可以使用已经拥有的副本,而不是重新请求文件Web服务器。在用户浏览器中成功缓存静态内容可以显著提高重复访问的性能(高达80+%,具体优化率取决于页面),并能减少Web服务器上的负载。有时可能很难实现缓存而不改变页面,所以不要盲目地启用它(你需要能够更改希望改变的任何文件的文件名)。 63 | 64 | 比值 = 过期资源数得分 / 静态资源总数 65 | 66 | 这个评级需要一个缓存生命周期评分系统,如果一个静态资源的生命周期超过一周,就100分,超过一小时,最多50分,以上情况之外都是0分。 67 | 68 | #### 2.1.6 合并JS/CSS文件(Combine JS/CSS Files) 69 | 提高性能通常意味着减少对内容的请求数,最简单(最重要的)方法之一是减少在页面开头加载的css和javascript文件数量(在 中会阻塞页面显示)。一个简单的实现方法是将JavaScript和CSS分别合并到一个文件中(CSS最好在JavaScript之前加载)。减少用户从屏幕上看到东西的等待时间,对用户体验有巨大的影响。计算方式: 70 | 71 | #### 2.1.7 使用CDN(Use of CDN) 72 | 每个内容的请求都是从用户的浏览器到Web服务器,再返回。随着距离越来越远,这样一个往返可能消耗很多时间(页面上的请求越多,消耗的时间越多),把你的服务器建立在离用户比较近的地方就能解决这个问题,这正是内容分发网络(CDN)的作用。他们在世界各地都有靠近用户的服务器,从靠近用户的服务器提供网站的静态内容。使用CDN没有意义的唯一情况是如果网站的所有用户都已经接近Web服务器(例如社区网站)。计算方式: 73 | 74 | 比值 = 通过CDN服务获取的静态资源数 / 静态资源总数 75 | 76 | ### 2.2 高级度量(High-level Metrics) 77 | 结果页顶部的数据表提供了有关已加载页面的一些高级信息: 78 | 79 | ![](/assets/img/using/guide/WebPagetest_example.jpeg) 80 | #### 2.2.1 首次视图(First View) 81 | 首次视图的测试,将会把浏览器的缓存和Cookie清除,表示访问者第一次访问该网页,将体验到的情况。 82 | 83 | #### 2.2.2 重复视图(Repeat View) 84 | 重复视图会在首次视图测试后立即执行,不会清除任何内容。浏览器窗口在`First View`测试后关闭,然后启动新浏览器以执行`Repeat View`测试。重复视图测试模拟的是用户离开页面后,马上再进入此页面的场景。 85 | 86 | #### 2.2.3 文档加载完毕(Document Complete) 87 | 从初始化请求,到加载所有静态内容(图片、CSS、JavaScript等),但可能不包括由JavaScript执行触发的内容,可以理解为开始执行`window.onload`。原文如下: 88 | 89 | >The metrics grouped together under the Document Complete heading are the metrics collected up until the browser considered the page loaded (onLoad event for those familiar with the javascript events). This usually happens after all of the images content have loaded but may not include content that is triggered by javascript execution. 90 | 91 | #### 2.2.4 页面所有元素加载时间(Fully Loaded) 92 | 从初始化请求,到Document Complete后,2秒内没有网络活动的时间,这包括在主网页加载后由JavaScript触发的任何活动。原文如下: 93 | >The metrics grouped together under the Fully Loaded heading are the metrics collected up until there was 2 seconds of no network activity after Document Complete. This will usually include any activity that is triggered by javascript after the main page loads. 94 | 95 | #### 2.2.5 整页加载时间(Load Time) 96 | 与`Document Complete`中的时间属性相同。原文如下: 97 | >The Load Time is the time from when the user started navigating to the page until the Document Complete event (usually when all of the page content has loaded). 98 | 99 | #### 2.2.6 第一个字节加载时间(First Byte) 100 | 这个时间表示从初始化请求到服务器响应后,接收到第一个字节的时间。此时的大部分时间通常称为“后端时间”,服务器为用户构建页面的时间量。原文如下: 101 | >The First Byte time is the time from when the user started navigating to the page until the first bit of the server response arrived. The bulk of this time is usually referred to the "back-end time" and is the amount of time the server spent building the page for the user. 102 | 103 | #### 2.2.7 页面渲染时间(Start Render) 104 | 渲染时间表示屏幕上显示东西的第一个时间点,在这个时间点之前,用户看到的是一个空白页。这并不表示用户看到了内容,可能只是一个简单的背景色,但这是用户开始看到内容的第一个指标,`我理解这个为白屏时间`。原文如下: 105 | >The Start Render time is the first point in time that something was displayed to the screen. Before this point in time the user was staring at a blank page. This does not necessarily mean the user saw the page content, it could just be something as simple as a background color but it is the first indication of something happening for the user. 106 | 107 | #### 2.2.8 DOM元素数量(DOM Elements) 108 | 在测试结束时测试页面上的DOM元素的计数。 109 | 110 | #### 2.2.10 HTTP请求数(Requests) 111 | 浏览器针对页面上的内容(图片,javascript,css等)发出的请求数。 112 | 113 | #### 2.2.11 传输的字节量(Bytes In) 114 | 浏览器加载页面下载的数据量。它通常也被称为“页面大小”。 115 | 116 | --- 117 | 以前曾写过《[前端页面性能参数搜集](http://www.cnblogs.com/strick/p/5750022.html)》的文章,大家可以探讨一下。 -------------------------------------------------------------------------------- /Using-WebPagetest/result-codes.md: -------------------------------------------------------------------------------- 1 | # 结果代码 2 | 结果代码为0(成功)或99999(内容错误)是成功的测试,所有其他结果都是错误。 3 | 4 | | 结果代码 | 描述 | 5 | | :------------ |:---------------| 6 | | 0 | 成功的测试 | 7 | | 4xx-5xx | HTTP结果(基页错误) | 8 | | 99996 | 测试失败等待指定的DOM元素/结束条件 | 9 | | 99997 | 测试超时(无内容错误) | 10 | | 99998 | 测试超时(内容错误) | 11 | | 99999 | 测试成功完成但个别请求失败(内容错误) | 12 | 13 | 其他错误代码是Wininet / IE特定的错误代码(通常是大的负数)。识别它们的最好方法是将其转换为十六进制。 如果您在找到它们时向我们发送新的错误代码,我们将它们添加到表中。 -------------------------------------------------------------------------------- /Using-WebPagetest/scripting.md: -------------------------------------------------------------------------------- 1 | # 脚本 2 |   WebPagetest具有脚本功能,可自动执行多步测试(例如,登录网站或发送电子邮件)。脚本包含在文件中,其中单个文件构成浏览器会话(浏览器将在脚本完成后关闭)。文件是纯文本文件,可以由任何文本编辑器编辑。 3 | 你可以通过从“文件”菜单中选择“`Run Script`”来测试桌面版本中的脚本。 4 |   脚本文件的每一行包含一个命令和任何必要的参数,并且以制表符分隔(即命令之后是一个制表符,然后是第一个参数,然后是一个制表符和第二个参数等,直到该行结束)。 参数的数量及其控制取决于命令。 5 | 以//开头的空行和行将被忽略,因此您可以在脚本中嵌入注释。 6 |   对DOM元素操作的脚本命令标识具有`attribute = value`格式的DOM元素,其中该属性标识要作用的DOM元素的唯一属性。例如,如果正在填写表单,填充的元素看起来像这样: 7 | ```html 8 | 9 | ``` 10 | 你可以将它标识为`id = lgnId1`,`name = loginId`或`tabindex = 1` 11 |   对于表单字段,通常最好使用名称属性,这些将被上传到服务器。类属性是特殊的,并且被引用为`className`而不是类。除了DOM元素属性匹配之外,还有两个特殊属性可用于匹配内容。 `innerText`和`innerHtml`,它们都将匹配DOM元素的内容,而不是它的属性。例如: 12 | ```html 13 |
Delete
14 | ``` 15 | 可以通过`innerText = Delete`来标识。 匹配区分大小写,并匹配完整字符串。 16 | 17 | ## 一、托管脚本(Hosted Scripting) 18 | 托管版本的WebPagetest支持执行上传的脚本,但有一些限制: 19 | + 托管的脚本只能有一个步骤产生数据(见下面的例子,如何抑制中间步骤的结果) 20 | + 不允许使用使用外部文件的命令(loadFile,loadVariables,fileDialog) 21 | 22 | 为了抑制中间步骤,您需要确保对于要记录的步骤,禁用数据记录。例如: 23 | ```bash 24 | logData 0 25 | // put any urls you want to navigate 26 | navigate www.aol.com 27 | navigate news.aol.com 28 | logData 1 29 | // this step will get recorded 30 | navigate news.aol.com/world 31 | ``` 32 | 上面的脚本将导航到主要的aol门户,然后到新闻页面,最后到世界新闻特定页面(仅记录世界新闻页面的记录结果)。 这样就可以测试给定路径对网站的性能(例如,共享css和js缓存)的影响。 33 | 另一个重要的用例是,如果你想测试一个需要验证的网站。以下是验证脚本: 34 | ```bash 35 | logData 0 36 | // bring up the login screen 37 | navigate http://webmail.aol.com 38 | logData 1 39 | // log in 40 | setValue name=loginId someuser@aol.com 41 | setValue name=password somepassword 42 | submitForm name=AOLLoginForm 43 | ``` 44 | 你不会得到很多关于脚本失败的反馈,所以请确保在桌面版本的WebPagetest(`File`->`Run Script`)中测试脚本,然后再上传它们进行托管测试。 45 | 46 | ## 二、命令参考(Command Reference) 47 | usage:用法,example:示例。 48 | ### 2.1 导航/ DOM互动(Navigation/DOM Interaction) 49 | #### 2.1.1 navigate 50 | 将浏览器导航到所提供的URL,并等待其完成。 51 | 浏览器支持:IE,Chrome,Firefox,Safari 52 | ```bash 53 | usage: navigate 54 | example: navigate http://webmail.aol.com 55 | 56 | - URL to provide the browser for navigation (same as you would enter into the address bar) 57 | ``` 58 | 59 | #### 2.1.2 click 60 | 触发标识的DOM元素的点击事件。此版本没有暗示的等待,脚本将在事件提交后继续运行(请参阅clickAndWait等待版本)。 61 | 浏览器支持:IE, Chrome, Firefox 62 | ```bash 63 | usage: click 64 | example: click title=Delete (del) 65 | 66 | - DOM element to click on 67 | ``` 68 | 69 | #### 2.1.3 clickAndWait 70 | 触发标识的DOM元素的点击事件,然后等待浏览器活动完成。 71 | 浏览器支持:IE, Chrome, Firefox 72 | ```bash 73 | usage: clickAndWait 74 | example: clickAndWait innerText=Send 75 | 76 | - DOM element to click on 77 | ``` 78 | 79 | #### 2.1.4 selectValue 80 | 从给定DOM元素的下拉列表中选择一个值。 81 | 浏览器支持:IE 82 | ```bash 83 | usage: selectValue 84 | example: selectValue id=country usa 85 | 86 | - DOM element to select the value of 87 | - value to use 88 | ``` 89 | 90 | #### 2.1.5 sendClick / sendClickAndWait 91 | 创建JavaScript `OnClick`事件并将其发送到指定的元素。 92 | 浏览器支持:IE 93 | ```bash 94 | usage: sendClickAndWait 95 | example: sendClickAndWait innerText=Send 96 | 97 | - DOM element to send the click event to 98 | ``` 99 | 100 | #### 2.1.6 sendKeyDown / sendKeyUp / sendKeyPress (AndWait) 101 | 创建一个创建JavaScript键盘事件(`OnKeyDown`,`OnKeyUp`,`OnKeyPress`),并将其发送到指定的元素。 102 | 浏览器支持:IE 103 | ```bash 104 | usage: sendKeyDownAndWait 105 | example: sendKeyDownAndWait name=user x 106 | 107 | - DOM element to send the click event to 108 | - Key command to send (special values are ENTER, DEL, DELETE, BACKSPACE, TAB, ESCAPE, PAGEUP, PAGEDOWN) 109 | ``` 110 | 111 | #### 2.1.7 setInnerHTML 112 | 将给定DOM元素的`innerHTML`设置为所提供的值。这通常用于填充类似可编辑的HTML面板(如webmail中的消息正文)。 如果要包括HTML格式,请使用此选项。 113 | 浏览器支持:IE, Chrome, Firefox 114 | ```bash 115 | usage: setInnerHTML 116 | example: setInnerHTML contentEditable=true %MSG% 117 | 118 | - DOM element to set the innerText of 119 | - value to use 120 | ``` 121 | 122 | #### 2.1.8 setInnerText 123 | 将给定DOM元素的`innerText`设置为所提供的值。这通常用于填充类似可编辑的HTML面板(如webmail中的消息正文)。 如果您不想包括任何HTML格式,请使用此选项。 124 | 浏览器支持:IE, Chrome, Firefox 125 | ```bash 126 | usage: setInnerText 127 | example: setInnerText contentEditable=true %MSG% 128 | 129 | - DOM element to set the innerText of 130 | - value to use 131 | ``` 132 | 133 | #### 2.1.9 setValue 134 | 将给定DOM元素的值属性设置为所提供的值。这通常用于填充页面上的文本元素(表单或其他形式)。当前只支持“`input`”和“`textArea`”元素类型。 135 | 浏览器支持:IE, Chrome, Firefox 136 | ```bash 137 | usage: setValue 138 | example: setValue name=loginId userName 139 | 140 | - DOM element to set the value of 141 | - value to use 142 | ``` 143 | 144 | #### 2.1.10 submitForm 145 | 触发标识窗体的提交事件。 146 | 浏览器支持:IE, Chrome, Firefox 147 | ```bash 148 | usage: submitForm 149 | example: submitForm name=AOLLoginForm 150 | 151 | - Form element to submit 152 | ``` 153 | 154 | #### 2.1.11 exec 155 | 执行JavaScript。 156 | 浏览器支持:IE, Chrome, Firefox 157 | ```bash 158 | usage: exec 159 | example: exec window.setInterval('window.scrollBy(0,600)', 1000); 160 | ``` 161 | 162 | #### 2.1.12 execAndWait 163 | 执行JavaScript并等待浏览器完成从操作生成的任何活动。 164 | 浏览器支持:IE, Chrome, Firefox 165 | ```bash 166 | usage: execAndWait 167 | example: execAndWait window.setInterval('window.scrollBy(0,600)', 1000); 168 | ``` 169 | 170 | #### 2.1.13 fileDialog 171 | 单击标识的按钮以操作本地文件,指定所提供的文件,然后关闭本地文件浏览对话框。 这主要用于上传本地文件(附加到邮件,上传图片等)。 172 | 浏览器支持:IE 173 | ```bash 174 | usage: fileDialog 175 | example: fileDialog type=file msg.gif 176 | 177 | - DOM element to click on. 178 | - file to attach/upload. 179 | ``` 180 | 181 | 除非一个页面具有多个用于附加文件的按钮(极不可能),否则应该能够始终对DOM元素使用`type=file`。 182 | 文件的路径搜索顺序是首先检查脚本运行所在的同一目录,然后检查WebPagetest安装到的目录,然后最终将该文件作为绝对路径。 183 | 184 | ### 2.2 结束条件(End Conditions) 185 | #### 2.2.1 requiredRequest 186 | 强制测试在完成之前等待给定的请求。 187 | 浏览器支持:IE 188 | ```bash 189 | usage: requiredRequest 190 | example: requiredRequest adsWrapper.js 191 | 192 | - Part of the request URL to match (case-sensitive substring match) 193 | ``` 194 | 你可以通过为每个新请求重复此命令来指定多个请求: 195 | 196 | ```bash 197 | requiredRequest www.aol.com 198 | requiredRequest www.google.com 199 | navigate www.google.com 200 | ``` 201 | 202 | #### 2.2.2 setABM 203 | 设置“基于活动的测量(Activity Based Measurement)”模式。 有效值为: 204 | + 0 - 禁用(Web 1.0 - 基于文档完成的测量) 205 | + 1 - 启用(Web 2.0 - 测量直到活动停止) 206 | + 2 - 自动(测量直到活动停止,但记录是否应使用文档完成或完全加载数字) 207 | 208 | 如果在脚本中未指定,则默认值为2(自动) 209 | 浏览器支持:IE 210 | ```bash 211 | usage: setABM 212 | example: setABM 0 213 | 214 | - ABM mode to use 215 | ``` 216 | 217 | #### 2.2.3 setActivityTimeout 218 | 覆盖在完成测试之前的,最后一次网络活动之后的,超时值(默认为2000秒,即2秒)。 219 | 浏览器支持:IE, Chrome, Firefox, Safari 220 | ```bash 221 | usage: setActivityTimeout 222 | example: setActivityTimeout 5000 223 | 224 | - Number of milliseconds after the last network activity (after onload) before calling a test done. 225 | ``` 226 | 227 | #### 2.2.4 setDOMElement 228 | 设置下一个事件成功完成所需的DOM元素的属性。直到DOM元素出现或动作超时,测量才完成。此外,DOM元素出现的时间将记录在结果中。 229 | 浏览器支持:IE, Chrome, Firefox 230 | ```bash 231 | usage: setDOMElement 232 | example: setDOMElement name=loginId 233 | 234 | - DOM element to wait for 235 | ``` 236 | 237 | #### 2.2.5 setDOMRequest 238 | 设置下一个事件成功完成所需的Http请求的子字符串。在特定Http请求完成或操作超时之前,测量将不会完成。 239 | 此外,Http请求发生的时间将记录在结果中。 240 | 浏览器支持:IE 241 | ```bash 242 | usage: setDOMRequest 243 | example: setDOMRequest www.google.com/images 244 | 245 | - Http Request to wait for 246 | - It is optional. It can be TTFB or START. If it is not present, the time till the END of the Http Request will be recorded in the results 247 | ``` 248 | 249 | #### 2.2.6 setTimeout 250 | 覆盖单个脚本步骤的超时值。 251 | 浏览器支持:IE, Chrome, Firefox, Safari 252 | ```bash 253 | usage: setTimeout 254 | example: setTimeout 240 255 | 256 | - Number of seconds to allow for the navigation/step to complete. 257 | ``` 258 | 259 | #### 2.2.7 waitForComplete 260 | 等待当前活动的测量完成。这通常不需要,因为启动活动的大多数命令隐式等待或具有包括等待的命令的版本。这应该只在没有一个适合于被测量的动作时使用。 261 | 浏览器支持:IE 262 | ```bash 263 | usage: waitforComplete 264 | example: waitforComplete 265 | ``` 266 | 267 | #### 2.2.8 waitForJSDone 268 | 等待页面上的代码通过调用`window.webpagetest.done()`来显式地指示它已完成。 269 | 浏览器支持:IE 270 | ```bash 271 | usage: waitForJSDone 272 | example: waitForJSDone 273 | ``` 274 | 页面上的JavaScript看起来像: 275 | 276 | ```JavaScript 277 | if( window.webpagetest ) 278 | window.webpagetest.done(); 279 | ``` 280 | 281 | ### 2.3 请求操作(Request Manipulation) 282 | #### 2.3.1 block 283 | 阻止个别请求加载(可用于阻止像广告等内容)。该命令匹配要阻止的事物列表与每个请求的完整URL(包括主机名)。 284 | 浏览器支持:IE, Chrome, Firefox 285 | ```bash 286 | usage: block 287 | example: block adswrapper.js addthis.com 288 | 289 | - space-delimited list of substrings to block 290 | ``` 291 | 292 | #### 2.3.2 blockDomains 293 | 阻止来自指定网域的所有请求加载(可用于阻止像广告等内容)。使用以空格分隔的完整域的列表进行阻止。 294 | 浏览器支持:桌面(wptdriver 300+) 295 | ```bash 296 | usage: blockDomains 297 | example: blockDomains adswrapper.js addthis.com 298 | 299 | - space-delimited list of domains to block 300 | ``` 301 | 302 | #### 2.3.3 blockDomainsExecpt 303 | 阻止不是来自某个指定网域的所有请求加载(可用于阻止像广告等内容)。以允许的完整域的空格分隔列表。 304 | 浏览器支持:桌面(wptdriver 300+) 305 | ```bash 306 | usage: blockDomainsExcept 307 | example: blockDomainsExcept www.example.com cdn.example.com 308 | 309 | - space-delimited list of domains to allow 310 | ``` 311 | 312 | #### 2.3.4 setCookie 313 | 存储浏览时要使用的浏览器Cookie。 314 | 浏览器支持:IE,Chrome,Firefox 315 | ```bash 316 | usage: setCookie 317 | example: setCookie http://www.aol.com zip=20166 318 | example: setCookie http://www.aol.com TestData = Test; expires = Sat,01-Jan-2000 00:00:00 GMT 319 | 320 | - Path where the cookie should be used/stored 321 | - Cookie value (if expiration information isn't included it will be stored as a session cookie) 322 | ``` 323 | 324 | #### 2.3.5 setDns 325 | 允许覆盖用于主机名的IP地址。仍将查找原始名称,以便记录准确的时间,但地址将被指定的替换。 326 | 浏览器支持:IE, Chrome, Firefox, Safari 327 | ```bash 328 | usage: setDns 329 | example: setDns www.aol.com 127.0.0.1 330 | 331 | - Host name for the DNS entry to override 332 | - IP Address for the host name to resolve to 333 | ``` 334 | 335 | #### 2.3.6 setDNSName 336 | 允许覆盖主机名(创建假CNAME)。 337 | 浏览器支持:IE, Chrome, Firefox, Safari 338 | ```bash 339 | usage: setDnsName 340 | example: setDnsName pat.aol.com www.aol.com 341 | 342 | - Host name to replace 343 | - Real name to lookup instead 344 | ``` 345 | 346 | #### 2.3.7 setUserAgent 347 | 覆盖由浏览器发送的用户代理字符串。 348 | 浏览器支持:IE, Chrome, Firefox, Safari 349 | 小心:你仍然使用相同的浏览器引擎,因此仍然受到该浏览器的功能和行为的限制,即使欺骗了另一个浏览器。 350 | ```bash 351 | usage: setUserAgent 352 | example: setUserAgent Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3 353 | 354 | - User agent string to use. 355 | ``` 356 | 357 | #### 2.3.8 overrideHost 358 | 使用提供的值,替换给定主机的`Host:HTTP`头的值。它还添加了一个带有原始值的新标题(`x-Host:`)。 359 | 浏览器支持:IE,Chrome,Firefox,Safari(无SSL) 360 | ```bash 361 | usage: overrideHost 362 | example: overrideHost www.aol.com www.notaol.com 363 | 364 | - host for which you want to override the Host: HTTP header 365 | - value to set for the Host header 366 | ``` 367 | 368 | #### 2.3.9 overrideHostUrl 369 | 对于给定主机的所有请求,重写请求以转到其他服务器,并将原始主机包含在新URI中。 370 | 浏览器支持:IE 371 | ```bash 372 | usage: overrideHostUrl 373 | example: overrideHostUrl www.webpagetest.org staging.webpagetest.org 374 | 375 | - host for which you want to redirect requests 376 | - target server to receive the redirected requests 377 | 378 | In this example, http://www.webpagetest.org/index.php will get rewritten to actually request http://staging.webpagetest.org/www.webpagetest.org/index.php 379 | ``` 380 | 381 | #### 2.3.10 addHeader 382 | 将指定的标头添加到每个http请求(除了存在的标头之外,不覆盖现有标头)。 383 | 浏览器支持:IE,Chrome,Firefox,Safari(无SSL) 384 | ```bash 385 | usage: addHeader
{filter} 386 | example: addHeader Pragma: akamai-x-cache-on 387 | 388 |
- Full header entry to add (including label) 389 | {filter} - (optional) regex match for host names where the header should be added 390 | ``` 391 | 392 | #### 2.3.11 setHeader 393 | 将指定的标头添加到每个http请求,覆盖标头(如果标头已存在)。 394 | 浏览器支持:IE,Chrome,Firefox,Safari(无SSL) 395 | ```bash 396 | usage: setHeader
{filter} 397 | example: setHeader UA-CPU: none-ya 398 | 399 |
- Full header entry to set (including label) 400 | {filter} - (optional) regex match for host names where the header should be set 401 | ``` 402 | 403 | #### 2.3.12 resetHeaders 404 | 清除通过`addHeader`或`setHeader`指定的任何标头(以防只想覆盖部分脚本的标头)。 405 | 浏览器支持:IE,Chrome,Firefox,Safari 406 | ```bash 407 | usage: resetHeaders 408 | example: resetHeaders 409 | ``` 410 | 411 | ### 2.4 杂项(Misc) 412 | #### 2.4.1 combineSteps 413 | 使多个脚本步骤在结果中合并为单个“步骤”。 414 | 浏览器支持:IE,Chrome,Firefox,Safari 415 | ```bash 416 | usage: combineSteps [count] 417 | example: combineSteps 418 | 419 | [count] - Number of script steps to merge (optional, defaults to 0 which is ALL) 420 | ``` 421 | 422 | 示例脚本: 423 | ```bash 424 | combineSteps 425 | navigate www.google.com 426 | navigate www.yahoo.com 427 | navigate www.aol.com 428 | ``` 429 | 430 | #### 2.4.2 if/else/endif 431 | 根据测试的运行编号或缓存状态有条件地执行一个脚本代码块。 432 | 条件块可以嵌套。 433 | 浏览器支持:IE,Chrome,Firefox,Safari 434 | ```bash 435 | usage: if [cached|run] 436 | else 437 | endif 438 | 439 | example: if run 1 440 | if cached 0 441 | 442 | endif 443 | else 444 | 445 | endif 446 | 447 | [cached|run] - Compare against run number or cached state 448 | - matching run number or cached state to execute block 449 | ``` 450 | 451 | #### 2.4.3 ignoreErrors 452 | 继续运行脚本,而不考虑任何错误。如果你希望脚本的某些部分间歇性失败,但仍希望继续执行脚本,这将非常有用。默认值是禁用它,处理脚本中的任何错误都将停止测试。 453 | 浏览器支持:IE 454 | ```bash 455 | usage: ignoreErrors 456 | example: ignoreErrors 1 457 | 458 | - set to 1 to turn on error ignoring and 0 to disable it 459 | ``` 460 | 461 | #### 2.4.4 logErrors 462 | 启用或禁用错误日志。默认值为启用。 463 | 浏览器支持:IE 464 | ```bash 465 | usage: logErrors 466 | example: logErrors 0 467 | 468 | - set to 0 to turn off error logging and 1 to re-enable it 469 | ``` 470 | 471 | #### 2.4.5 loadFile 472 | 用提供的文件的内容填充提供的变量(内容预期为文本,而不是二进制)。 473 | 脚本引擎将自动替换值参数字段(第3个参数)中任何变量的所有出现。对变量如何命名没有限制,但强烈建议您使用%variable%或$ variable $或类似的约定,以便不会意外替换您不希望发生的变量。 474 | 对可以使用的变量数量或可以加载的文件数量没有限制。每个新文件只是添加到现有变量列表。如果两个文件之间的变量名存在冲突,则最后装入的文件将替换所有先前的版本。 475 | 浏览器支持:IE 476 | ```bash 477 | usage: loadFile 478 | example: loadFile msg.txt %MSG% 479 | 480 | - file contents that are to be loaded into the provided variable name. 481 | - variable name to associate with the file contents. 482 | ``` 483 | 文件的路径搜索顺序是首先检查脚本运行所在的同一目录,然后检查WebPagetest安装到的目录,然后最终将该文件作为绝对路径。 484 | 485 | #### 2.4.6 loadVariables 486 | 从提供的文件填充一组变量。 该文件应该是一个平面文本文件,每行上的变量格式为“`variable = value`”。 487 | 浏览器支持:IE 488 | ```bash 489 | %AOLSN%=username 490 | %AOLPW%=password 491 | {noformat} 492 | 493 | The script engine will automatically replace all occurrences of any variable in the value parameter field (3rd parameter). There is no restriction on how the variables are named but it is strongly recommended that you use a convention of %variable% or $variable$ or something similar so that you don't accidentally substitute variables where you did not expect it to happen. 494 | 495 | There is no limit on the number of variables you can use or the number of variable files you can load. Each new variable file just adds to the existing variable list. If there is a collision in variable names between two files, the one that is loaded last replaces all previous versions. 496 | 497 |
498 | usage: loadVariables	
499 | example: loadVariables	accounts.txt
500 | 
501 |  - file that includes the variable/value pairs (see format above).
502 | ```
503 | 
504 | #### 2.4.7 minInterval
505 | 指定脚本的以下部分可以运行的最小时间间隔(以分钟为单位)。例如,如果只想测试邮件发送的频率不要超过每60分钟(在单个机器上),那么将在脚本中要发送邮件的位置插入一个`minInterval`命令。如果间隔尚未过期,则脚本将退出。还可以使用它来确保多个浏览器不会同时执行同一操作,通过指定间隔0(这将允许运行测试,但会暂停第二个脚本,直到第一个脚本完成为止)。  
506 | 浏览器支持:IE
507 | ```bash
508 | usage: minInterval		
509 | example: minInterval	AOLSendMail	60
510 | 
511 |  - Unique event name that will be restricted to the interval
512 |  - Minimum time in minutes to allow between allowing the event to run
513 | ```
514 | 
515 | #### 2.4.8 endInterval
516 | 结束由`minInterval`块保护的代码块。如果要使用间隔保护的脚本部分位于脚本中间,并且总是想要执行脚本的其余部分(例如注销),这将非常有用。  
517 | 浏览器支持:IE
518 | ```bash
519 | usage: endInterval
520 | example: endInterval
521 | ```
522 | 
523 | #### 2.4.9 expireCache
524 | 在指定秒数内过期缓存。可以模拟在一定时间(例如,第二天浏览页面)之后访问页面。它不会帮助模拟内容更改,但是任何具有短期到期的资源,都会与if-modified-since比对。  
525 | 浏览器支持:IE
526 | ```bash
527 | usage: expireCache	
528 | example: expireCache	86400
529 | 
530 |  - Any resources with a cache lifetime less than this amount of time will be forced to expire.
531 | ```
532 | 
533 | #### 2.4.10 firefoxPref
534 | 指定将在启动浏览器之前配置的任意首选项。  
535 | 浏览器支持:Firefox
536 | ```bash
537 | usage: firefoxPref	    
538 | examples:
539 | firefoxPref    network.http.pipelining    false
540 | firefoxPref    network.http.pipelining.maxrequests    5
541 | firefoxPref    general.useragent.override    "Some User Agent String"
542 | 
543 |  - The preference that is to be modified
544 |  - The value to use.  String values should be enclosed in quotes like the example.
545 | ```
546 | 
547 | #### 2.4.11 setEventName
548 | 设置下一个可测量操作的事件名称。重要的是,只有在生成要测量的活动的操作之前设置此权限,以便不会无意中测量其他页面活动。没有显式事件名称,每个步骤将自动命名为Step_1,Step_2等。  
549 | 浏览器支持:IE
550 | ```bash
551 | usage: setEventName	
552 | example: setEventName	loadWebmail
553 | 
554 |  - Name to use for the event about to occur (in resulting log files)
555 | ```
556 | 
557 | #### 2.4.12 setViewportSize
558 | 更改可见浏览器窗口的大小,以便页面视口匹配给定的尺寸。如果你的屏幕截图上有黑色区域,那么视口比桌面大。  
559 | 浏览器支持:IE,Chrome,Firefox,Safari
560 | ```bash
561 | usage: setViewportSize	    
562 | example: setViewportSize    320    365
563 | 
564 |  - Viewport Width
565 |  - Viewport Height
566 | ```
567 | 
568 | #### 2.4.13 sleep
569 | 暂停脚本操作达到给定的秒数。  
570 | 浏览器支持:IE,Chrome,Firefox,Safari
571 | ```bash
572 | usage: sleep	
573 | example: sleep	5
574 | 
575 |  - An integer indicating how long to sleep.  The allowable range is 1-30.
576 | ```
577 | 
578 | ## 三、示例脚本
579 | ### 1. Mail test
580 | ```bash
581 | // load the account name and password
582 | loadVariables	accounts.txt
583 | 
584 | // bring up the login screen
585 | setEventName	launch
586 | setDOMElement	name=loginId
587 | navigate	http://webmail.aol.com
588 | 
589 | // ignore any errors from here on (in case the mailbox is empty or we get image challenged)
590 | ignoreErrors	1
591 | 
592 | // log in
593 | setValue	name=loginId	%AOLSN%
594 | setValue	name=password	%AOLPW%
595 | setDOMElement	className=turbogrid-row
596 | setEventName	load
597 | submitForm	name=AOLLoginForm
598 | 
599 | // only read and send a mail once an hour
600 | minInterval	AOLMail	60
601 | 
602 | // close the today curtain
603 | click	className=backdrop
604 | sleep	5
605 | 
606 | // Open the first message with a subject of "test"
607 | setDOMElement	className=msgBody
608 | setEventName	read
609 | clickAndWait	innerText=test
610 | 
611 | // delete the message
612 | click	title=Delete (del)
613 | sleep	5
614 | 
615 | // open the compose mail form
616 | setDOMElement	contentEditable=true
617 | setEventName	compose
618 | clickAndWait	title=Write mail (Alt + w)
619 | 
620 | // send a test message to myself
621 | sleep	1
622 | setValue	tabindex=100	%AOLSN%
623 | setValue	name=Subject	test
624 | loadFile	msg.txt	%MSG%
625 | setInnerText	contentEditable=true	%MSG%
626 | fileDialog	type=file	msg.gif
627 | sleep	1
628 | setDOMElement	className=confirmMessage
629 | setEventName	send
630 | clickAndWait	innerText=Send
631 | 
632 | endInterval
633 | 
634 | // sign off
635 | setEventName	logout
636 | clickAndWait	className=signOutLink
637 | ```
638 | 
639 | ### 2. MyAOL Authenticated profile
640 | ```bash
641 | // load the account name and password
642 | loadVariables	accounts.txt
643 | 
644 | // bring up the login screen
645 | setDOMElement	name=loginId
646 | navigate	https://my.screenname.aol.com/_cqr/login/login.psp?mcState=initialized&sitedomain=my.aol.com&authLev=0&siteState=OrigUrl%3Dhttp%3A%2F%2Fmy.aol.com%2F
647 | 
648 | // log in
649 | setValue	name=loginId	%AOLSN%
650 | setValue	name=password	%AOLPW%
651 | setDOMElement	className=more_pics
652 | submitForm	name=AOLLoginForm
653 | ```
654 | 
655 | ### 3. DNS Override
656 | 此脚本步骤如下:
657 | + 为`www1.aol.com`创建一个假的DNS条目,并让它查找`www.aol.com`
658 | + 强制`www.aol.com`解析为`127.0.0.1`
659 | + 在`www.aol.com`域中设置“zip”cookie
660 | + 跳转并测量加载`www.aol.com`的时间
661 | ```bash
662 | setDnsName	www1.aol.com	www.aol.com
663 | setDns	www.aol.com	127.0.0.1
664 | setCookie	http://www.aol.com	zip=20166
665 | navigate	http://www.aol.com
666 | ```
667 | 
668 | ### 4. iPhone Spoofing
669 | 此脚本步骤如下:
670 | + 使用iPhone用户代理字符串
671 | + 更改浏览器尺寸以匹配iPhone
672 | + 跳转到`www.aol.com`
673 | ```bash
674 | setUserAgent	Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25
675 | setViewportSize    320    356
676 | navigate	http://www.aol.com
677 | ```


--------------------------------------------------------------------------------
/assets/img/other/down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/other/down.png


--------------------------------------------------------------------------------
/assets/img/other/latency.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/other/latency.png


--------------------------------------------------------------------------------
/assets/img/other/net.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/other/net.png


--------------------------------------------------------------------------------
/assets/img/other/up.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/other/up.png


--------------------------------------------------------------------------------
/assets/img/private/ec2config.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/private/ec2config.png


--------------------------------------------------------------------------------
/assets/img/private/locations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/private/locations.png


--------------------------------------------------------------------------------
/assets/img/qrcode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/qrcode.png


--------------------------------------------------------------------------------
/assets/img/system/WebPagetest_Mobile_Network.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/system/WebPagetest_Mobile_Network.png


--------------------------------------------------------------------------------
/assets/img/system/overview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/system/overview.png


--------------------------------------------------------------------------------
/assets/img/system/replay1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/system/replay1.png


--------------------------------------------------------------------------------
/assets/img/system/replay2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/system/replay2.png


--------------------------------------------------------------------------------
/assets/img/system/replay3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/system/replay3.png


--------------------------------------------------------------------------------
/assets/img/using/guide/WebPagetest_example.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/guide/WebPagetest_example.jpeg


--------------------------------------------------------------------------------
/assets/img/using/guide/browser.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/guide/browser.png


--------------------------------------------------------------------------------
/assets/img/using/guide/change.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/guide/change.png


--------------------------------------------------------------------------------
/assets/img/using/guide/dom.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/guide/dom.jpg


--------------------------------------------------------------------------------
/assets/img/using/guide/grades.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/guide/grades.png


--------------------------------------------------------------------------------
/assets/img/using/guide/map.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/guide/map.png


--------------------------------------------------------------------------------
/assets/img/using/guide/start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/guide/start.png


--------------------------------------------------------------------------------
/assets/img/using/guide/url.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/guide/url.png


--------------------------------------------------------------------------------
/assets/img/using/metrics/chart-index-a-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/metrics/chart-index-a-small.png


--------------------------------------------------------------------------------
/assets/img/using/metrics/chart-index-b-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/metrics/chart-index-b-small.png


--------------------------------------------------------------------------------
/assets/img/using/metrics/chart-line-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/metrics/chart-line-small.png


--------------------------------------------------------------------------------
/assets/img/using/metrics/chart-progress-a-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/metrics/chart-progress-a-small.png


--------------------------------------------------------------------------------
/assets/img/using/metrics/chart-progress-b-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/metrics/chart-progress-b-small.png


--------------------------------------------------------------------------------
/assets/img/using/metrics/compare_progress.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/metrics/compare_progress.png


--------------------------------------------------------------------------------
/assets/img/using/metrics/compare_trimmed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/metrics/compare_trimmed.png


--------------------------------------------------------------------------------
/assets/img/using/metrics/distribution.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/metrics/distribution.png


--------------------------------------------------------------------------------
/assets/img/using/metrics/performance.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/metrics/performance.png


--------------------------------------------------------------------------------
/assets/img/using/metrics/si-cable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/metrics/si-cable.png


--------------------------------------------------------------------------------
/assets/img/using/metrics/speedindexformula.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pwstrick/WebPagetest-Docs/626bf88522bc828ed2a156a0c92c4d1b1c74be75/assets/img/using/metrics/speedindexformula.png


--------------------------------------------------------------------------------
/demo.md:
--------------------------------------------------------------------------------
 1 | # 快速开始
 2 | > At its core, WebPagetest is used for measuring and analyzing the performance of web pages.  There are a lot of options that may seem intimidating at first but doing quick testing is pretty simple.  This guide will walk you through submitting a test and interpreting the results.
 3 | 
 4 | ```javascript
 5 | common.const = {
 6 |   COOKIE_APP_NAME: 'chelun_appName', //车轮APP名称,比如 查违章,车轮社区
 7 |   COOKIE_APP_VERSION: 'chelun_appVersion', //APP版本号
 8 |   COOKIE_APP_TOKEN: 'chelun_acToken', //车轮统一登录态,去服务端校验
 9 |   COOKIE_DEVICE: 'chelun_device', //机型,主要针对安卓,读取系统设备信息来做兼容性判断和数据统计
10 |   COOKIE_OS_TYPE: 'chelun_osType', //操作系统 ios android
11 |   COOKIE_OS_VERSION: 'chelun_osVersion', //IOS版本号   安卓版本号
12 |   COOKIE_IS_LOGIN: 'chelun_isLogin', //是否登录
13 | };
14 | ```
15 | 
16 | ```php
17 |