Jerry和您聊聊Chrome開發者工具

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

Chrome開發者工具是Jerry日常工作使用的三大調試器之一。雖然工具名稱前面帶了個"開發者", 但是它對非開發人員仍然有用。不信?

用Chrome打開我們常用的網站,按F12,在Console標簽頁里看到這些信息,這些都是很老的梗了。

在網易云音樂上聽歌,如果想保存到本地,不需要安裝客戶端,直接在Chrome開發者工具里找到mp3的真實鏈接即可保存。

對于在線視頻也能用同樣的方式找到真實地址然后保存到本地。

前段時間我看到一則新聞,題目是"騙子騙術再高,遇到程序員也折腰",介紹了一位程序員收到詐騙短信后,不僅識破了詐騙犯的套路,全程機智應答,設陷下套,一步步將對方引入自己的節奏,最后直接控制了詐騙犯的電腦和攝像頭。

我的這位同行用到的一個方法就是:在上圖Chrome開發者工具的Console面板里敲入指令document.body.contentEditable='true', 這樣使得整個網頁處于可編輯狀態。然后就可以隨心所欲地修改網頁上的內容,比如可以像下圖這樣做做白日夢:

使用Chrome的記住密碼功能,時間長了都忘記密碼是什么了。雖然這些密碼在Chrome設置里也能找到,但更快捷的方式還是直接在Chrome開發者工具里打印出來。

在Chrome開發者工具里點擊Elements標簽,然后點擊網頁上的密碼元素,該元素的實現的html代碼就顯示在標簽頁里了。這里我們能看出該元素的id為password。

再回到Console標簽,輸入$("#password").value, 即可顯示出密碼。

以前網上有個著名的段子。一位程序猿打開珍愛網想找個對象。瀏覽了幾分鐘網頁,他習慣性地按了F12打開Chrome開發者工具,發現Console標簽打印了幾條錯誤信息,然后就習慣性地開始了調試。

然后,就沒有然后了。。。

下面是一些我日常工作中使用Chrome開發者工具的心得和小技巧,希望對您提高開發和調試的效率能有所幫助。

1. Element屬性斷點

在Element標簽頁選中某個html標簽,在右鍵菜單里設置Attributes modifications斷點。下圖意思是一旦title標簽的屬性發生變化,斷點自動觸發。

我曾經處理過一個incident,用戶抱怨在Fiori應用里做了一些操作之后,頁面的title被修改成一個錯誤的值。借助這個屬性斷點功能,我很快找到了title被修改的那行代碼。這個incident的更多細節請參考我的博客: A quick way to find which code has changed the UI5 application page title by debugging

2. 在瀏覽器的原生方法里設置斷點

這種說法其實并不準確,因為我們沒辦法在Chrome里查看瀏覽器原生方法的實現代碼,更別提設置斷點了。

其實我的需求是,希望調試的時候,在這些瀏覽器原生方法以某些特殊輸入參數被調用時能停下來。

舉個例子,在我研究Angular框架時,用ng-repeat畫了一個列表,如下圖所示。我發現對于每條列表記錄,最終生成的原生html代碼都有一個注釋元素,如下圖紅色高亮區域顯示。

我很好奇Angular框架是在哪行代碼生成的這三個注釋元素。按照推理,這些注釋肯定是通過原生方法createComment創建的,然而我無法在這個方法里面設置斷點。如果直接在Angular框架里根據源代碼createComment搜索,然后在所有的搜索結果處設置斷點——這種方法理論上可行,然而效率太低,因為搜索結果有將近100處調用了createComment。

怎么辦?

(1) 在angular.js文件最開始的地方設置斷點, 打開應用,斷點觸發:

(2) 將瀏覽器原生的方法實現保存在變量oldFn里,然后重寫createComment。在重寫的版本里,加上我自己的判斷邏輯:我期望只有當創建的comment文本包含ngRepeat時,斷點才觸發。實現如下圖所示。在console里執行下圖代碼,完成對createComment原始實現的覆蓋。

然后在調試器里繼續執行,最終斷點在我想要找的位置觸發:

這就是我要尋找的Angular框架創建包含ngRepeat注釋的代碼位置:

3. Chrome開發者工具里的一些隱藏命令

在Chrome地址欄里輸入chrome://開頭的一系列命令可以實現各種各樣的功能。不過我日常工作用得最多的是chrome://net-internals。

在SAP成都Revenue Cloud開發團隊Wang Cong的幫助下,我使用這個功能解開了困擾過我一段時間的關于JavaScript source code map的謎團。

我把如何通過chrome://net-internals研究JavaScript source code map的過程寫在了這三篇博客里:

(1) A debugging issue caused by source code mapping

(2) UI5 Source code map機制的細節介紹

(3) Useful Chrome Tool chrome://net-internals to monitor http request detail

4. 將JavaScript變量的內容保存成本地文件

我在SAP處理Fiori應用的incident時經常需要這個功能:比如調試Fiori應用的前后臺交互,我想把后臺返回的JSON響應另存成一個本地文件。當然我可以在Chrome開發者工具的network標簽頁手動選中響應內容,然后Ctrl C,再到本地新建一個文件,Ctrl V。我嫌這個步驟麻煩,在這篇博客上找到了另一種快捷的做法。

直接在console里執行這段代碼:

這段代碼會給console對象注入一個新方法save, 接下來就能使用console.save(<variable name>, <local file name>)將任意變量保存成本地文件,非常方便。

5. 分析JavaScript的垃圾回收機制

這種類型的分析通過Profiles這個標簽頁完成。詳細說明參考我的博客: An example of using Chrome Development Tool to analyze JavaScript garbage collector

6. 自學一些瀏覽器原生方法的實現

想知道這種toString方法具體是怎么實現的么?

您得在Chrome開發者工具里打開選項Show native functions in JS profile,然后查看我的博客:

Use Chrome development tool to do self-study on some JavaScript function native implementation

7. console.log的彩色打印

當我處理一些非常棘手的復雜問題時,經常使用到這個彩色打印的技巧。

我曾經處理過一個incident,UI上顯示的列表一次從后臺讀取20條記錄,其中有一條記錄的guid和其實際內容不匹配。我需要找到究竟是20條記錄里的哪一條記錄有錯。如果用調試的方式,我設置斷點的函數在循環里被調用,斷點會不斷被觸發。我覺得很不耐煩,就采用了console.log的方式,打印每條記錄的guid和詳細內容。當我觀察這些打印輸出時,發現它們被淹沒在了UI5框架大量的log里。因為我查看自己打印的log的同時,也需要結合UI5打印的log作為上下文來分析,因此我不能在Console標簽頁里使用過濾的功能來使得只有我自己打印的log被顯示出來。

有什么辦法能讓我自己打印的log不會淹沒在UI5框架海量的log里呢?辦法就是使其成為“萬花叢中一點綠"。

采用下列自定義函數myLog輸出的日志,在console里顯示的效果如下:

可以顯示得再花哨一點:

8. 使用正則表達式過濾網絡請求

9. jQuery選擇器風格的Console命令

比如我想快速知道當前UI一共有多少個button元素,并查看某些元素的詳情。采用類jQuery選擇器的語法$('button')即返回所有button元素。

還有其他很多小技巧,以及我最常用的快捷鍵組合,因為篇幅限制不再贅述,您可以在我的這篇博客里找到我使用Chrome開發者工具的全部技巧。

Chrome Development Tool tips used in my daily work

希望這篇文章能讓您對Chrome開發者工具有一些更深入的了解,感謝閱讀。

要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:

轉載于:https://my.oschina.net/u/3771578/blog/1796418

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278129.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278129.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278129.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BZOJ4314 倍數?倍數!

好神仙啊.... 題意 在$ [0,n) $中選$ k$個不同的數使和為$ n$的倍數 求方案數 $ n \leq 10^9, \ k \leq 10^3$ 題解 k可以放大到1e6的 先不考慮$ k$的限制 對答案構建多項式$ f(x)\prod\limits_{i0}^{n-1}(x^i1)$ 答案就是這個多項式所有次數為$ n$的倍數的項的系數和 考慮單位…

win2008R2管理員密碼修改文檔

場景&#xff1a;忘記了win2008R2服務器的管理員密碼。解決辦法&#xff1a;1、 制作一個U盤啟動盤&#xff1a;2、 系統通過U盤啟動進入WINpe系統3、 在知道Win2008安裝位置的情況下&#xff1b;查找C:\windows\system32\osk.exe 將osk.exe文件修改為&#xff1a;osk.exe.bat&…

Python檔案袋( 面向對象 )

類即是一個模型&#xff0c;根據模型建立起不同的對象&#xff0c;對象間擁有共同的一些屬性 簡單的類&#xff1a; 1 class P:2 #類變量&#xff0c;所有實例共享變量,推薦使用方法是&#xff1a;類名.類變量名3 pvarx"ppvar1"4 5 #構造函數6 def _…

javascript中的后退和刷新

轉自&#xff1a;https://www.cnblogs.com/tylerdonet/p/3911303.html <input typebutton value刷新 οnclick"window.location.reload()"><input typebutton value前進 οnclick"window.history.go(1)"><input typebutton value后退 οncl…

第四周

7-2 選擇法排序 &#xff08;20 分) 本題要求將給定的n個整數從大到小排序后輸出。 輸入格式&#xff1a; 輸入第一行給出一個不超過10的正整數n。第二行給出n個整數&#xff0c;其間以空格分隔。 輸出格式&#xff1a; 在一行中輸出從大到小有序的數列&#xff0c;相鄰數字間有…

checkPathValidity 檢查所有agent的corridor的m_path是否有效

在checkPathValidity&#xff08;檢查所有agent的corridor的m_path是否有效&#xff09; 如果是無效的要進行重新設置并且設置replan 首先獲得第一個polygon&#xff0c;m_path[0] 這里&#xff0c;因為addagent的時候&#xff0c;ag->corridor.reset(ref, nearest); m_path…

來談談JAVA面向對象 - 魯班即將五殺,大喬送他回家??

開發IDE為Eclipse或者MyEclipse。 首先&#xff0c;如果我們使用面向過程的思維來解決這個問題&#xff0c;就是第一步做什么&#xff0c;第二步做什么&#xff1f; 魯班即將五殺&#xff0c;大喬送他回家 這個現象可以簡單地拆分為兩步&#xff0c;代碼大概是這個樣子的: publ…

Vue 教程第一篇——基礎概念

認識 Vue 關于 Vue 的描述有不少&#xff0c;不外乎都會拿來與 Angular 和 React 對比&#xff0c;同樣頭頂 MVVM 雙向數據驅動設計模式光環的 Angular 自然被對比的最多&#xff0c;但到目前為止&#xff0c;Angular 在熱度上已明顯不及 Vue&#xff0c;性能已成為最大的詬病。…

Microsoft Teams的Outgoing Webhook開發入門

Microsoft Teams的應用程序有幾種形式&#xff1a; TabsBotsConnectorsMessaging extensionsActivity feed integrationsOutgoing web hooks 這篇我們主要介紹如何使用 ASP.NET Core來開發最簡單的Outgoing web hook。 什么是outgoing webhook Outgoing webhooks allow you t…

0418 jQuery筆記(添加事件、each、prop、$(this))

1.添加點擊事件、each、prop、$(this) 1 //全選框的被動操作2 //定義一個標志保存最終狀態3 var flag false;4 //為每一個選擇框添加點擊事件&#xff0c;數組.click()5 $(.chex).click(function(){6 //遍歷數組&#xff0c;數組.each()7 …

[WC2008]游覽計劃(斯坦納樹)

[Luogu4294] 題解 : 斯坦納樹 \(dp[i][j]\) 表示以\(i\)號節點為根&#xff0c;當前狀態為\(j\)&#xff08;與\(i\)連通的點為\(1\)&#xff09; 當根\(i\)不改變時狀態轉移方程是&#xff1a; \(dp[i][j] \min_{s \in j}\{dp[i][s] dp[i][\complement_js] - val[i]\}\) 當根…

使用dotnet template快速開發Microsoft Teams Outgoing Web Hook

在上一篇文章中&#xff0c;我們一步步從無到有在Microsoft Teams中開發了一個簡單的Outgoing Webhook&#xff0c;并和我們本地的Web API應用程序產生交互&#xff0c;總結起來的步驟大概如下&#xff1a; 導航到“團隊” Tab頁&#xff0c; 選中需要建立的Channel, 選中“應…

[Swift]LeetCode1013. 將數組分成和相等的三個部分 | Partition Array Into Three Parts With Equal Sum...

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?微信公眾號&#xff1a;山青詠芝&#xff08;shanqingyongzhi&#xff09;?博客園地址&#xff1a;山青詠芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;?GitHub地址&a…

京津冀產業協同升級 智慧城市等高端產業需求遇熱

云計算、智慧交通、城市環保科技等高端智慧城市產業項目正成為京津冀產業協同的新關注點。 21日&#xff0c;在由北京市經信委、天津市工信委、河北省工信廳聯合組織的京津冀產業協同發展招商推介專項行動上&#xff0c;超過200家與會企業共完成產業對接項目額達311.7億元。與以…

Microsoft Teams:刪除成員賬戶其歷史聊天會發生什么?

介紹&#xff1a; 此博客文章的目的是演示從Office 365刪除用戶的賬號后&#xff0c;此用戶在Microsoft Teams群聊和私聊中的歷史聊天記錄會發生什么改變。 以下是Microsoft Teams聊天對話&#xff0c;其中Adele和其他團隊成員正在參與對話&#xff1a; 此外, Adele和Mega還在…

PostgreSQL Huge Page 使用建議 - 大內存主機、實例注意

標簽 PostgreSQL , Linux , huge page , shared buffer , page table , 虛擬地址 , 物理地址 , 內存地址轉換表 背景 當內存很大時&#xff0c;除了刷臟頁的調度可能需要優化&#xff0c;還有一方面是虛擬內存與物理內存映射表相關的部分需要優化。 1 臟頁調度優化 1、主要包括…

Microsoft Teams:團隊Owner離開公司后,我們該怎么做?

您是否曾在這么一個團隊里&#xff0c;該團隊唯一有Owner權限的人離開了公司&#xff1f;不幸的是,如果這個人不再在公司里&#xff0c;您可能覺得沒有辦法讓其他團隊成員再成為team的owner。我有一個簡單易用的解決方案&#xff0c;但您需要成為Office 365租戶的Admin或聯系你…

python網絡編程-socket編程

一、服務端和客戶端 BS架構 &#xff08;騰訊通軟件&#xff1a;serverclient&#xff09; CS架構 &#xff08;web網站&#xff09; C/S架構與socket的關系&#xff1a; 我們學習socket就是為了完成C/S架構的開發 二、OSI七層模型 互聯網協議按照功能不同分為osi七層或tcp/ip五…

使用PowerShell配置Microsoft Teams

作為 IT 專業人員, 我一直在尋找自動化任務的方法, 并使日常操作簡單。當使用Microsoft Teams時, 是否能夠在團隊中自動創建團隊&#xff0c;渠道和設置對于Microsoft Teams組建的成功與否至關重要。PowerShell對Microsoft Teams的支持使您可以做到這一點&#xff0c;它為我提供…

常見Kotlin高頻問題解惑

在筆者的Kotlin交流群里&#xff0c;不少同學反復遇到了一些相似的問題。這些問題大都比較基礎&#xff0c;但又容易產生誤解。因此&#xff0c;我決定寫一篇文章&#xff0c;整理群里同學遇到的一些問題 變量和常量的使用 在Kotlin語言中&#xff0c;我們使用var聲明變量&…