9

如何使用 PhantomJS 通过 Webdriver 记录页面加载的所有 HTTP 请求和响应?我正在使用 python,我的超级简单测试脚本如下所示:

from selenium import webdriver

driver = webdriver.PhantomJS()
driver.get('http://www.golem.de')

我已经在 PhantomJS 中找到了这些功能:

page.onResourceRequested = function (request) {
    console.log('Request ' + JSON.stringify(request, undefined, 4));
};

但我不知道如何将它与 Selenium Webdriver 分别与 Ghostdriver 结合在一起。我怎么能这样做?

4

3 回答 3

2

另一种一般的低级方式,但比straceis略高一些tcpdump。您可以过滤到服务器应用程序的特定侦听端口范围和目标主机。如果需要,您还可以记录数据包以供以后分析。使用-A( ASCII ) 转储选项,您可以过滤对给定页面的请求。在端口 80 上请求 localhost 的简单示例:

tcpdump -i lo -A -nn dst port 80 and dst host `hostname`

我确信 Wireshark 或类似软件也可以进行这种类型的协议特定过滤。

于 2014-06-08T01:07:18.813 回答
2

记录所有网络流量的一种方法是使用奇妙的工具strace,将所有网络请求(和数据)记录到文件中。

strace -s9999 -e trace=network curl http://example.com > /dev/null

部分输出:

sendto(3, "GET / HTTP/1.1\r\nUser-Agent: curl/7.32.0\r\nHost: example.com\r\nAccept: */*\r\n\r\n", 75, MSG_NOSIGNAL, NULL, 0) = 75
recvfrom(3, "HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nCache-Control: max-age=604800\r\nContent-Type: text/html\r\nDate: Sun, 08 Ju...
于 2014-06-02T19:33:04.453 回答
2

正如 Torben 所说, driver.get_log("har") 是一个解决方案,我认为这对我来说是一个最佳解决方案。

from selenium import webdriver

service_args = ['--ignore-ssl-errors=yes']
driver = webdriver.PhantomJS(service_args=service_args)
driver.get('https://www.google.com/')
screenshot = driver.get_screenshot_as_png()
imgname = "google.png"
save_img = open(imgname, 'a')
save_img.write(screenshot)
save_img.close()
print driver.get_log('har')
driver.quit()

其他解决方法可以参考: 1. browsermob-proxy, 2. 或者使用webdriver/firebug抓网(好像netexport不能被火狐验证,或许我们可以使用firebug本身,最新的firebug,它具有导出 har 的功能) 3. 与 2 相同,这里有另一个解决方案:如何在 webdriver 中捕获页面发出的所有请求?Browsermob有什么替代品吗?

于 2017-06-30T02:14:33.380 回答