[英]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.