c # - UIAutomation og Remote Desktop Connections

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en applikation, der gør nogle automatisering på en vilkårlig Windows-applikation. Jeg har brugt Notesblok til at teste det.


Under denne automatisering skal jeg påberåbe sig begivenheder fra koden. Jeg støtter i øjeblikket to typer begivenheder, da de synes at være de mest almindelige, InvokePattern og ExpandCollapsePattern. [2] [3]


Jeg bruger en computer, som jeg kan remote desktop til at gøre testen. Men det er underligt. Når jeg er tilsluttet computeren via Remote Desktop, fungerer applikationen fint. Når jeg afbryder forbindelsen fra computeren, stopper min kode med at arbejde for ExpandCollapsePattern (InvokePattern fungerer fint). Jeg får en InvalidOperationException.


Dokumentationen siger, at dette kun skal kastes, hvis noden er markeret som en LeafNode. Hvad gør Remote Desktop anderledes, da jeg får InvalidOperationException?


Her er koden jeg i øjeblikket skal udføre begivenheden.


ExpandCollapseState state =
    patternMenu.Current.ExpandCollapseState;
if (state == ExpandCollapseState.Expanded)
    patternMenu.Collapse();
else if (state == ExpandCollapseState.PartiallyExpanded ||
         state == ExpandCollapseState.Collapsed)
    patternMenu.Expand();


patternMenu er en ExpandCollapsePattern hentet fra AutomationElement ved hjælp af GetCurrentPattern.


Den nuværende værdi af ExpandCollapseState er 'Collapsed', når jeg udskriver værdien.


EDIT: Enhver chance jeg kan vide, hvorfor jeg fik en downvote og hvordan dette er et dårligt spørgsmål? Jeg er virkelig forvirret af hvad der sker, da det kun ser ud til at mislykkes, når fjernt skrivebord er lukket. Hvis dette er et virkelig dumt spørgsmål, som jeg burde kende svaret på, ville jeg elske en forklaring og derefter en downvote.


Processen, der interagerer med skrivebordet, er ikke en Windows-tjeneste. Det er en applikation, jeg starter efter, at jeg fjerner skrivebordet i computeren. Er det fordi jeg lås skrivebordet?


Jeg bruger 'Terminal Server Client' på Ubuntu for at logge ind på Windows-maskinen. Skal du trykke på tasten Luk på denne applikation, fordi skrivebordet låses?

Bedste reference


Generelt kan du typisk ikke køre UI Automation eller lignende på et ikke-interaktivt skrivebord. Ikke-interaktive desktops har forskellige begrænsninger med hensyn til input: Der er ikke noget fokuseret element, input kan ikke sendes, så alt afhænger af disse vil mislykkes.


Nogle funktioner, som f.eks. At sende Windows-meddelelser, fungerer fint. Hvad der kan ske her er, at InvokePattern-funktionaliteten implementeres under omslagene som meddelelser, så det virker stadig; men udvidelsen/sammenbruddet kan implementeres i form af input, hvilket ville mislykkes.


Ikke klart, hvorfor i det tilfælde det mislykkes, når du lukker klienten (den del forventes), men
ser ud til at fungere, når skrivebordet fjernbetjening låser sig - ville det forvente at opføre det samme i begge tilfælde.


(Bemærk at hvis lokale Ubuntu-skrivebordet låser, skal alt være fint og stadig arbejde, så længe klienten stadig kører. Fjernbetjeningen er stadig 'interaktiv' i det tilfælde, da den har fået en live klient knyttet til det, uanset om klienten selv kører på et interaktivt eller ikke-interaktivt skrivebord - begreberne kan ikke engang gælde for en klient, der kører på et andet operativsystem!)