• 代理安装
    • 一、要求
    • 二、准备设备
      • 2.1 Android
      • 2.2 iOS (work in progress)
    • 三、准备主机
      • 3.1 Android特定主机配置
      • 3.2 iOS特定主机配置(工作进行中)
    • 四、连接并验证配置
      • 4.1 Android
    • 五、在WPT服务器上配置locations.ini
    • 六、启动代理
    • 七、高级功能
      • 7.1 WebDriver脚本
      • 7.2 Android tcpdump
      • 7.3 流量整形
      • 7.4 视频捕获(非Android)
      • 7.5 按每个设备用户运行

    代理安装

    一、要求

      你需要一个主机来运行代理。我们为每个设备创建一个代理。主机可以运行多个代理。
      任何支持NodeJS和adb的操作系统都应该可以正常工作,但是Linux和Windows是唯一可以进行定期测试的操作系统。 如果你的主机只有USB 3,你可能需要使用Windows(至少截至2014年2月,Linux上的USB 3驱动程序非常不稳定)。 如果你的主机作为USB 2.0端口,那么Linux或Windows是一个好的选择。
      对于Android,您将需要一个运行KitKat(4.4)或更高版本的手机,可以植根(Nexus设备和Motorola G的工作良好)。
      我们假设你使用的是Linux和Nexus4。

    二、准备设备

    2.1 Android

    • 根设备(首先执行此操作,因为它会清除所有设置)
      • Nexus设备(4,5,7) - cf-auto-root(最好是手动“adb reboot bootloader”和“fastboot oem unlock”)
      • 摩托罗拉G(解锁引导加载程序然后使用超级引导)
    • 进入SuperSU设置(如果已安装)并禁用通知并将默认访问权限设置为grant
    • 从Play商店安装Chrome,Chrome测试版和Chrome开发者(请确保Chrome更新到最新版本)
      • 启动两者并接受服务条款,并关闭任何“帮助使Chrome更好”对话框
      • 确保Google Play已配置为自动安装更新
    • 停用滑动即可解锁(可选,在安全设置中)
    • 激活开发人员模式(点击操作系统版本7次)
    • 启用USB调试(在开发人员选项中)
    • 停用屏幕睡眠(在开发者选项中)
    • 禁用屏幕自动旋转(除非设置横向测试设备)
      • 大多数发行版都有快速设置锁定屏幕方向,否则可能在“显示”菜单下作为“当设备旋转时”设置,选择保持纵向模式。
    • 将屏幕亮度降至最低(减少热量和电源使用)
    • 静音音量(可选)
    • 将手机设置为飞行模式并启用WiFi(可选,仅当未通过蜂窝连接进行测试时)
    • 如果在Android 5.0或更高版本(Lollipop)上停用与近期应用的标签集成
      • 打开Chrome的每个实例(stable,beta,dev)
      • 打开设置
      • “合并标签页和应用程序” - 关闭

        2.2 iOS (work in progress)

    • 越狱的设备(包括Cydia)
    • 安装OpenSSH
      • 在绑定的主机上创建ssh密钥并另存为~/.ssh/id_dsa_ios
      • 将ssh公钥添加到~/.ssh/authorized_keys
    • 安装tcpdump
    • 锁定设备旋转(如果需要)
    • 启用Web检查器(设置 - > Safari - >高级)
    • 用于设备管理的有用应用程序(来自cydia):
      • “veency” - VNC服务器远程触发滑动解锁,方便重新启动设备
      • “核心实用程序(Core Utilities)” - 包括检查存储使用的
      • “支持不支持的附件8” - 防止“此附件可能不支持”消息从间歇性出现(请确保在设置中启用它)

    三、准备主机

    Raspberry Pi设备是运行Android设备的主机。此处提供了描述如何配置它们的文档。

    • 安装NodeJS(shell -v从shell /命令行验证)
      • Ubuntu:sudo apt-get install nodejs然后sudo ln -s /usr/bin/nodejs /usr/sbin/node
      • Windows:安装Windows版本的node.js并将其添加到你的路径(作为安装选项或手动)
      • OSX:brew install node
    • 安装ImageMagick(屏幕截图和视频处理所必需的,从shell /命令行convert -version验证)
      • Ubuntu:sudo apt-get install imagemagick
      • Windows:安装Windows版本的ImageMagick并将其添加到您的路径(作为安装选项或手动)
      • OSX:brew install imagemagick
    • 安装ffmpeg与x264支持(视频处理所必需)
      • OSX:brew install ffmpeg
    • 安装python 2.7和支持库
      • 安装Pillow库:pip install pillow
      • 安装ujson(用于更快的跟踪解析):pip install ujson
    • 安装代理代码
      • 手动安装需要agent/js目录
      • 直接使用git(假设在~/wpt,但可以安装在任何地方):
        1. cd ~
        2. git clone http://github.com/WPO-Foundation/webpagetest.git wpt
    • 连接手机

    3.1 Android特定主机配置

    • 安装adb并确保它在你的路径(“adb设备”从shell /命令行来验证设备连接后)
      • Ubuntu:sudo apt-get install android-tools-adb
      • 否则,从Android SDK
    • 配置udev规则(仅限Linux)

    3.2 iOS特定主机配置(工作进行中)

    • 需要OSX Yosemite(10.10)或更高版本进行视频捕获
      • 截至目前,OSX只能从一个设备捕获视频。这就需要为每个iPhone使用专用的Mac,用于测试。
    • 需要在OSX上的XCode屏幕截图
      • 复制/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupportwpt/agent/js/lib/ios/DeviceSupport
      • 确保目录名称仅包含操作系统版本(无构建信息)
    • 安装libimobiledevice - brew install libimobiledevice
    • 安装ios_webkit_debug_proxy - brew install ios_webkit_debug_proxy

    四、连接并验证配置

    4.1 Android

    • 授权并验证与设备的adb连接
      • adb devices - 确保列出了设备(出现提示时,单击设备屏幕上的授权)
    • 验证根
      • adb shell su -c date
    • 验证网络是否已启动
      ```bash
      adb shell netcfg | grep wlan
      wlan0 UP 1.2.3.4/26 0x00001043 ac:47:e8:4b:3a:81

    adb shell ping yahoo.com

    1. + 验证Chrome是否正常运行
    2. ```bash
    3. adb shell am start \
    4. -n com.android.chrome/com.google.android.apps.chrome.Main \
    5. -d http://yahoo.com

    五、在WPT服务器上配置locations.ini

    修改WPT服务器设置以添加测试位置和浏览器,例如:

    1. Test location: Example
    2. Browser: Nexus4 - Chrome

    通过编辑settings/locations.ini

    1. [locations]
    2. 1=Example
    3. [Example]
    4. 1=Example_Nexus4
    5. label="Example"
    6. [Example_Nexus4]
    7. browser=Nexus4 - Chrome,Nexus4 - Chrome Beta
    8. label="Nexus 4"
    9. type=nodejs,mobile
    10. connectivity="WiFi"

    要使用Play商店中的Chrome和Chrome测试版,浏览器名称需要分别以“ - Chrome”和“ - Chrome测试版”结尾。

    六、启动代理

    启动代理:

    1. cd ~/wpt/agent/js
    2. ./wptdriver.sh \
    3. -m debug \
    4. --browser android:0088a434deadbeef \
    5. --serverUrl example.com \
    6. --location Example_Nexus4 \
    7. --processvideo yes

    它应该打印:

    1. NODE_PATH=...
    2. node src/agent_main ...
    3. I 0913Z22:06:45.073 wpt_client.js:293 Client.requestNextJob_ : \
    4. Get work: http://example.com/work/getwork.php?location= Example_Nexus4&pc=0088a434deadbeef&f=json
    5. .....

    它将每10秒轮询上述URL。
    要可选地保持代理运行,如果/当你注销,请包装上述命令为:

    1. nohup ... &>0088a434deadbeef.log &

    (可选)指定特定的Chrome浏览器包:

    1. --chromePackage com.android.chrome

    其他可用的命令行选项:

    1. --alive <name> // Touch a <name>.alive file while running (集成 adbwatch.exe,用于重新启动死了的代理程序)
    2. --apiKey <key> // 轮询工作时使用指定的api key
    3. --checknet yes // 在轮询工作之前检查IP地址的有效性
    4. --chromePackage com.android.chrome // 指定一个浏览器包
    5. --maxtemp <temp> // 最大允许电池温度 - 即最大温度36.8
    6. --name <friendly name> // 使用指定的友好的设备名称进行报告,而不是设备ID
    7. --processvideo yes // 在本地进行视频捕获,而不是在服务器上进行。 需要python 2.7的路径和visualmetrics.py在代理目录(运行“python visualmetrics.py -c”来验证配置)
    8. --rotate <degrees> // 旋转屏幕截图(适用于景观测试)
    9. --tcpdumpBinary <path> // 要在代理上动态安装tcpdumparm构建路径
    10. --trafficShaper <info> // 请参阅“流量整形”
    11. --exitTests <test count> // 运行指定数量的测试后退出(有助于控制节点的内存使用)

    七、高级功能

    7.1 WebDriver脚本

    在桌面浏览器上,将作业提交到http://example.com,例如:
    Advanced Settings > Script > Enter Script:

    1. driver = new webdriver.Builder().build();
    2. driver.get('http://www.google.com');
    3. driver.findElement(webdriver.By.name('q')).sendKeys('webdriver');
    4. driver.findElement(webdriver.By.name('btnG')).click();
    5. driver.wait(function() {
    6. return driver.getTitle();
    7. })

    7.2 Android tcpdump

    • 从omappedia.org下载一个预编译的tcpdump二进制文件。
    • Gunzip并将二进制文件复制到~/wpt/lib/tcpdump
    • 重新运行wptdriver.sh与其他args:--tcpdumpBinary ~/wpt/lib/tcpdump
    • 当你提交作业时,通过以下方式启用tcpdump:
      • Advanced Settings > Advanced > Capture network packet trace (tcpdump)
    • 验证代理是否上传pcap。

    7.3 流量整形

    设备流量整形:

    • 例如 Android tc(需要在设备上/proc/net/psched/system/bin/tc)。
    • 可能通过以下“trafficShaper”脚本方法实现。
      最简单的配置是假设所有流量都通过桌面,例如:
    • 将另一个以太网卡添加到您的桌面。
    • 将WiFi接入点连接到此附加卡。
    • 验证Linux启用IP转发(操作方法)
    • 将您的移动设备配置为使用WiFi接入点。
    • 验证你设备的WiFi流量是否通过您的桌面路由(通过tcpdump或wireshark)
      如果流量未通过你的桌面路由,请创建本地trafficShaper脚本(例如)使用无密码ssh配置远程交换机。
      issue/147 添加了对用户定义的trafficShaper脚本的支持:
    • 创建流量整形师脚本,例如 ~/wpt/shaper
    • 运行./wptdriver.sh--trafficShaper ~/wpt/shaper和可选的--trafficShaperArg anyString(例如foo1.2.3.4)。
    • 修改WPT服务器的设置/locations.ini以删除connectivity =行(允许作业选项)。
    • 提交作业,Advanced Settings > Connection设置为(例如)“56K拨号”,服务器的connectivity.ini定义为:
      1. label="56K Dial-Up (49/30 Kbps 120ms RTT)"
      2. bwIn=49000
      3. bwOut=30000
      4. latency=120
      5. plr=0
      Before each run, the agent should call:
      1. ~/wpt/shaper -s 0088a434deadbeef start --arg foo1.2.3.4 --bwIn 49 --bwOut 30 --latency 120
      where “0” values are not passed (e.g. the above plr=0)
      The agent will check the script’s stdout for an optional line matching “stop=VALUE” (e.g. “stop=bar42”).
      Verify that pages load slowly due to your traffic shaper.
      After each run, the agent should call:
      1. ~/wpt/shaper -s 0088a434deadbeef stop --arg bar42

    粗糙ipfw注意:

    • 安装ipfw3,sudo chmod 7755 /sbin/ipfw,验证ipfw3列表打印65535 allow ip from any to any
    • adb shell netcfg | grep wlan(例如1.2.3.4),运行./wptdriver.sh--deviceAddr 1.2.3.4
    • 修改WPT服务器的设置/locations.ini以删除connectivity =行。
    • 通过Advanced Settings > Connection设置为(例如)“56K拨号”提交作业。
    • 验证代理打印预期的ipfw命令(例如ipfw add ...ipfw pipe ...
    • 验证页面由于流量整形而缓慢加载。

    7.4 视频捕获(非Android)

    粗糙笔记:

    • 创建捕获脚本,例如 ~/wpt/video/capture
    • 使用--captureDir ~/wpt/video和可选的--videoCard anyString运行./wptdriver.sh(例如将卡名传递给脚本)。
    • 代理将调用

      1. ~/wpt/video/capture -f pid_video.avi -s 0088a434deadbeef -t mako -d anyString -w
    • 其中mako是Nexus4的adb shell getprop ro.product.device代号。

    • 当代理想要停止捕获时,它会杀死上面的进程,然后阅读pid_video.avi

    7.5 按每个设备用户运行

    主要用于杀死任何僵尸进程,例如。 剩余视频捕获。
    粗糙笔记:

    • 为此设备创建用户,例如通过:

      1. sudo useradd -d /home/0088a434deadbeef -m 0088a434deadbeef
    • 切换到此用户(可选择通过/etc/sudoers.d/wpt文件和sudo -u

    • 运行./wptdriver.sh--killall 1
    • 代理将killall -9所有由其用户拥有的pids,除了它自己的pid。 这个killall确保在作业之间没有僵尸进程,但是注意它也会杀死任何登录shell,所以确保使用nohup运行!