UWP 在 WebView 中執行 JavaScript 程式碼(用於模擬用戶輸入等)
- 2020 年 2 月 10 日
- 筆記
UWP 中使用 WebView 時可以在網頁中額外執行一些程式碼。於是你幾乎可以在網頁上做任何事情,那些你可以在瀏覽器控制台中做的事情。
本文將介紹做法。
準備環境
在頁面(XAML)中放一個 WebView,然後取個名字,比如就叫做 WebView。
監聽 NavigationCompleted 事件,然後導航到需要操作的頁面。
WebView.NavigationCompleted += OnNavigationCompleted; WebView.Navigate(new Uri("https://blog.walterlv.com"));private async void OnNavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs e) { // 我們接下來的程式碼都將在這裡編寫。 }要執行 JavaScript 程式碼,必須要導航完成才行,所以我們接下來的程式碼都是寫在 NavigationCompleted 事件處理函數中的。
執行 JavaScript 程式碼
模擬用戶輸入
下面這一句的程式碼是填充用戶 Id 一欄:
await WebView.InvokeScriptAsync("eval", new[] { "document.getElementById('userId').value = 'walterlv';" });
登錄頁面截圖來自於 碼友網。
JavaScript eval(string) 函數
在上面的程式碼中,eval 是指執行 JavaScript 的 eval 函數,並且將後面的字元串數組作為它的參數傳入。
在 JavaScript 中,eval(string) 函數可計算某個字元串,並執行其中的的 JavaScript 程式碼。在計算結束後,會返回一個字元串,就是參數中那個字元串執行完之後的返回值(如果有的話)。
於是意味著你可以通過這種方式拿到輸入框中的值:
var userId = await WebView.InvokeScriptAsync("eval", new[] { "document.getElementById('userId').value;" });執行完後,可以得到 userId 的值是 walterlv 字元串;也就是我們上一步填充的那個值。
模擬用戶登錄
完整的輸入用戶名、密碼,並點擊登錄按鈕的程式碼則是這樣的:
await LoginWebView.InvokeScriptAsync("eval", new[] { "document.getElementById('userId').value = 'walterlv';" }); await LoginWebView.InvokeScriptAsync("eval", new[] { "document.getElementById('password').value = '不想讓你看見的密碼';" }); await Task.Delay(1000); await LoginWebView.InvokeScriptAsync("eval", new[] { "document.getElementById('submit').click();" });參考資料
本作品採用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名 呂毅 (包含鏈接: https://blog.walterlv.com ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發布。如有任何疑問,請 與我聯繫 ([email protected]) 。
