作中有这样的场景,需要手动填写很多格式一样的表单,然后点击提交。如果数据在Excel中,一个个的copy,重复性工作太繁琐。今天就介绍一个实现网页自动化的控件--WebBrowser控件。
﹥﹥先给大家看看效果:(自动填写注册页面的表单数据)
这个效果稍做改变,加个循环,就可以实现批量填入网页表单数据,并自动提交。(备注:公司内部的表单一般是不会有验证码的,所以暂时不用考虑识别验证码的工作。)
这就是WebBrowser控件的强大之处。下面就教大家如何实现上述网页自动化的效果。
﹥﹥何为WebBrower?
WebBrowser 是微软提供的一个用于浏览网页的 ActiveX 控件,是植入在程序中一个控件,网页显示在窗体中.可以利用WebBrowser 对网页进行控制,进行一些操作。
在VBA中WebBrowser 控件插入到 VBA 的用户窗体、一般情况下,VBA 的控件工具箱中找不到该控件,需要在控件工具箱点击右键,在右键菜单中选择“附加控件”,在附加控件对话框中,找到“Microsoft Web Browser”并且勾选。
控件工具箱中出现一个地球形状的控件,这样就可以把该控件和其他控件一样,拖放到用户窗体中使用。
﹥﹥制作方法:
■第一步:拖拽控件到窗体上,添加两个按钮。一个是打开网页按钮,一个是填入数据按钮、一个点击【提交按钮】的按钮。(实际可以合为一个按钮,这里只是为了方便演示操作)
■第二步:分析网页结构,找出需要填写的表单文本框ID,还有提交按钮的ID。
网页F12调出开发者工具,可以看到,对应于网页上具体的控件内容,都有具体的html代码。
找到填写昵称的代码段,我们看到,昵称文本框的ID为"inputName",这就是我们需要的。用相同的方法,找到其他几个文本框的ID。
■第三步:双击"打开网页"按钮,填入以下代码;
Private Sub CommandButton1_Click() UserForm1.WebBrowser1.Navigate "http://zc.7k7k.com/" UserForm1.WebBrowser1.Silent = True'禁止安全弹窗提醒 End Sub
双击"填入数据"按钮,填入以下代码
Private Sub CommandButton2_Click() With UserForm1.WebBrowser1.Document .getElementById("inputName").Value = Range("a2") .getElementById("inputPwd").Value = Range("b2") .getElementById("inputRePwd").Value = Range("b2") .getElementById("inputRealName").Value = Range("c2") .getElementById("inputCardId").Value = Range("d2") End With End Sub
双击"点击按钮"按钮,填入以下代码:(实现提交按钮的点击)
Private Sub CommandButton3_Click() Set doc = UserForm1.WebBrowser1.Document For i = 0 To doc.All.Length - 1 If (LCase(doc.All(i).tagname)) = "input" Then If (LCase(doc.All(i).Type)) = "submit" Then Set tg = doc.All(i) tg.Click Exit Sub End If End If Next i End Sub
这只是个简单的例子,复杂的网页需要具体的分析解决。
我们也可以利用WebBrowser控件提取网页的数据,因为网页都是加载成功后的数据,所以内容基本都能提取成功。
述:本文将讨论如何用最简单的术语在网站上运行 C# 代码。半技术讲座我使用了 wasm-tools-net7,这是一个基于 wasm-tools 的工作负载,没有包含任何额外的包。我的重点是简单性和主要主题。彻底了解该主题可提供完成所有其他任务所需的信息。如何工作?WebAssembly 工作原理:序列图创建演示创建项目我用的是net7,但这取决于你。Dotnet new console -o WASM_Demo cd WASM_Demo Dotnet workload install wasm-tools-net7此时,需要对 csproj 文件进行修改。Project Sdk=Mi
本文将讨论如何用最简单的术语在网站上运行 C# 代码。
我使用了 wasm-tools-net7,这是一个基于 wasm-tools 的工作负载,没有包含任何额外的包。我的重点是简单性和主要主题。彻底了解该主题可提供完成所有其他任务所需的信息。
WebAssembly 工作原理:序列图
Dotnet new console -o WASM_Demo
cd WASM_Demo
Dotnet workload install wasm-tools-net7
此时,需要对 csproj 文件进行修改。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RuntimeIdentifier>browser-wasm</RuntimeIdentifier>
<WasmMainJSPath>main.js</WasmMainJSPath>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<WasmExtraFilesToDeploy Include="index.html" />
<WasmExtraFilesToDeploy Include="main.js" />
</ItemGroup>
</Project>
我们添加了什么:
返回到program.cs文件,需要考虑某些规则。
让我们举个例子。
using System.Runtime.InteropServices.JavaScript;
namespace WASM_Demo;
public partial class Program
{
static void Main(string[] args) { }
[JSExport]
public static string Response()
{
return """
<h1>
Hello World
</h1>
""";
}
}
没关系,但是我们如何在浏览器中运行此代码?
运行这个程序的代码是dotnet.js的,它自带了wasm-tools,所以没有必要担心它。要使用此dotnet.js,我们只需使用一个名为 main.js 的文件。
import { dotnet } from './dotnet.js'
const is_browser = typeof window != "undefined";
if (!is_browser) throw new Error(`Expected to be running in a browser`);
const { setModuleImports, getAssemblyExports, getConfig, runMainAndExit } = await dotnet
.withDiagnosticTracing(false)
.withApplicationArgumentsFromQuery()
.create();
const config = getConfig();
const exports = await getAssemblyExports(config.mainAssemblyName);
const html =
exports
.WASM_Demo // Namespace
.Program // Class Name
.Response(); // Function Name
// Regular javascript code
document.getElementById("app").innerHTML = `${html}`;
await runMainAndExit(config.mainAssemblyName, [] /* Console App Args */);
index.html页面的模板已经准备完毕。
<!DOCTYPE html>
<html lang="en">
<head>
<title>WASM Demo</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="modulepreload" href="./dotnet.js" />
</head>
<body>
<main id="app"></main>
<script type="module" src="./main.js"></script>
</body>
</html>
现在,让我们再看一遍这个过程,
我们还有一件事要做,你需要打开一个名为 runtimeconfig.template.json 的文件,并将以下 JSON 数据放入其中。
{
"wasmHostProperties": {
"perHostConfig": [
{
"name": "browser",
"html-path": "index.html",
"Host": "browser"
}
]
}
}
我们已经到了尽头,程序现在可以运行了。唯一需要的命令是:
Dotnet run -c Release
我可以托管所有文件而不是 wasm-tools 吗?又是如何做到的呢?
当然,但它可能会变得有点复杂,你用 wasm-tools 制作的项目不能用于任何其他目的,即控制台应用程序不起作用,wasm-tools 可以工作。因为我们选择 browser-wasm 作为 RuntimeIdentifier,并且多个 RuntimeIdentifiers 在 .NET 中不可用。作为替代方法,您可以打开两个项目,将第一个项目设置为 WASM 项目,然后在第二个项目中将其设置为控制台应用程序,然后生成第一个项目并托管输出文件夹,所有 DLL 和文件都将在那里。
这个演示只是索引文件,我可以做多页吗?又是如何做到的呢?
当然,但这比你想象的要难得多,因为这样做的方法是一种叫做SPA(单页应用程序)的方法,用户总是在同一页面上,只是内容发生了变化。有多种方法可以做到这一点。所以它可以用你的创造力来完成。
我可以像计数器一样做动态代码吗?又是如何做到的呢?
_是的,我也这样做了,你可以一遍又一遍地调用 C# 函数,如果你只是将导出绑定到 window 对象,你可以从每个 JavaScript 代码中调用它。
文主要以 HackerScreenSaver 新功能的开发经历介绍 webBrowser中网页如何调用.NET方法的过程。
之前开源了一款名为 HackerScreenSaver 的 Windows 屏保程序。该程序具有模拟黑客炫酷界面的特点,用户可以将自定义的网页作为锁屏界面。不久前,有网友提出一个有趣的需求:能否在退出屏保时需要输入密码?虽然我不太清楚他的用意,但这个其实可以安排,不过需要变通一下。
之前做这个程序的时候我就发现,屏幕保护程序需要自己处理退出,如果屏保程序设计得不够合理,可能会导致用户在无法正常退出屏保时遇到困扰。所以在设计之初,我添加了 MouseKeyHook
用来监听全局的键鼠事件。
那么设计新的功能来实现网友的需求也很简单,当然不是直接的设计什么密码输入,然后判断退出的功能。这里只需将屏保退出的功能提供给网页控制就可以了。
之前介绍到为了程序简易软件采用了 webBrowser,那么为了让网页可以决定什么时候退出屏保,就需要让 webBrowser 中的网页可以调用 .NET 的方法。
在网页中,我们需要在屏保退出的逻辑部分添加一段 JavaScript 代码,用于调用 .NET 方法。这段代码的核心是 window.external
对象,它允许 JavaScript 访问 .NET 对象。我们在用户输入正确密码或者游戏胜利等条件下执行下面的 JavaScript 代码即可:
window.external.ExecuteExitSrc();
对于 .NET 代码,可以创建一个和单独的类以供 web 调用:
[ComVisible(true)]
public class JavaScriptInteraction
{
public void ExecuteExitSrc()
{
Application.Exit();
}
}
需要注意的是,我们需要在该类上添加一个 [ComVisible(true)]
特性。这个特性使得该类的公共成员可以被 COM 组件访问,从而实现 JavaScript 与 .NET 方法之间的互操作,否则你会收到下面的错误信息:
System.ArgumentException:“ObjectForScripting 的类必须对 COM 可见。请确认该对象是公共的,或考虑向您的类添加 ComVisible 特性。”
最后,需要在 webBrowser
控件的 ObjectForScripting
属性中设置一个 .NET 对象,这个对象将用于被 JavaScript 调用:
webB.ObjectForScripting = new JavaScriptInteraction();
为了演示新功能的使用,在 html 目录中,提供了一个演示用的 exit.html
直接提供了网页退出屏保的演示按钮。
新的功能提供了更多的可玩性,用户可以根据自己的喜好设计各种有意思的屏保,这样也是满足了输入密码退出这个功能的实现基础。当然我们可以有许多有意思的功能可以自行设计,比如:
1.解谜屏保:设计一个带有简单谜题的屏保,用户需要在网页上回答正确才能退出屏保。谜题可以是数学题、逻辑题或者常识题等,每次屏保激活时,可以随机从题库中抽取一道题目。既然是题库,甚至可以利用屏保学习各种知识,比如英语单词,各种考试题等等。2.拼图屏保:制作一个拼图游戏,用户需要在网页上完成拼图才能退出屏保。可以使用用户自己的照片作为拼图素材,或者从网上随机抓取图片。拼图难度可以根据用户的喜好进行调整。3.计时屏保:设置一个倒计时屏保,用户需要在网页上等待一段时间(例如,1分钟)后才能退出屏保。在等待期间,可以展示一些有趣的事物,如名言警句、美丽的图片或者实时新闻等。
通过这些有趣的屏保设计方案,用户在退出屏保时可以享受到更多互动和趣味性。此外,这些方案还可以根据用户的喜好和需求进行定制和扩展,为用户带来更丰富的屏保体验。
同时,我还在更新中提供了一个经典的 2048 小游戏,要求玩家在赢得游戏后才能退出屏保。
这个游戏改的逻辑其实是没有改好的,也懒得调整了,更新一下游戏介绍也是可以的。
当玩家在游戏中努力拼搏,最终赢得游戏时,他们可能会发现,游戏并没有因此结束,屏保依然继续运行。这时,他们可能会意识到,即使付出了努力,结果也不一定如人意。而当玩家选择投降并重新开始游戏10次后,他们将发现这个看似无用的操作竟然让屏保退出,让电脑恢复正常使用。
也许只有努力过才会发现,游戏还是投降躺平舒服些,只需要重开十次,就会被比你努力凑齐 2048 赢得游戏来退出屏保更快。人生有时就是这样,在现实生活中,我们往往会面临两种选择:努力拼搏还是躺平投降。有时候,努力拼搏的结果并不一定能让我们达到预期的目标,反而可能让我们陷入更深困境,带来更多的困扰。而在某些情况下,选择躺平投降,反而能让我们以更轻松的心态面对问题,从而找到解决问题的更快方法。当然,该拼搏的时候,还是需要努力一把,万一就成功了呢?
本文向大家介绍了如何在 webBrowser 中的网页调用 .NET 方法,以及如何在屏保程序中加入游戏元素。通过这些技巧,我们可以为用户带来更有趣的屏保体验。希望本文能对大家有所帮助,最后项目地址是:https://github.com/sangyuxiaowu/HackerScreenSaver?wt.mc_id=DT-MVP-5005195 感兴趣的话,可以下载体验一下。
*请认真填写需求信息,我们会在24小时内与您取得联系。