首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QWebEngineView - Javascript回调

QWebEngineView - Javascript回调
EN

Stack Overflow用户
提问于 2017-07-21 14:53:16
回答 1查看 2.5K关注 0票数 1

我最终想要完成的是捕获用户输入到网站的用户名和密码。例如,如果用户在Facebook的登录中输入"test@example.com“作为电子邮件地址,然后单击提交,我想将该电子邮件地址存储在我的PyQt应用程序中。

我最接近实现这一点的方法是使用一系列JavaScript命令将一个侦听器放在"Login Button“上,该按钮返回用户参数的当前值。我的问题是,PyQt提供的回调是在runJavaScript函数完成时进行的,而不是javascript事件侦听器。我想知道是否有任何方法可以从JavaScript函数中捕获回调函数,或者是否有更好的方法来实现这一点。

代码语言:javascript
复制
import os
import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget
from PyQt5.QtCore import QUrl, QEventLoop
from PyQt5.QtWebEngineWidgets import QWebEngineView

class WebPage(QWebEngineView):
    def __init__(self):
        QWebEngineView.__init__(self)
        self.load(QUrl("https://facebook.com"))
        self.loadFinished.connect(self._on_load_finished)
        #self.page().runJavaScript("document.getElementById("myBtn").addEventListener("click", displayDate)", print)

    def _on_load_finished(self):
        print("Finished Loading")
        cmds = ["btn=document.getElementById('u_0_r')",  # Login Button
                "user=document.getElementsByName('email')[0]",
                "function get_username(){return user.value}",
                "btn.addEventListener('click', get_username)"]
        self.page().runJavaScript("; ".join(cmds), lambda x: print("test: %s"  % x))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    web = WebPage()
    web.show()
    sys.exit(app.exec_())  # only need one app, one running event loop
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-26 03:40:21

到目前为止,我发现了一个使用"urlChanged“信号的变通方法,它似乎对我的应用程序有效

代码语言:javascript
复制
import os
import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget
from PyQt5.QtCore import QUrl, QEventLoop
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWebEngineCore import QWebEngineUrlRequestInterceptor

class WebPage(QWebEngineView):
    def __init__(self):
        QWebEngineView.__init__(self)
        self.current_url = ''
        self.load(QUrl("https://facebook.com"))
        self.loadFinished.connect(self._on_load_finished)
        self.urlChanged.connect(self._on_url_change)

    def _on_load_finished(self):
        self.current_url = self.url().toString()

    def _on_url_change(self):
        self.page().runJavaScript("document.getElementsByName('email')[0].value", self.store_value)

    def store_value(self, param):
        self.value = param
        print("Param: " +str(param))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    web = WebPage()
    web.show()
    sys.exit(app.exec_())  # only need one app, one running event loop
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45230931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档