性能日志
ChromeDriver支持性能日志記錄,您可以從中獲取域“時間軸”,“網絡”和“頁面”的事件,以及指定跟蹤類別的
跟蹤數據
。
啟用性能日志默認情況下不啟用性能日志記錄。因此,在創建新會話時,您必須啟用它。DesiredCapabilities cap = DesiredCapabilities.chrome();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
RemoteWebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"), cap);
啟用后,性能日志將收集時間軸,網絡和頁面事件。要同時啟用跟蹤或自定義性能日志記錄,請參閱以下部分。使用默認選項 查看 性能日志記錄 的完整示例(信用:Michael Klepikov)。
Angular Benchpress
還使用性能記錄。
跟蹤和自定義日志記錄如果您希望自定義性能日志記錄,例如啟用跟蹤,則可以使用 perfLoggingPrefs功能 (通過 ChromeOptions )。可以通過指定一個或多個Chrome跟蹤類別來啟用跟蹤。有關Chrome跟蹤的詳細信息,請參閱 此處 。啟用跟蹤時,將隱式禁用時間軸域。請注意,您仍需要使用 loggingPrefs 功能啟用性能日志。 DesiredCapabilities cap = DesiredCapabilities.chrome();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
Map<String, Object> perfLogPrefs = new HashMap<String, Object>();
perfLogPrefs.put("traceCategories", "browser,devtools.timeline,devtools"); // comma-separated trace categories
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("perfLoggingPrefs", perfLogPrefs);
caps.setCapability(ChromeOptions.CAPABILITY, options);
RemoteWebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"), cap);
您還可以使用 perfLoggingPrefs單獨 啟用或禁用網絡和頁面域。例如,您可以在跟蹤時顯式啟用網絡域: ...
Map<String, Object> perfLogPrefs = new HashMap<String, Object>();
perfLogPrefs.put("traceCategories", "browser,devtools.timeline,devtools");
perfLogPrefs.put("enableNetwork", true);
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("perfLoggingPrefs", perfLogPrefs);
caps.setCapability(ChromeOptions.CAPABILITY, options);
...
關於跟蹤的說明如果啟用了跟蹤功能,ChromeDriver會在啟動Chrome時啟動瀏覽器范圍的跟蹤,並會繼續跟蹤,直到Chrome關閉。當跟蹤正在運行時,Chrome會緩沖內存中的跟蹤事件,直到跟蹤停止為止。跟蹤緩沖區已滿后,將不再記錄跟蹤事件。為避免完整緩沖區(從而丟失跟蹤數據),ChromeDriver將定期停止當前跟蹤,收集緩沖事件,並在測試期間的某些點重新開始跟蹤。收集跟蹤事件會增加測試開銷,因此ChromeDriver僅在測試期間的適當點收集跟蹤事件。目前,僅在頁面導航事件以及請求任何ChromeDriver日志(例如性能日志)時收集跟蹤事件。緩沖區仍有可能仍然填充,因此ChromeDriver會監控支持的Chrome版本(r263512及更高版本)的緩沖區使用情況。如果緩沖區填滿,ChromeDriver將記錄警告並將性能日志中的條目添加,如下所述。 收集日志條目在測試中,您可以獲得如下的性能日志條目。有關更多信息,請參閱 WebDriver日志記錄文檔 。for (LogEntry entry : driver.manage().logs().get(LogType.PERFORMANCE)) {
System.out.println(entry.toString());
}
每個條目都是以下結構的JSON字符串: {
"webview": <originating WebView ID>,
"message": { "method": "...", "params": { ... }} // DevTools message.
}
該 方法 的值是DevTools事件的方法(參見 Chrome遠程調試協議文檔 )。例如,Timeline事件將為協議的所有版本提供Timeline.eventRecorded 方法 ,包括1.1版本(編寫本文時的最新版本)。 跟蹤日志條目從版本1.1開始,跟蹤不是已發布的DevTools協議的一部分,因此詳細信息如下。由於事件是在瀏覽器范圍內收集的,因此所有跟蹤事件的 webview 值都將為“瀏覽器”。
有兩種可能的跟蹤事件方法:
{
"webview":"browser",
"message":{
"method":"Tracing.dataCollected",
"params":{
"args":{"layerTreeId":1},
"cat":"cc,devtools",
"name":"DrawFrame",
"ph":"i",
"pid":11405,
"s":"t",
"tid":11405,
"ts":3846117219.0,
"tts":1134680
}
}
}
在Chrome初始化里面加載如下:
if(sandBoxMode!=0){ ChromeOptions options = new ChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); Map<String, Object> perfLogPrefs = new HashMap<String, Object>(); perfLogPrefs.put("traceCategories", "browser,devtools.timeline,devtools"); // comma-separated trace categories options.setExperimentalOption("perfLoggingPrefs", perfLogPrefs); options.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); options.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); options.addArguments("lang=zh_CN.UTF-8"); options.addArguments("use-fake-ui-for-media-stream"); options.addArguments("disable-popup-blocking"); options.addArguments("--start-maximized");//設置窗口最大化 新API // options.addArguments("--headless"); options.addArguments("--no-sandbox"); options.addArguments("--disable-gpu"); options.addArguments("--disable-browser-side-navigation"); options.addArguments("--dns-prefetch-disable"); ChromeOptions capabilities = new ChromeOptions(); capabilities.setCapability(ChromeOptions.CAPABILITY, options); capabilities.setCapability(CapabilityType.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(capabilities); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.manage().timeouts().pageLoadTimeout(80, TimeUnit.SECONDS); driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS); Log.info("Chrome browser started"); Constants.sResult="PASS";
}else if(sandBoxMode==0){
![]() ![]() if(sandBoxMode!=0){ ChromeOptions options = new ChromeOptions(); LoggingPreferences logPrefs = new LoggingPreferences(); logPrefs.enable(LogType.PERFORMANCE, Level.ALL); Map<String, Object> perfLogPrefs = new HashMap<String, Object>(); perfLogPrefs.put("traceCategories", "browser,devtools.timeline,devtools"); // comma-separated trace categories options.setExperimentalOption("perfLoggingPrefs", perfLogPrefs); options.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT); options.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); options.addArguments("lang=zh_CN.UTF-8"); options.addArguments("use-fake-ui-for-media-stream"); options.addArguments("disable-popup-blocking"); options.addArguments("--start-maximized");//設置窗口最大化 新API // options.addArguments("--headless"); options.addArguments("--no-sandbox"); options.addArguments("--disable-gpu"); options.addArguments("--disable-browser-side-navigation"); options.addArguments("--dns-prefetch-disable"); ChromeOptions capabilities = new ChromeOptions(); capabilities.setCapability(ChromeOptions.CAPABILITY, options); capabilities.setCapability(CapabilityType.LOGGING_PREFS, logPrefs); driver = new ChromeDriver(capabilities); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.manage().timeouts().pageLoadTimeout(80, TimeUnit.SECONDS); driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS); Log.info("Chrome browser started"); Constants.sResult="PASS"; }else if(sandBoxMode==0){
調用方法如下: LogEntries logEntries = driver.manage().logs().get(LogType.PERFORMANCE); for (LogEntry entry : logEntries) { System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " ======" + entry.getMessage()); System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel().INFO + " INFO======== " + entry.getMessage()); System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel().ALL + " ALL ======== " + entry.getMessage()); System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel().SEVERE + " SEVERE ======== " + entry.getMessage()); System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel().WARNING + " WARNING ======== " + entry.getMessage()); //do something useful with the data }
可以參考 |