如何通过 QWebEngine 在网页的输入文本字段中填写文本(来自 C++)?

How can I fill in text (from C++) in an input text field on a web page through QWebEngine?

我想在 QWebEngine 中包装一个网站,这样我就可以使用 Qt 的事件过滤器调整输入命令,也许还有更多。有问题的网站需要 username/email 和密码,我想确保我可以在我这边处理该文本的输入,发送要在网页上填写的字符串,然后以编程方式推送登录同一页面上的按钮。

我发现 this page,建议使用 QWebChannel 和一些自定义 javascript 来实现此功能。我知道如何通过 Firefox 的 Web Inspector 工具获取我要填写的元素的信息,但我不知道如何

  1. 将两个字符串传递给自定义 JS 代码我会 运行 通过 QWebChannel 以某种方式

  2. 实际编写JS代码来查找不受我控制的网站上的特定元素

没有 url 参数或类似的参数,如果我查看当我在浏览器中实际按下 "log in" 时发送的 POST 请求是什么样的,信息以某种方式编码,因此复制实际发送的数据在这一点上似乎不可行。

在我的登录页面中,我有两个变量:用户名、用户密码。您可以使用 runJavaScript 表单 QWebEnginePage 来评估您的 js:

 ui->webView->page()->runJavaScript(QString("document.getElementById('username').value = '%1'").arg("example"));
 ui->webView->page()->runJavaScript(QString("document.getElementById('password').value = '%1'").arg("example"));

要获取用户插入的文本,您可以使用:

ui->webView->page()->runJavaScript(QString("document.getElementById('username').value"),
                                          [this](const QVariant& res) {
    qDebug() << "Username = " << res.toString(); 
});

现在,只需调用您的登录按钮并模拟点击事件,post 事件....

ui->webView->page()->runJavaScript(QString("document.getElementById("%1").click()).arg("example"));

我用它自动登录我的页面以获取会话令牌或 cookie。