2014-09-25 255 views
3

目標: 我想通過BrowserMob-Proxy運行Selenium Python腳本,它將捕獲並輸出HAR文件捕獲。無法通過BrowserMob-Proxy使用Python Selenium Script捕獲HAR

問題: 我有一個功能(非常基本的)Python腳本(如下所示)。當它被改變爲利用BrowserMob-Proxy來捕獲HAR時,它會失敗。下面我提供兩種不同的腳本,但都出於不同的原因(細節在代碼片段之後提供)。

BrowserMob-Proxy說明: 如前所述,我同時使用0.6.0和2.0-beta-8。其原因是A)LightBody(BMP的首席設計師)最近表示,他最新的版本(2.0-beta-9)不起作用,建議用戶使用2.0-beta-8,並且B)從我所能通過閱讀各種網站/ stackoverflow信息告訴我們,0.6.0(通過PIP獲取)用於調用Client.py/Server.py,而2.0-beta-8用於啓動服務器。說實話,這讓我困惑。但是,當導入BMP的服務器時,它需要一個批處理(.bat)文件來啓動服務器,該服務器在0.6.0中沒有提供,但是使用2.0-beta-8 ...如果任何人都可以在這方面混亂(我懷疑這是我下面描述的問題的根源),那麼我會非常感激。

軟件規格:

  • 操作系統:Windows 7中(64倍) - 在VirtualBox中運行
  • 瀏覽器:Firefox(32.0.2)
  • 腳本語言:Python的(2.7.8 )
  • 自動化網絡瀏覽器:硒(2.43.0) - 經由PIP
  • BrowserMob-代理安裝:0.6.0和2.0-β-8 - 見下文
  • 解釋

硒腳本(這個腳本作品):

"""This script utilizes Selenium to obtain the Google homepage""" 
from selenium import webdriver 

driver = webdriver.Firefox()  # Opens FireFox browser. 
driver.get('https://google.com/') # Gets google.com and loads page in browser. 

driver.quit()      # Closes Firefox browser 

該腳本成功地運行,不會產生任何錯誤。它是爲了說明目的而提供的,以便在添加BMP邏輯之前表明它可以工作

腳本ALPHA與BMP(不工作):

"""Using the same functional Selenium script, produce ALPHA_HAR.har output""" 
from browsermobproxy import Server 
server = Server('C:\Users\Matt\Desktop\\browsermob-proxy-2.0-beta-8\\bin\\browsermob-proxy') 
server.start() 
proxy = server.create_proxy() 

from selenium import webdriver 
driver = webdriver.Firefox()   # Opens FireFox browser. 

proxy.new_har("ALPHA_HAR")    # Creates a new HAR 
driver.get("https://www.google.com/") # Gets google.com and loads page in browser. 
proxy.har        # Returns a HAR JSON blob 

server.stop() 

此代碼將在運行該腳本成功,不會產生任何錯誤。但是,當搜索整個硬盤驅動器時,我從未成功找到ALPHA_HAR.har。

腳本BETA與BMP(不工作):

"""Using the same functional Selenium script, produce BETA_HAR.har output""" 
from browsermobproxy import Server 
server = Server("C:\Users\Matt\Desktop\\browsermob-proxy-2.0-beta-8\\bin\\browsermob-proxy") 
server.start()  
proxy = server.create_proxy() 

from selenium import webdriver 
profile = webdriver.FirefoxProfile() 
profile.set_proxy(proxy.selenium_proxy()) 
driver = webdriver.Firefox(firefox_profile=profile) 

proxy.new_har("BETA_HAR")    # Creates a new HAR 
driver.get("https://www.google.com/") # Gets google.com and loads page in browser. 
proxy.har        # Returns a HAR JSON blob 

server.stop() 

此代碼是從http://browsermob-proxy-py.readthedocs.org/en/latest/拍攝。運行上面的代碼時,FireFox將嘗試訪問google.com,但永遠不會成功加載該頁面。最終它會超時而不會產生任何錯誤。我的硬盤上找不到BETA_HAR.har。我也注意到,當試圖使用這個瀏覽器訪問任何其他網站時,它同樣會無法加載(我懷疑這是由於代理沒有正確配置)。

回答

2

我用phantomJS,這裏是如何與Python使用它的一個例子:

import browsermobproxy as mob 
import json 
from selenium import webdriver 
BROWSERMOB_PROXY_PATH = '/usr/share/browsermob/bin/browsermob-proxy' 
url = 'http://google.com' 

s = mob.Server(BROWSERMOB_PROXY_PATH) 
s.start() 
proxy = s.create_proxy() 
proxy_address = "--proxy=127.0.0.1:%s" % proxy.port 
service_args = [ proxy_address, '--ignore-ssl-errors=yes', ] #so that i can do https connections 
driver = webdriver.PhantomJS(service_args=service_args) 
driver.set_window_size(1400, 1050) 
proxy.new_har(url) 
driver.get(url) 
har_data = json.dumps(proxy.har, indent=4) 
screenshot = driver.get_screenshot_as_png() 
imgname = "google.png" 
harname = "google.har" 
save_img = open(imgname, 'a') 
save_img.write(screenshot) 
save_img.close() 
save_har = open(harname, 'a') 
save_har.write(har_data) 
save_har.close() 
driver.quit() 
s.stop() 
0

當你這樣做:

proxy.har 

你需要解析響應,proxy.har是JSON對象,所以如果你需要生成一個文件,你需要這樣做:

myFile = open('BETA_HAR.har','w') 
myFile.write(str(proxy.har)) 
myFile.close() 

然後你會發現你的.har

2

試試這個:

from browsermobproxy import Server 
from selenium import webdriver 
import json 

server = Server("path/to/browsermob-proxy") 
server.start() 
proxy = server.create_proxy() 
profile = webdriver.FirefoxProfile() 
profile.set_proxy(self.proxy.selenium_proxy()) 
driver = webdriver.Firefox(firefox_profile=profile) 
proxy.new_har("http://stackoverflow.com", options={'captureHeaders': True}) 
driver.get("http://stackoverflow.com")  
result = json.dumps(proxy.har, ensure_ascii=False) 
print result 
proxy.stop()  
driver.quit() 
+0

我得到下面的錯誤。 raceback(最新最後調用): 文件 「E:sample.py」,10號線,在 profile.set_proxy(self.proxy.selenium_proxy()) NameError:名字 '自我' 是沒有定義 – 2016-05-10 06:08:06