当前位置: 首页 > news >正文

UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等)

UWP 中使用 WebView 时可以在网页中额外执行一些代码。于是你几乎可以在网页上做任何事情,那些你可以在浏览器控制台中做的事情。

本文将介绍做法。


本文内容

      • 准备环境
      • 执行 JavaScript 代码
        • 模拟用户输入
        • JavaScript eval(string) 函数
        • 模拟用户登录
        • 参考资料

准备环境

在页面(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();"
});

参考资料

  • JavaScript eval() 函数
  • win10 uwp 模拟网页输入

我的博客会首发于 https://walterlv.com/,而 CSDN 和博客园仅从其中摘选发布,而且一旦发布了就不再更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://blog.csdn.net/wpwalter),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • int? 竟然真的可以是 null!.NET/C# 确定可空值类型 NullableT 实例的真实类型
  • Slack 开发入门之 Incoming Webhooks:往 Slack 的 Channel 中发消息
  • 三值 bool? 进行与或运算后的结果
  • 为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?
  • 通过重写预定义的 Target 来扩展 MSBuild / Visual Studio 的编译过程
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • C# 中委托实例的命名规则
  • 在 Target 中获取项目引用的所有依赖(dll/NuGet/Project)的路径
  • 让 MSBuild Target 支持 Clean
  • C#/.NET 如何确认一个路径是否是合法的文件路径
  • 不使用 U 盘等任何工具全新安装 Windows 操作系统
  • C# 永远不会返回的方法真的不会返回
  • CentOS 的终端中如何搜索文件
  • 如何在命令行中监听用户输入文本的改变?
  • 【347天】每日项目总结系列085(2018.01.18)
  • Bytom交易说明(账户管理模式)
  • CSS 专业技巧
  • IDEA 插件开发入门教程
  • Java IO学习笔记一
  • JavaScript 基础知识 - 入门篇(一)
  • Lucene解析 - 基本概念
  • React中的“虫洞”——Context
  • redis学习笔记(三):列表、集合、有序集合
  • socket.io+express实现聊天室的思考(三)
  • 搞机器学习要哪些技能
  • 离散点最小(凸)包围边界查找
  • 十年未变!安全,谁之责?(下)
  • 使用 @font-face
  • 算法-图和图算法
  • 移动端唤起键盘时取消position:fixed定位
  • 用quicker-worker.js轻松跑一个大数据遍历
  • C# - 为值类型重定义相等性
  • postgresql行列转换函数
  • 我们雇佣了一只大猴子...
  • 整理一些计算机基础知识!
  • ( 10 )MySQL中的外键
  • (1) caustics\
  • (3)llvm ir转换过程
  • (C)一些题4
  • (NSDate) 时间 (time )比较
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (原創) 物件導向與老子思想 (OO)
  • (转)linux下的时间函数使用
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .net framework4与其client profile版本的区别
  • .Net 高效开发之不可错过的实用工具
  • .netcore 获取appsettings
  • .Net的C#语言取月份数值对应的MonthName值
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • //解决validator验证插件多个name相同只验证第一的问题
  • /boot 内存空间不够
  • ?.的用法
  • []FET-430SIM508 研究日志 11.3.31