簡體   English   中英

使用 selenium 遠程驅動程序捕獲網絡流量

[英]Capture network traffic using selenium Remote Driver

我正在嘗試使用 selenium 遠程驅動程序捕獲網絡流量,但面臨以下問題。

Exception in thread "main" org.openqa.selenium.InvalidArgumentException: invalid argument: log type 'performance' not found
  (Session info: chrome=92.0.4515.107)
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'UKC-DSEV023991', ip: '10.4.122.233', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_281'
Driver info: org.openqa.selenium.remote.RemoteWebDriver
Capabilities {acceptInsecureCerts: false, agentName: specsavers-selmac-phy-mojave, browserName: chrome, browserVersion: 92.0.4515.107, chrome: {chromedriverVersion: 92.0.4515.107 (87a818b10553..., userDataDir: /var/folders/q6/z0v80h3n3yl...}, goog:chromeOptions: {debuggerAddress: localhost:63780}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: MAC, platformName: MAC, proxy: Proxy(), reportUrl: https://specsavers.experite..., sessionId: d6c71d2bd848bb2439417b0f5e4..., setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, viewUrl: https://specsavers.experite..., webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true, webdriver.remote.sessionid: d6c71d2bd848bb2439417b0f5e4...}
Session ID: d6c71d2bd848bb2439417b0f5e49c3f3
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

代碼:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import net.serenitybdd.core.annotations.findby.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.logging.LogEntries;
import org.openqa.selenium.logging.LogEntry;
import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.logging.LoggingPreferences;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;

public class Test {


    public static void main(String args[]) throws Exception {
        WebDriver driver;
        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
       
        capabilities.setCapability(CapabilityType.BROWSER_VERSION, "92");
        capabilities.setCapability(ChromeOptions.CAPABILITY, capabilities);
        LoggingPreferences logPrefs = new LoggingPreferences();
        logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
        capabilities.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);

        driver = new RemoteWebDriver(new URL("https://XXXX/wd/hub"), capabilities);

        System.out.println("Got the driver " + driver.getCurrentUrl());
        driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);


        driver.get("http://google.com");
        Thread.sleep(2000);
        driver.findElement(By.xpath("//*[text()='I agree']")).click();
      /*  WebElement agree = driver.findElement(By.id("introAgreeButton"));
        agree.click();*/

        WebElement element = driver.findElement(By.name("q"));
        element.sendKeys("Cheese!"); // search for this string in log output
        element.submit();
        Thread.sleep(2000);

        LogEntries les = driver.manage().logs().get(LogType.PERFORMANCE);

        File fout = new File("network.log");
        FileOutputStream fos = new FileOutputStream(fout);

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));

        for (LogEntry le : les) {
            Gson gson = new GsonBuilder().setPrettyPrinting().create();
            JsonParser jp = new JsonParser();
            JsonElement je = jp.parse(le.getMessage());
            String prettyJsonString = gson.toJson(je);

            bw.write(prettyJsonString);
            bw.newLine();
        }

        bw.close();

        System.out.println("Test complete. please close browser and find network logs under <PROJECT-FOLDER>/network.log file");
    }
}

Chrome 在 75+ 版本中更改了日志記錄的工作方式。 由於 ChromeDriver 現在默認在 W3C 標准兼容模式下運行,因此更改破壞了以下內容。

capabilities.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);

因此,根據 W3C 標准的要求,chromedriver 的部分更改是將功能“loggingPrefs”重命名為“goog:loggingPrefs”。 這打破了我們為 Chrome 瀏覽器設置 Selenium 3.141.59 功能的方式。 這已在 Selenium 4.0.0 版中得到修復。

有 2 個選項,遷移到 Selenium 4.0.0 或暫時使用以下解決方法之一:

options.setCapability("goog:loggingPrefs", logPrefs);

capabilities.setCapability("goog:loggingPrefs", logPrefs);

如果您確實遷移到 Selenium 4,請注意選項已取代功能,現在將是:

options.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM