2017-09-05 3 views
1

Je suis en train d'écrire un script en utilisant pywinauto pour ouvrir un référentiel dans Informatica gestionnaire de flux de PowerCenter (de v9.6.1)Pourquoi un clic droit envoyé par pywinauto ne change-t-il pas l'état du bouton de connexion grisé dans informatica, mais un vrai clic de souris le fait?

Après les lignes ci-dessous sont exécutées, je reçois le menu contextuel avec l'option de connexion comme dans la capture d'écran. Notez également que le bouton "connecter" de la barre d'outils reste grisé. Si j'utilise la souris actuelle et que je clique sur l'élément treeview pour le référentiel auquel je veux me connecter, le bouton de connexion devient vert et activé. Mais pas quand pywinauto envoie le bon clic.

from pywinauto.application import Application 
from pywinauto.keyboard import SendKeys 
import time 

app = Application().Start(cmd_line=r'C:\PowerCenterClient\client\bin\pmwflmgr.exe') 
informaticaworkflowmanager = app[u'Informatica::WorkflowManager'] 
informaticaworkflowmanager.Wait('ready') 
time.sleep(2) 
systreeview = informaticaworkflowmanager[u'TreeView'] 
tree_item = systreeview.GetItem([u'Repositories', u'REP']) 
tree_item.Select() 
tree_item.Click(button='right',double=True,where='icon') 

enter image description here

J'ai essayé d'utiliser SendKeys pour envoyer 'c' suivi par {} ENTRER et il retourne juste sans rien faire. Aussi, si j'utilise le clavier réel sur le menu contextuel de clic droit généré après les étapes de pywinauto ci-dessus, il sélectionne le menu de connexion quand j'appuie sur c, mais il ne fait rien quand j'appuie sur Entrée. Je pense en quelque sorte que la fonction de connexion n'est pas activée. Je suis désemparé si toute autre entrée est requise par l'application pour l'activer. J'ai également essayé d'utiliser l'option informaticaworkflowmanager.MenuItem(u'&Repository->&Connect...') mais en vain, elle dit qu'elle est désactivée.

Tous les pointeurs pour aider pywinauto à ouvrir un référentiel sont les bienvenus!

+1

Essayez d'abord d'exécuter le script en tant qu'administrateur. Si cela ne vous aide pas, utilisez la méthode click_input(). Il fonctionne réellement comme un utilisateur. La méthode click() envoie WM_CLICK ou BM_CLICK qui n'est probablement pas géré par l'application en état de bouton grisé. –

+0

@VasilyRyabov merci! le click_input() a fonctionné. Vous pouvez ajouter une réponse si vous le souhaitez. Merci aussi de m'avoir présenté à l'ensemble de l'automatisation GUI, ces derniers jours je lisais sur des frameworks similaires (sikuli etc.) c'est comme ouvrir un tout nouveau monde de productivité. Je ne peux pas croire que personne n'en parle plus souvent! – dbza

+0

@VasilyRyabov Je suis coincé à un autre problème maintenant, il a probablement besoin des droits d'administrateur. Comment exécuter l'application(). Start() en tant qu'administrateur? – dbza

Répondre

2

Juste résumant les commentaires ...

  1. d'abord essayer d'exécuter le script en tant qu'administrateur. Si cela n'aide pas, utilisez la méthode click_input(). Il fonctionne réellement comme un utilisateur. La méthode click() envoie WM_CLICK ou BM_CLICK qui n'est probablement pas géré par l'application en état de bouton grisé.

  2. Si vous exécutez le script en tant qu'administrateur, il doit hériter des privilèges du processus enfant par défaut. Il n'y a pas d'indicateur spécial dans la méthode start() car certaines fonctions peuvent ne pas fonctionner si le processus de l'application cible a des privilèges plus élevés. Quoi qu'il en soit, l'élévation nécessite généralement une confirmation de l'utilisateur et cette boîte de dialogue de confirmation de sécurité ne peut pas être automatisée par le système d'exploitation (même click_input() avec les coordonnées codées en dur ne fonctionnera pas tant que cette boîte de dialogue est affichée).