【问题标题】:How can I fill in text (from C++) in an input text field on a web page through QWebEngine?如何通过 QWebEngine 在网页上的输入文本字段中填写文本(来自 C++)?
【发布时间】:2016-09-20 16:44:58
【问题描述】:

我想用QWebEngine 包装一个网站,这样我就可以使用Qt 的事件过滤器甚至更多来调整输入命令。有问题的网站需要用户名/电子邮件和密码,我想确保我可以处理该文本的输入,发送要在网页上填写的字符串,然后以编程方式按下登录按钮同一页。

我找到了this page,建议使用QWebChannel 和一些自定义javascript 来使其正常工作。我知道如何通过 Firefox 的 Web Inspector 工具获取我想要填写的元素的信息,但我不知道如何

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

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

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

【问题讨论】:

  • This question and the corresponding answer 可以帮助您实现您想要实现的第一部分(即将两个 QString 传递给 JS 端)。但是,我不确定您接下来要实现什么。你能澄清一下吗?
  • 我想以编程方式输入登录凭据并按下登录按钮。我不能依赖 webengineview 输入处理,因为我想通过单独的系统处理输入(它适用于带有遥控器的电视,即 Kodi 插件)。

标签: javascript html qtwebengine


【解决方案1】:

在我的登录页面中,我有两个变量:用户名、用户密码。您可以使用 runJavaScript form 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(); 
});

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

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

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

【讨论】:

  • 此代码应在页面完全加载后运行,否则 JavaScript 找不到任何对象。最好的解决方案是使用QWebEnginePageloadFinished(bool) 信号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多