Вы можете эмулировать щелчок, отправив QMouseEvent, в случае QWebEngineView щелчок должен быть выполнен для внутреннего виджета, являющегося частью частного API Qt, но с небольшой логикой, к которой можно получить доступ: используя 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_())