这是一个非常常见的需求,比如自动登录网站、提交表单等,整个过程主要分为以下几个步骤:

  1. 准备工作:安装必要的支持库。
  2. 打开网页:让程序打开目标网页。
  3. 定位元素:找到需要填写的输入框、按钮等。
  4. :向定位到的元素输入文本或点击。
  5. 处理图片:找到验证码图片,下载并显示,等待用户输入。
  6. 提交表单:点击提交按钮完成操作。

第一步:准备工作

易语言本身不直接支持复杂的网页操作,我们需要借助第三方支持库,最常用的是 “网页访问支持库”,文件名通常是 ie.fneweb.fne

  1. 下载支持库:你可以从易语言相关的论坛、资源站搜索“易语言 网页访问支持库”进行下载。
  2. 安装支持库:下载后,将 .fne 文件复制到易语言的 ..\程序集\ 目录下(D:\易语言\程序集\),重启易语言,你就可以在“程序集”中看到它了。

第二步:创建程序并打开网页

我们创建一个易语言窗口程序,并添加一个按钮“打开网页”,用于加载目标页面。

示例代码:

.版本 2
.程序集 网页访问支持库
.子程序 _按钮_打开网页_被单击
.局部变量 ie浏览器, internet_explorer
' 创建一个IE浏览器对象
ie浏览器.创建 ()
' 导航到目标网页
' 这里以一个测试网站为例,你可以替换成任何你需要的网页
ie浏览器.导航到 ("https://example.com/login")
' 可选:等待页面加载完成
.计次循环首 (100, )
    (ie浏览器.读取属性 ("readyState") = "complete")
        跳出循环 ()
    否则
        延时 (100)
    .
.
.计次循环尾 ()
' 显示提示信息
信息框 ("网页已打开,请稍候...", 0, )

代码解释:

  • .程序集 网页访问支持库:声明我们使用这个支持库。
  • internet_explorer 是支持库中定义的一个类,代表一个IE浏览器实例。
  • ie浏览器.创建 ():在内存中创建一个浏览器窗口(此时不可见)。
  • ie浏览器.导航到 ("..."):让浏览器开始加载指定的URL。
  • .计次循环首...:这是一个简单的等待机制,检查浏览器是否加载完成(readyState属性为complete)。

第三步:定位网页元素

网页填表的核心是找到正确的输入框,定位元素通常有以下几种方法:

  1. 根据ID:最可靠的方法,如果元素有唯一的ID。
  2. 根据Name:也比较常用。
  3. 根据Class Name:适用于有特定样式的元素。
  4. 根据Tag Name<input>
  5. 根据XPath:最强大但最复杂,可以精确定位任意元素。

假设我们要填写的表单如下:

<form action="/submit" method="post">
    <input type="text" id="username" name="user" placeholder="请输入用户名">
    <input type="password" id="password" name="pwd" placeholder="请输入密码">
    <img src="/captcha.php" id="captcha_img" alt="验证码">
    <input type="text" id="code" name="code" placeholder="请输入验证码">
    <button type="submit" id="submit_btn">登录</button>
</form>

定位代码示例:

.子程序 _按钮_填写用户名_被单击
.局部变量 ie浏览器, internet_explorer
.局部变量 用户名输入框, htmlelement
' 获取之前创建的浏览器对象 (这里简化处理,实际应用中可能需要全局变量)
ie浏览器 = 取程序集窗口 (0, ).标签 ("ie浏览器") ' 假设我们把浏览器对象放在了窗口上
' 方法1:通过ID定位
用户名输入框 = ie浏览器.获取元素 ("username")
' 方法2:通过Name定位
' 用户名输入框 = ie浏览器.获取元素 ("user")
' 方法3:通过XPath定位 (更强大)
' 用户名输入框 = ie浏览器.获取元素 ("//input[@id='username']")
' 如果成功找到元素
(用户名输入框.取到元素 ())
    ' 在输入框中输入文本
    用户名输入框.设置属性 ("value", "我的用户名")
    信息框 ("用户名已填写", 0, )
    ' 可以让输入框获得焦点
    用户名输入框.聚焦 ()
    ' 模拟按下回车键 (可选)
    ' ie浏览器.发送按键 (13) ' 13 是回车键的键码
    .
    否则
    信息框 ("未找到用户名输入框!", 0, )
.

代码解释:

  • ie浏览器.获取元素 ("username"):这是最简单直接的方法,通过元素的 id 来获取。
  • 用户名输入框.取到元素 ():检查是否成功定位到元素,避免后续操作出错。
  • 用户名输入框.设置属性 ("value", "我的用户名"):找到 <input> 元素后,通过修改其 value 属性来填入内容。

第四步:处理验证码图片

验证码是自动化的难点,因为它通常是为了防止机器操作,最合理的方案是:程序自动下载图片,让用户肉眼识别并输入,程序再帮用户填进去。

步骤:

  1. 定位到 <img>
  2. 获取其 src 属性(图片的URL)。
  3. 使用 inetwininet 等支持库下载该URL的图片文件到本地。
  4. 在易语言窗口上添加一个“图片框”控件,将下载的图片显示出来。
  5. 添加一个“输入框”让用户输入看到的验证码。
  6. 程序读取用户输入,填入到网页的验证码输入框中。

示例代码(下载并显示验证码):

.版本 2
.程序集 网页访问支持库
.程序集 inet ' 用于下载文件
.子程序 _按钮_获取验证码_被单击
.局部变量 ie浏览器, internet_explorer
.局部变量 验证码图片元素, htmlelement
.局部变量 图片网址, 文本型
.局部变量 下载结果, 逻辑型
' 获取浏览器对象
ie浏览器 = 取程序集窗口 (0, ).标签 ("ie浏览器")
' 定位验证码图片
验证码图片元素 = ie浏览器.获取元素 ("captcha_img")
(验证码图片元素.取到元素 ())
    ' 获取图片的src属性
    图片网址 = 验证码图片元素.读取属性 ("src")
    ' 如果src是相对路径,需要补全为绝对路径
    (取文本左边 (图片网址, 7) ≠ "http://")
        图片网址 = "https://example.com" + 图片网址 ' 假设网站域名是 example.com
    .
    ' 定义本地保存路径
    .如果真 (写到文件 ("C:\temp\captcha.jpg", 到字节集 (inet_读文件 (图片网址)), , 假) = 真)
        ' 显示图片到窗口的图片框
        取程序集窗口 (0, ).图片框_验证码.图片 = ("C:\temp\captcha.jpg")
        信息框 ("验证码已获取,请在下方输入框填写", 0, )
        .否则
        信息框 ("下载验证码失败!", 0, )
    .
    .
    否则
    信息框 ("未找到验证码图片!", 0, )
.

代码解释:

  • 验证码图片元素.读取属性 ("src"):获取图片的源地址。
  • inet_读文件 (图片网址):使用 inet 支持库的函数将网络图片读入内存(返回字节集)。
  • 写到文件 ("...", 到字节集 (...), , 假):将内存中的图片字节集保存为本地文件。
  • 取程序集窗口 (0, ).图片框_验证码.图片 = "...":将本地图片文件路径赋值给窗口上的图片框控件,使其显示。

第五步:完整流程整合

我们将所有步骤整合到一个完整的程序流程中。

窗口设计:

  • 一个 ie 浏览器控件(用于嵌入网页)
  • 一个“打开网页”按钮
  • 一个“获取验证码”按钮
  • 一个“自动登录”按钮
  • 一个“验证码图片”框
  • 一个“请输入验证码”输入框

易语言代码逻辑:

.版本 2
.程序集 网页访问支持库
.程序集 inet
.全局变量 ie浏览器, internet_explorer ' 全局变量,方便各个子程序访问
.子程序 _按钮_打开网页_被单击
.局部变量 目标网址
目标网址 = "https://example.com/login" ' 替换为你的目标网址
' 创建并嵌入浏览器到窗口的ie控件中
ie浏览器.创建 ()
ie浏览器.嵌入到 (取程序集窗口 (0, ).ie浏览器.取窗口句柄 ())
ie浏览器.导航到 (目标网址)
.计次循环首 (100, )
    (ie浏览器.读取属性 ("readyState") = "complete")
        跳出循环 ()
    .
    延时 (100)
.
.计次循环尾 ()
信息框 ("网页已打开", 0, )
.子程序 _按钮_获取验证码_被单击
.局部变量 验证码图片元素, htmlelement
.局部变量 图片网址, 文本型
.局部变量 临时目录
' 确保浏览器已加载
(ie浏览器.取到元素 () = 假)
    信息框 ("请先打开网页!", 0, )
    返回 ()
.
验证码图片元素 = ie浏览器.获取元素 ("captcha_img")
(验证码图片元素.取到元素 ())
    图片网址 = 验证码图片元素.读取属性 ("src")
    ' ... (路径补全逻辑,同上) ...
    临时目录 = 取运行目录 () + "\captcha.jpg"
    .如果真 (写到文件 (临时目录, 到字节集 (inet_读文件 (图片网址)), , 假) = 真)
        取程序集窗口 (0, ).图片框_验证码.图片 = 临时目录
    .
    .
    否则
    信息框 ("未找到验证码图片!", 0, )
.
.子程序 _按钮_自动登录_被单击
.局部变量 用户名框, 密码框, 验证码框, 登录按钮, htmlelement
.局部变量 用户输入的验证码, 文本型
' 1. 填写用户名
用户名框 = ie浏览器.获取元素 ("username")
(用户名框.取到元素 ())
    用户名框.设置属性 ("value", "testuser")
.
' 2. 填写密码
密码框 = ie浏览器.获取元素 ("password")
(密码框.取到元素 ())
    密码框.设置属性 ("value", "testpass")
.
' 3. 填写验证码 (从用户输入框获取)
用户输入的验证码 = 取程序集窗口 (0, ).编辑框_验证码输入.内容
验证码框 = ie浏览器.获取元素 ("code")
(验证码框.取到元素 ())
    验证码框.设置属性 ("value", 用户输入的验证码)
.
' 4. 点击登录按钮
登录按钮 = ie浏览器.获取元素 ("submit_btn")
(登录按钮.取到元素 ())
    登录按钮.触发事件 ("click")
    信息框 ("已提交登录信息,请观察网页变化。", 0, )
    .
    否则
    信息框 ("未找到登录按钮!", 0, )
.

重要注意事项与进阶技巧

  1. 元素定位失败:这是最常见的问题,请确保:

    • 网页已经完全加载。
    • idname 等属性值正确无误。
    • 可以使用浏览器的“开发者工具”(按F12)来检查元素,确认其准确的 idclassXPath
  2. 动态加载的网页:很多现代网站(特别是单页应用 SPA)内容是 JavaScript 动态加载的。ie.fne 可能无法在 readyStatecomplete 时就捕获到所有元素,你可能需要更长的等待时间,或者通过监控网络请求等方式来判断元素是否真的加载完成。

  3. iframe 嵌套:如果表单在 <iframe> 内,你需要先切换到 iframe,然后再定位元素。

    .局部变量 iframe元素, htmlelement
    iframe元素 = ie浏览器.获取元素 ("my_iframe_id") ' 获取iframe
    (iframe元素.取到元素 ())
        ' 切换焦点到iframe
        ie浏览器.切换框架 (iframe元素)
        ' 现在在iframe内部定位元素
        用户名框 = ie浏览器.获取元素 ("username")
        ' 操作完成后,切回主文档
        ie浏览器.切换框架 (0) ' 0 代表主文档
        .
    .
  4. 模拟人类操作:为了更像真人,可以在输入后加入短暂的延时。

    用户名框.设置属性 ("value", "testuser")
    延时 (300) ' 延时300毫秒
  5. 处理弹窗:如果网站有 alertconfirm 弹窗,程序可能会卡住,可以在操作前先关闭所有弹窗。

    ie浏览器.关闭弹出窗口 ()
  6. 使用更强大的库ie.fne 基于 IE 浏览器,速度较慢且对现代网页支持不佳,如果你需要更高效、更稳定的解决方案,可以考虑学习使用 WebView2 相关的支持库,它基于微软的 Edge 浏览器核心,性能更好,兼容性更强,是目前网页自动化的主流方向,使用 WebView2 的学习曲线会更陡峭一些。