代理安装

一、要求

  你需要一个主机来运行代理。我们为每个设备创建一个代理。主机可以运行多个代理。
  任何支持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

  • 根设备(首先执行此操作,因为它会清除所有设置)
  • 进入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运行!