UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等)
UWP 中使用 WebView 时可以在网页中额外执行一些代码。于是你几乎可以在网页上做任何事情,那些你可以在浏览器控制台中做的事情。
本文将介绍做法。
准备环境
在页面(XAML)中放一个 WebView
,然后取个名字,比如就叫做 WebView
。
监听 NavigationCompleted
事件,然后导航到需要操作的页面。
WebView.NavigationCompleted += OnNavigationCompleted;
WebView.Navigate(new Uri("https://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();"
});
参考资料
本文会经常更新,请阅读原文: https://walterlv.com/post/invoke-web-script-in-webview.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com) 。