Bonjour à tous.

Comme écrit dans le titre de la discussion, je cherche à générer automatiquement des actions claviers/souris dans une interface PyQt de ma conception, et plus spécifiquement dans un widget QWebEngineView. Dans le meilleur des cas, je voudrais que ces actions se fassent sur une application en arrière-plan sans prendre la main sur les inputs de l'utilisateur.

Je travaille actuellement sur Windows 10, sur VScode et dans un environnement virtuelle python version 3.10.1 avec les packages suivants :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
Package           Version
PyQt5             5.15.8
PyQt5-Qt5         5.15.2
PyQt5-sip         12.11.1
PyQtWebEngine     5.15.6
PyQtWebEngine-Qt5 5.15.2
setuptools        58.1.0
Actuellement, je me suis concentré sur la recherche d'une solution pour réaliser des actions souris. J'ai trouvé plusieurs solutions sur le web mais aucune ne fonctionne dans mon cas.

La première solution que j'ai trouvée proviens de ce thread : https://stackoverflow.com/questions/...te-mouse-event
J'ai repris la solution donnée dans la réponse de "yage" que j'ai traduit en Python et où j'ai remplacé le QTimer::singleShot par un QThread.usleep pour réaliser le délai de 0.2 s. Malheureusement, aucun clique souris ne se produit. C'est la solution actuellement implémenter dans mon code.

La deuxième solution vient de ce thread : https://www.developpez.net/forums/d2...souris-bureau/
Pour cette solution, la souris se déplace bien là où je lui dis de se déplacer mais je n'ai pas compris à quoi correspond la fonction mouse_event en python dans la deuxième partie du thread. Je ne peux donc pas cliquer avec la souris. De plus, cette solution semble prendre la main sur la souris de l'utilisateur. Ce n'est donc pas ce que je recherche dans mon cas.
J'ai implémenté la partie déplacement de la souris dans mon code pour voir où est-ce que la souris est censée cliquer.

La troisième solution est d'utiliser QtTest et la fonction MouseClick mais, là encore, aucun clique souris ne se produit.

Voici le code que j'ai actuellement réalisé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import PyQt5.QtWidgets as qtw # For widget
import PyQt5.QtGui as qtg # For Mouse event and cursor
import PyQt5.QtCore as qtc # For enumeration
import PyQt5.QtWebEngineWidgets as wew #For web engine view
import PyQt5.QtTest as qtt # For test mouse click
 
import typing
 
class MainWinApp(qtw.QMainWindow):
   """@brief GUI creation"""
   def __init__(self) -> None:
      super().__init__()
 
      #Resize main window
      self.resize(800,400)
 
      #Set web browser view
      self.webbrowser = wew.QWebEngineView()
      self.setCentralWidget(self.webbrowser)
      self.webbrowser.setUrl(qtc.QUrl("https://www.youtube.com/"))
 
      #Set navigation bar
      self.navbar = qtw.QToolBar("NavBar")
      self.addToolBar(self.navbar)
 
      #Set "my action" button in navigation bar
      btn_action = qtw.QAction("my action",self)
      btn_action.setStatusTip("Start action")
      btn_action.triggered.connect(self.MouseAction)
      self.navbar.addAction(btn_action)
 
      #Display window
      self.show()
 
   """@brief Action of navigation bar button my action"""
   def MouseAction(self) -> None:
      #Calcul mouse cursor position for click in the middle of web browser view
      w = self.webbrowser.frameGeometry().width()
      h = self.webbrowser.frameGeometry().height()
      x = self.webbrowser.frameGeometry().x()+ self.frameGeometry().x()
      y = self.webbrowser.frameGeometry().y()+self.frameGeometry().y()
      poscursorx = int(x +w/2)
      poscursory = int(y +h/2)
      print(f"x {poscursorx}, y {poscursory}")
      pos = qtc.QPoint(poscursorx,poscursory)
 
      #Move the mouse cursor to the position of the click (In theory, not necessary for the mouse click to take place. I put this to see where my mouse cursor should normally click.)
      cursor = qtg.QCursor()
      cursor.setPos(poscursorx,poscursory)
 
      #Do mouse click
      Click_mouse(self.webbrowser,pos)
      #qtt.QTest.mouseClick(self,qtc.Qt.MouseButton.LeftButton,qtc.Qt.KeyboardModifier.NoModifier,pos=pos)     
 
"""@brief Do left button mouse click at the position gave in parameter
@param widget Widget targgeted by mouse click
@param pos Position where the mouse click should be do"""
def Click_mouse(widget : qtw.QWidget,pos : qtc.QPoint) -> None:
   #Push left mouse button
   event = qtg.QMouseEvent(qtc.QEvent.Type.MouseButtonPress,pos,qtc.Qt.MouseButton.LeftButton,qtc.Qt.MouseButton.NoButton,qtc.Qt.KeyboardModifier.NoModifier)
   qtc.QCoreApplication.postEvent(widget,event)
 
   #Wait 200 ms
   qtc.QThread.usleep(200000)
 
   #Release left mouse button
   event = qtg.QMouseEvent(qtc.QEvent.Type.MouseButtonRelease,pos,qtc.Qt.MouseButton.LeftButton,qtc.Qt.MouseButton.NoButton,qtc.Qt.KeyboardModifier.NoModifier)
   qtc.QCoreApplication.postEvent(widget,event)
 
#main
if __name__ == "__main__" :
   #Application creation
   app = qtw.QApplication([])
   app.setApplicationName("Youtube Sniffer")
 
   #Window creation
   window = MainWinApp()
 
   #Start application
   app.exec()
 
   #Delete data in web browser
   window.webbrowser.page().profile().cookieStore().deleteAllCookies()
Au lancement du programme, ce dernier affiche une fenêtre avec une toolbar contenant un bouton "my action" et une vue sur le navigateur web. Un clique sur le bouton "my action" appelle la méthode "MouseAction" de la class de ma fenêtre qui devrait normalement réaliser un clique souris au milieu du widget QWebEngineView de ma fenêtre Qt.

Dans l'attente de vos suggestions.

Ardra