简体   繁体   English

如何在Python上使用selenium webdriver和browsermob代理捕获网络流量?

[英]How to capture network traffic using selenium webdriver and browsermob proxy on Python?

I would like to capture network traffic by using Selenium Webdriver on Python. 我想通过在Python上使用Selenium Webdriver来捕获网络流量。 Therefore, I must use a proxy (like BrowserMobProxy) 因此,我必须使用代理(如BrowserMobProxy)

When I use webdriver.Chrome: 当我使用webdriver.Chrome时:

from browsermobproxy import Server

server = Server("~/browsermob-proxy")

server.start()
proxy = server.create_proxy()

from selenium import webdriver
co = webdriver.ChromeOptions()
co.add_argument('--proxy-server={host}:{port}'.format(host='localhost', port=proxy.port))

driver = webdriver.Chrome(executable_path = "~/chromedriver", chrome_options=co)

proxy.new_har
driver.get(url)
proxy.har # returns a HAR 

for ent in proxy.har['log']['entries']:
    print ent['request']['url']

the webpage is loaded properly and all requests are available and accessible in the HAR file. 网页已正确加载,所有请求都可在HAR文件中访问和访问。 But when I use webdriver.Firefox: 但是当我使用webdriver.Firefox时:

# The same as above
# ...
from selenium import webdriver
profile  = webdriver.FirefoxProfile()
driver = webdriver.Firefox(firefox_profile=profile, proxy = proxy.selenium_proxy())

proxy.new_har
driver.get(url)
proxy.har # returns a HAR

for ent in proxy.har['log']['entries']:
    print ent['request']['url']

The webpage cannot be loaded properly and the number of requests in the HAR file is smaller than the number of requests that should be. 无法正确加载网页,并且HAR文件中的请求数小于应该的请求数。

Do you have any idea what the problem of proxy settings in the second code? 你知道第二个代码中的代理设置有什么问题吗? How should I fix it to use webdriver.Firefox properly for my purpose? 我应该如何修复它以正确使用webdriver.Firefox?

Just stumbled across this project https://github.com/derekargueta/selenium-profiler . 偶然发现了这个项目https://github.com/derekargueta/selenium-profiler Spits out all network data for a URL. 吐出URL的所有网络数据。 Shouldn't be hard to hack and integrate into whatever tests you're running. 不应该很难入侵并集成到您正在运行的任何测试中。

Original source: https://www.openhub.net/p/selenium-profiler 原始来源: https//www.openhub.net/p/selenium-profiler

For me, following code component works just fine. 对我来说,以下代码组件工作正常。

profile = webdriver.FirefoxProfile()
profile.set_proxy(proxy.selenium_proxy())
driver = webdriver.Firefox(firefox_profile=profile)
I am sharing my solution, this would not write any logs to any file
but you can collect all sort of messages such as Errors, 
Warnings, Logs, Info, Debug , CSS, XHR as well as Requests(traffic)

1. We are going to create Firefox profile so that we can enable option of 
"Persist Logs" on Firefox (you can try it to enable on your default browser and see 
if it launches with "Persist Logs" without creating firefox profile )

2. we need to modify the Firefox initialize code 
where this line will do magic : options.AddArgument("--jsconsole");

so complete Selenium Firefox code would be,  this will open Browser Console
everytime you execute your automation :

 else if (browser.Equals(Constant.Firefox))
            {

                var profileManager = new FirefoxProfileManager();
                FirefoxProfile profile = profileManager.GetProfile("ConsoleLogs");
                FirefoxDriverService service = FirefoxDriverService.CreateDefaultService(DrivePath);
                service.FirefoxBinaryPath = DrivePath;                
                profile.SetPreference("security.sandbox.content.level", 5);
                profile.SetPreference("dom.webnotifications.enabled", false);
                profile.AcceptUntrustedCertificates = true;
                FirefoxOptions options = new FirefoxOptions();
                options.AddArgument("--jsconsole");
                options.AcceptInsecureCertificates = true;
                options.Profile = profile;
                options.SetPreference("browser.popups.showPopupBlocker", false);
                driver = new FirefoxDriver(service.FirefoxBinaryPath, options, TimeSpan.FromSeconds(100));
                driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);               

            }

3. Now you can write your logic since you have traffic/ logging window open so don't 
go to next execution if test fails. That way Browser Console will keep your errors 
messages and help you to troubleshoot further 

Browser : Firefox  v 61 

How can you launch Browser Console for firefox:
1. open firefox (and give any URL )
2. Press Ctrl+Shift+J (or Cmd+Shift+J on a Mac) 

Link : https://developer.mozilla.org/en-US/docs/Tools/Browser_Console  

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM