使用Webdriver和PhantomJS记录HTTP流量

时间:2014-02-20 14:36:22

标签: python selenium-webdriver phantomjs ghostdriver

如何使用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结合在一起。 我怎么能这样做?

3 个答案:

答案 0 :(得分: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...

答案 1 :(得分:2)

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

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

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

答案 2 :(得分: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无法通过Firefox验证,也许我们可以使用firebug本身,对于最新的firebug,它具有导出har的功能) 3.与2相同,此处有另一种解决方案:How to capture all requests made by page in webdriver? Is there any alternative to Browsermob?