gpt4 book ai didi

python - 是否可以在自制的网络应用程序中单击?

转载 作者:行者123 更新时间:2023-12-01 07:56:43 25 4
gpt4 key购买 nike

我创建了一个 PyQt5 Web 应用程序,导航到 https://www.google.com/使用以下代码:

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWebEngineWidgets import *

import sys

class MainWindow(QMainWindow):

def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)

self.setWindowTitle("My Window")

self.browser = QWebEngineView()
self.browser.setUrl( QUrl("www.google.com") )
self.setCentralWidget(self.browse)

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

这个想法是我想操纵应用程序内部的点击,因此在谷歌网站上,例如:将鼠标移动到某些位置(x,y),而不影响电脑本身,就像 pyautogui 所做的那样,这意味着我我可以运行在网络应用程序中随机点击的代码,同时我可以在 PC 上执行正常操作,而不会影响鼠标。

我很高兴知道这是否可能。如果是的话,怎么办?

注意:我真的没有 python 经验

最佳答案

您可以通过发送 QMouseEvent 来模拟单击,在 QWebEngineView 的情况下,单击应该发送到一个内部小部件,该小部件是私有(private) Qt API 的一部分,但可以访问一个小逻辑:使用 findChildren 和 QMetaObject。

在以下示例中,点击位置 400、200,在我的例子中,这是一个 Google 横幅,将打开相应的信息。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets


class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)

self.setWindowTitle("My Window")

self.browser = QtWebEngineWidgets.QWebEngineView()
self.browser.setUrl(QtCore.QUrl("https://www.google.com/"))
self.setCentralWidget(self.browser)
self.browser.loadFinished.connect(self.on_loadFinished)

@QtCore.pyqtSlot(bool)
def on_loadFinished(self, ok):
if not ok:
return
w = None
for child in self.browser.findChildren(QtWidgets.QWidget):
if (
child.metaObject().className()
== "QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget"
):
w = child
break
if w is not None:
self.emulate_click(w, QtCore.QPoint(400, 200))

def emulate_click(self, widget, pos):
event_press = QtGui.QMouseEvent(
QtCore.QEvent.MouseButtonPress,
pos,
QtCore.Qt.LeftButton,
QtCore.Qt.LeftButton,
QtCore.Qt.NoModifier,
)
QtCore.QCoreApplication.postEvent(widget, event_press)
event_release = QtGui.QMouseEvent(
QtCore.QEvent.MouseButtonRelease,
pos,
QtCore.Qt.LeftButton,
QtCore.Qt.LeftButton,
QtCore.Qt.NoModifier,
)
QtCore.QCoreApplication.postEvent(widget, event_release)


if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())

如果您有更多信息,例如 id 或 xpath,您可以使用 javascript 单击:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets


class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)

self.setWindowTitle("My Window")

self.browser = QtWebEngineWidgets.QWebEngineView()
self.browser.setUrl(QtCore.QUrl("https://www.google.com/"))
self.setCentralWidget(self.browser)
self.browser.loadFinished.connect(self.on_loadFinished)

@QtCore.pyqtSlot(bool)
def on_loadFinished(self, ok):
if not ok:
return
xpath = r"//body[@id='gsr']/div[@id='viewport']/div[@id='main']/span[@id='body']/center/div[@id='lga']/div[@id='hplogo']/a/img[1]"
s = (
"""
(function() {
var banner = document.evaluate("%s", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
banner.click()
})()"""
% xpath
)
self.browser.page().runJavaScript(s)


if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())

关于python - 是否可以在自制的网络应用程序中单击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55937948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com