硒获取 .har 文件



我有一个两页的应用程序:
/登录
/轮廓
我想获取 .har 文件页面/配置文件
当我转到页面/login 时,cookie 是使用 key=connect.sid 和值 ="示例值"创建的。此 Cookie 尚未激活。我添加了带有活动 connect.sid 的 cookie。

WebDriver webDriver = getDriver();
webDriver.get(LOGIN_PAGE);
webDriver.manage().addCookie(connectsSId);

它不起作用,因为在加载页面之后,/login 装箱了一个新的 cookie。我也尝试了这段代码:

WebDriver webDriver = getDriver();
webDriver.get(PROFILE_PAGE);
webDriver.manage().deleteAllCookies();
webDriver.manage().addCookie(connectsSId);

这是行不通的。 添加了饼干,但似乎为时已晚。

 WebDriver webDriver = getDriver();
 LoginPage loginPage = new LoginPage(getDriver());
 LandingPage landingPage = loginPage.login();
 landingPage.openProfilePage();

此代码为页面 /login 创建了一个 .har 文件。
出于某种原因,仅在第一次调用页面后创建该文件。我无法解决这个问题。

将 PhantomJS 与 BrowserMobProxy 一起使用。PhantomJS帮助我们实现JavaScript启用页面。以下代码也适用于 HTTPS 网址。

"phantomjs.exe"放在C盘中,你会得到C盘本身的"HAR-Information.har"文件。

确保不要在网址末尾放置' /',例如

driver.get("https://www.google.co.in/")

它应该是

driver.get("https://www.google.co.in");

否则,它将不起作用。

package makemyhar;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import net.lightbody.bmp.BrowserMobProxy;
import net.lightbody.bmp.BrowserMobProxyServer;
import net.lightbody.bmp.core.har.Har;
import net.lightbody.bmp.proxy.CaptureType;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
public class MakeMyHAR {
    public static void main(String[] args) throws IOException, InterruptedException {
        //BrowserMobProxy
        BrowserMobProxy server = new BrowserMobProxyServer();
        server.start(0);
        server.setHarCaptureTypes(CaptureType.getAllContentCaptureTypes());
        server.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
        server.newHar("Google");
        //PHANTOMJS_CLI_ARGS
        ArrayList<String> cliArgsCap = new ArrayList<>();
        cliArgsCap.add("--proxy=localhost:"+server.getPort());
        cliArgsCap.add("--ignore-ssl-errors=yes");
        //DesiredCapabilities
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
        capabilities.setCapability(CapabilityType.SUPPORTS_JAVASCRIPT, true);
        capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgsCap);
        capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,"C:\phantomjs.exe");
        //WebDriver
        WebDriver driver = new PhantomJSDriver(capabilities);
        driver.get("https://www.google.co.in");
        //HAR
        Har har = server.getHar();
        FileOutputStream fos = new FileOutputStream("C:\HAR-Information.har");
        har.writeTo(fos);
        server.stop();
        driver.close();
    }
}

在硒代码中设置首选项:

    profile.setPreference("devtools.netmonitor.har.enableAutoExportToFile", true);
profile.setPreference("devtools.netmonitor.har.defaultLogDir", String.valueOf(dir));
profile.setPreference("devtools.netmonitor.har.defaultFileName", "network-log-file-%Y-%m-%d-%H-%M-%S");

并打开控制台:

Actions keyAction = new Actions(driver);
keyAction.keyDown(Keys.LEFT_CONTROL).keyDown(Keys.LEFT_SHIFT).sendKeys("q").keyUp(Keys.LEFT_CONTROL).keyUp(Keys.LEFT_SHIFT).perform();

您可以使用 browsermob 代理来捕获所有请求和响应数据看这里

我也

尝试使用像browsermob代理这样的代理来获取har

文件

我做了很多研究,因为我收到的文件总是空的。

我所做的是启用浏览器性能日志。

请注意,这仅适用于 chrome 驱动程序。

这是我的驱动程序类(在python中)

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium import webdriver
from lib.config import config

class Driver:
    global performance_log
    capabilities = DesiredCapabilities.CHROME
    capabilities['loggingPrefs'] = {'performance': 'ALL'}
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument("--headless")
    mobile_emulation = {"deviceName": "Nexus 5"}
    if config.Env().is_mobile():
        chrome_options.add_experimental_option(
            "mobileEmulation", mobile_emulation)
    else:
        pass
    chrome_options.add_experimental_option(
        'perfLoggingPrefs', {"enablePage": True})
    def __init__(self):
        self.instance = webdriver.Chrome(
            executable_path='/usr/local/bin/chromedriver', options=self.chrome_options)
    def navigate(self, url):
        if isinstance(url, str):
            self.instance.get(url)
            self.performance_log = self.instance.get_log('performance')
        else:
            raise TypeError("URL must be a string.")

在输出中找到的信息量很大,因此您必须过滤原始数据并仅接收网络并发送对象。

import json
import secrets

def digest_log_data(performance_log):
    # write all raw data in a file
    with open('data.json', 'w', encoding='utf-8') as outfile:
        json.dump(performance_log, outfile)
    # open the file and real it with encoding='utf-8'
    with open('data.json', encoding='utf-8') as data_file:
        data = json.loads(data_file.read())
        return data

def digest_raw_data(data, mongo_object={}):
    for idx, val in enumerate(data):
        data_object = json.loads(data[idx]['message'])
        if (data_object['message']['method'] == 'Network.responseReceived') or (data_object['message']['method'] == 'Network.requestWillBeSent'):
            mongo_object[secrets.token_hex(30)] = data_object
        else:
            pass

我们选择将这些数据推送到 mongo 数据库中,稍后将由 etl 进行分析并推送到 redshift 数据库中以创建统计信息。

我希望这就是你要找的。

我运行脚本的方式是:

import codecs
from pprint import pprint
import urllib
from lib import mongo_client
from lib.test_data import test_data as data
from jsonpath_ng.ext import parse
from IPython import embed
from lib.output_data import process_output_data as output_data
from lib.config import config
from lib import driver
browser = driver.Driver()
# get the list of urls which we need to navigate
urls = data.url_list()
for url in urls:
    browser.navigate(config.Env().base_url() + url)
    print('Visiting ' + url)
    # get performance log
    performance_log = browser.performance_log
    # digest the performace log
    data = output_data.digest_log_data(performance_log)
    # initiate an empty dict
    mongo_object = {}
    # prepare the data for the mongo document
    output_data.digest_raw_data(data, mongo_object)
    # load data into the mongo db
    mongo_client.populate_mongo(mongo_object)

browser.instance.quit()

我的主要来源是这个,我已经根据自己的需要对其进行了调整。https://www.reddit.com/r/Python/comments/97m9iq/headless_browsers_export_to_har/谢谢

你可以

用最简单的方式做到这一点 Selenide + Java + JS在类中导入 java.nio.file.Files 和 java.nio.file.Path然后创建函数:

public static void getHar() {
open("http://you-task.com");
String scriptGetInfo = "performance.setResourceTimingBufferSize(1000000);" +
                              "return performance.getEntriesByType('resource').map(JSON.stringify).join('\n')";
String har = executeJavaScript(scriptGetInfo);
Files.write(Paths.get("log.har"), har.getBytes());
}

它将您的log.har保存在项目的根目录中。只需在要保存har文件的位置调用此函数即可

相关内容

  • 没有找到相关文章

最新更新