jarmo / RAutomation

RAutomation
MIT License
100 stars 33 forks source link

Msuia: button.click in endless loop #97

Closed systestrjr closed 6 years ago

systestrjr commented 9 years ago

First post....coming from watir world.
Our automation suite is expanding to support automating our WPF applications...

C:\Temp\rauto>gem list |grep ffi ffi (1.9.6) C:\Temp\rauto>gem list |grep rautomation rautomation (0.17.0) C:\Temp\rauto>ruby -v ruby 1.9.3p550 (2014-10-27) [i386-mingw32] Inspect Tool: v7.0.0.0 (win7sp1_gdr.110826-1504)

First time going through the 'absolute beginners guide' (using mspaint example) https://github.com/jarmo/RAutomation/wiki/Absolute-Beginner's-Guide

irb code: require 'rautomation' ENV["RAUTOMATION_ADAPTER"] = 'ms_uia' system(start mspaint) pw = RAutomation::Window.new :title => /Paint/ pw.exists? pw.visible? pw.controls.count ;#not sure what to do with this yet => 26 pw.controls.each {|c| p c.value} ;#control_name or control_type dont seem to work => ... pw.buttons.count ;#these are the '-' and '+' buttons at the bottom of that page => 2 pw.button[1].click ;#click '+' => clicks multiple times until it reaches 800%

I also tried to 'limit' it to 1 click but to no avail 1.times { pw.buttons[1].click } => clicks multiple times until it reaches 800%

(Also I know that wiki says 'To be continued'... so I'm asking nicely - if its not too much to ask - can you PLEASE include examples on how to interact with MSPAINT tab, toolbar, pulldown, menu, etc...)

enkessler commented 9 years ago

MsUia::Control#click is written to click until a condition is met. This condition can be passed to the method as a block or you can rely on the default condition of 'the thing that I clicked on is gone'. The default condition of the control going away is fine for things like a close button or a menu item that will go away afterward but sometimes (okay, a LOT of the time) the thing that you want to click will not be going anywhere. In these cases, you'll want to pass in a block so that RAutomation knows when to stop clicking the control.

If all you want to do is click something one time then this should do the trick:

element.click{ true }

enkessler commented 9 years ago

Aside from a wiki update, can we call this one closed?

jarmo commented 9 years ago

Is the block version of click even needed for MsUia adapter? I remember that it was needed for Win32 and AutoIt adapter because they sent a click message to the control, which might have been dismissed by Windows. Doesn't MsUia use some other method, which isn't that flaky? @leviwilson isn't that the case?

leviwilson commented 9 years ago

It's not needed for the MsUia version. #click should use Invoke directly from UI Automation.

jarmo commented 8 years ago

Waiting for a change in MsUia adapter. @leviwilson will you have time to do these changes some time in the future?

jarmo commented 6 years ago

Closing this due to inactivity.