Juvigy

IE automation

15 posts in this topic

Hi Guys,

I have a very complex IE page with lots of Java and Iframes. I need to be able to look for a change in one <input> field. So what i have done is to identify the field and hook an event listener with ObjEvent($title, "_Evt_")  and then i use :

Func _Evt_OnChange()
    Local $o_object = @COM_EventObj
    ConsoleWrite( "Change" & $o_object.value  &@CRLF)
    _FileWriteLine($MainLog, "Change:" & _NOW())
    TitleCheck($o_object.value)
EndFunc

Which work fine user doesn't interact with some of the other buttons or radios on the page. As soon as the user does some interaction or refreshes the page or navigates - the event listener is 'deleted' somehow and no longer works. Any idea how to counteract that? The easiest this is to detect if there is ANY change on the page - then i can identify the INPUT and check for its value. Any idea how to do that ?

Share this post


Link to post
Share on other sites



Any help will be greatly appreciated.

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

ObjEvent($title, "_Evt_")

What is $title ? How you declare this variable ?

 

Edited by mLipok

ADO.au3 UDF     POP3.au3 UDF     XML.au3 UDF    How to use IE.au3  UDF with  AutoIt v3.3.14.x  for other useful stuff click the following button:

Spoiler

Last update: 2016-12-23
Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft Components * TeamViewer API -UDF * JavaManagement UDF * VIES over SOAPPOP3.au3 UDF *  RTF Printer - UDF * XML.au3 - BETA * ADO.au3 UDF SMTP Mailer UDF * WinSCP UDF *

My contribution to others projects: * _sql.au3 UDF  *

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Best coding practices * 

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities *

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, The Art of Computer Programming
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

 

Share this post


Link to post
Share on other sites

$title is an <input> object. I get to it with getElementsByTagName ("input").  Everything works when i first start the script. However if i change the value of another <input> element using the mouse - the event listener stops working ! Which forces me to add event listeners to all inputs fields which makes the script restart which is a lot of work and not very consistent. There has to be easier and more elegant way!

Share this post


Link to post
Share on other sites

Try with $oIE 


ADO.au3 UDF     POP3.au3 UDF     XML.au3 UDF    How to use IE.au3  UDF with  AutoIt v3.3.14.x  for other useful stuff click the following button:

Spoiler

Last update: 2016-12-23
Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft Components * TeamViewer API -UDF * JavaManagement UDF * VIES over SOAPPOP3.au3 UDF *  RTF Printer - UDF * XML.au3 - BETA * ADO.au3 UDF SMTP Mailer UDF * WinSCP UDF *

My contribution to others projects: * _sql.au3 UDF  *

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Best coding practices * 

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities *

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, The Art of Computer Programming
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

 

Share this post


Link to post
Share on other sites
ObjEvent($$oIE  , "_Evt_")

????

What are the events that are supported ?

Share this post


Link to post
Share on other sites

hm...

here is modyfied version:

; Trap COM errors so that 'Back' and 'Forward'
; outside of history bounds does not abort script
; (expect COM errors to be sent to the console)

#include <GUIConstantsEx.au3>
#include <IE.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>

_Example()
Func _Example()
    Local $oIE = _IECreate("www.google.com")

    Local $oBody = _IETagNameGetCollection($oIE, "body", 0)
    Local $oTags_coll = _IETagNameGetCollection($oBody, 'input')
    Local $aEvents[1]
    Local $i = 0
    For $oTag_enum In $oTags_coll
        $aEvents[$i] = ObjEvent($oTag_enum, "_IEEvent_")
        If @error Then ConsoleWrite('! ---> @error=' & @error & '  @extended=' & @extended & ' : ObjEvent' & @CRLF)
        $i += 1
        ConsoleWrite("> $i=" & $i & @CRLF)
        ReDim $aEvents[$i + 1]
    Next
    ConsoleWrite("! Ubound=" & UBound($aEvents) & @CRLF)

;~  Local $oIEEvents = ObjEvent($oIE, "_IEEvent_", "DWebBrowserEvents2")
EndFunc   ;==>_Example

; Waiting for user to stop script manually
While Sleep(100)
WEnd

Func _IEEvent_OnChange()
    Local $oCOM_EventObj = @COM_EventObj
    ConsoleWrite("Change: " & $oCOM_EventObj.value & @CRLF)
EndFunc   ;==>_IEEvent_OnChange

Func _IEEvent_onmouseover()
    Local $oCOM_EventObj = @COM_EventObj
    ConsoleWrite($oCOM_EventObj.tagname & " : " & $oCOM_EventObj.id & @LF)
EndFunc   ;==>_IEEvent_onmouseover

 


ADO.au3 UDF     POP3.au3 UDF     XML.au3 UDF    How to use IE.au3  UDF with  AutoIt v3.3.14.x  for other useful stuff click the following button:

Spoiler

Last update: 2016-12-23
Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft Components * TeamViewer API -UDF * JavaManagement UDF * VIES over SOAPPOP3.au3 UDF *  RTF Printer - UDF * XML.au3 - BETA * ADO.au3 UDF SMTP Mailer UDF * WinSCP UDF *

My contribution to others projects: * _sql.au3 UDF  *

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Best coding practices * 

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities *

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, The Art of Computer Programming
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

 

Share this post


Link to post
Share on other sites

Basically I do the same thing. The problem is that if i do some changes with the mouse - the events are lost.

For example i have 2 dropdown input boxes and 1 label. I want to monitor the value of the label. I set event on the label monitoring change. And if i change value on the label at this point - everything is ok and works. But if i use the drop down - after that the listening event on the label stops working. So i need to set events on all drop downs and setup events to restart the script if a drop down is used to reattach listening event on the label. Problem is there are soo many dropdowns and not only dropdowns but other elements and some special conditions that make scripting that a lot of work. Isn't there a better way?
 Something like :

Local $oIE = _IECreate("www.google.com")
 $event = ObjEvent($oIE, "_Evt_")
 
 Func _Evt_OnChange()
    'check label value
    'if value is changed display msg
 Endfunc

 

Share this post


Link to post
Share on other sites

The second example loaded in this post by the guru @trancexx might interest you ...


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites

@Chimp Thanks for the link I was searching for the following example.....

@Juvigy I think you would like to use @trancexx  example from post #16

 

 


ADO.au3 UDF     POP3.au3 UDF     XML.au3 UDF    How to use IE.au3  UDF with  AutoIt v3.3.14.x  for other useful stuff click the following button:

Spoiler

Last update: 2016-12-23
Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft Components * TeamViewer API -UDF * JavaManagement UDF * VIES over SOAPPOP3.au3 UDF *  RTF Printer - UDF * XML.au3 - BETA * ADO.au3 UDF SMTP Mailer UDF * WinSCP UDF *

My contribution to others projects: * _sql.au3 UDF  *

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Best coding practices * 

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities *

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, The Art of Computer Programming
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

 

Share this post


Link to post
Share on other sites

I tried it , but it doesnt work. I get a lot of errors due to old autoit version.
 Events are fired , but

Func Event_onclick($oEvtObj)
    If IsObj($oEvtObj) Then
        ConsoleWrite("onclick = " & $oEvtObj & @CRLF)
        ;ConsoleWrite("id = " & $oEvtObj.srcElement & " fired onclick" & @CRLF)
        If $oEvtObj = $oIE.document.getElementById("idButton") Then
            $oIE.Quit()
            Exit
        EndIf
    EndIf
EndFunc

the commented line gives me "The requested action with this object has failed.:"

Also i don't see anything that would help me here.  What am i missing?

 

Share this post


Link to post
Share on other sites

@Chimp

@mLipok

I almost managed to do it. Now i use Browser_DocumentComplete event which inside contain $event = ObjEvent($title, "_Evt_").

The problem is that Browser_DocumentComplete event  fires twice which in turn attaches 2 events on $title which in turn fires 2 "Onchange" events.

How can i make it to be just one ?

Share this post


Link to post
Share on other sites
16 hours ago, Juvigy said:

I almost managed to do it. Now i use Browser_DocumentComplete event which inside contain $event = ObjEvent($title, "_Evt_").

can you post what's your script so far...

16 hours ago, Juvigy said:

The problem is that Browser_DocumentComplete event  fires twice which in turn attaches 2 events on $title which in turn fires 2 "Onchange" events.

How can i make it to be just one ?

is your script refreshing the web page, or it changes something in the page layout, within the "Browser_DocumentComplete" function?? if so this could trigger the 'Browser_DocumentComplete' event function twice...(just a wild guess)

 

16 hours ago, Juvigy said:

 

How can i make it to be just one ?

... in the 'COM reference' of the AutoIt help, within the example of the "COM events" session, I see that them makes use of this method:

$oEventObject.stop ; Tell IE we want to stop receiving Events

maybe you could use this method to temporary 'pause' the events during page refresh or updates so to avoid unwanted event firing..?? (a wild guess again)

... posting a working reproducer of your script could be of help to help...


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites

#14 ·  Posted (edited)

4 hours ago, Chimp said:

... in the 'COM reference' of the AutoIt help, within the example of the "COM events" session, I see that them makes use of this method:

$oEventObject.stop ; Tell IE we want to stop receiving Events

 

This seems interesting - i will see if i can use that. So basically the documentcomplete event fires twice , because i have 2 frames. It fires for each frame.

Here is my code:

Func Browser_DocumentComplete($oDisp, $sUrl)
    ConsoleWrite("DocumentComplete:"&$oDisp.ReadyState &@CRLF)
    $event = ObjEvent($title, "_Evt_") ; title is an input object
EndFunc

I think i can use  $oDisp to identify which frame fired the event , but i cant find how - cant seem to find the methods of that object in the IE documentation. For example $oDisp.Name works , but $oDisp.SomethingElseICanUse doesnt.

Another Q - how can i see that there is already an active event handler attached to an object? For example to modify above like this so i can have only 1 title event:

Func Browser_DocumentComplete($oDisp, $sUrl)
    ConsoleWrite("DocumentComplete:"&$oDisp.ReadyState &@CRLF)
    If IsEvent($event) then return 1
    $event = ObjEvent($title, "_Evt_") ; title is an input object
EndFunc

@edit I managed to do it using If $oDisp.LocationName <> "Some location"  then    ContinueLoop - thus event is added only once.

Now i face another issue - clicking an calendar control on the page 'deletes' all my events. This is the java code that i think does that:

javascript:tpzOnFocus('X100');openCalendar(document.topaz, document.topaz.X100);

Now i am wondering what to do now ?

Edited by Juvigy
cracked it

Share this post


Link to post
Share on other sites

So i tested a bit more and there are few things from the helpfile that are not working for me:
 

Quote

$EventObject.stop            ; Tell IE we want to stop receiving Events
$EventObject=0               ; Kill the Event Object

If you don't know (for some reason) the names of the events, you can add a UDF with only the prefix. In this example: Func IEEvent_($Eventname).
When an event is received and no IEEvent_ Eventname UDF exists, this function will be called instead and the name of the event will be placed in the variable $Eventname.

All this is not working for me. Reproducer on the last part can be found here :

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • mjolnirmarkiv
      By mjolnirmarkiv
      Hi!
      Does anyone have any idea why Test() returns 0, while Test2() returns 1?
      #include <IE.au3> MsgBox(0, "", Test() & " " & Test2()) Func Test() Local $oHTML = ObjCreate("HTMLFILE") $oHTML.body.innerHTML = FileRead("Test.html") Return IsObj($oHTML.getElementsByClassName("example")) EndFunc Func Test2() Local $oIE = _IEAttach("", "instance", 1) Return IsObj($oIE.document.getElementsByClassName("example")) EndFunc Sample Test.html I open in IE before testing:
      <!DOCTYPE html> <html> <body> <p class="example"></p> <div class="example"></div> </body> </html> I'm receiving html text in a response to http request, I need to parse it fast and easy, getElementsByClassName would have been ideal. I'm using 3.3.12.0 version.
    • ADIN
      By ADIN
      When at some page i access by  IE.au3 appears javascript alert all my code stops and i cant do nothing. Is there any way to stop executing javascript at this page or any way to force autoit to click "OK" when this alert appears?
       
      _IENavigate($oIE, "www.example.com") _IELoadWait($oIE) ; site is loaded and alert appears Send("{ENTER}") ;i want to close alert, this command is not executed, whole script is freeze ; cant do nothing more here....  
    • ADIN
      By ADIN
      I want use _IEFormGetCollection to get form content which was generated by javascript
      Local $oIE = _IECreate("https://www.example.com/login.html") ;Open the login page Local $oSpans = _IETagNameGetCollection($oIE, "span") For $oSpan In $oSpans if $oSpan.innertext == "Login" Then _IEAction($oSpan, "click") EndIf Next ;click span which ganerate by javascript login form Local $oForm = _IEFormGetCollection($oIE, 0) ;get my form, but that was not on website after loading, appears after click button and this function cant see it Local $oEmail = _IEFormElementGetObjByName($oForm, "email") ; trying to parse form but cant _IEFormElementSetValue($oEmail, "example@gmail.com") ; _IEFormGetCollection dont see generated dynamically elements Is here any way to _IETagNameGetCollection read website content again after i inititate a javascript which generate additional content?
    • dumbledown
      By dumbledown
      Hi,
      I'm new to AutoIt but it looks great.
      I want to get the text from Internet Explorer when hovering the mouse over an image, the statusbargettext function appears to be the way to go.
      When running via a hotkey I return a blank, but the msgbox works. Do you know what I'm doing wrong?
      Thanks
      HotKeySet("!x", "RecordURL") ;wait for ALT-a keystroke While 1 ;loop forever to wait for the keypress Sleep(100) ;no need to kill the CPU WEnd Func RecordURL() #include <MsgBoxConstants.au3> AutoItSetOption("WinTitleMatchMode", 2) Local $sText = StatusbarGetText("Internet Explorer") MsgBox($MB_SYSTEMMODAL, "", "Internet Explorer's status bar says: " & $sText) EndFunc  
       
    • boooooom
      By boooooom
      I'm trying to get the HTML code after executing javascript in IE. Here is my code.
      $url = "http://example.com" $oIE = _IECreate($url) Sleep(3000) ;waiting for executing javascript. But useless. $oFrame = _IEFrameGetCollection($oIE, 0) $sCode &= _IEPropertyGet($oFrame, "innerhtml") & @CRLF Then, I get this error.
      "C:\Program Files (x86)\AutoIt3\Include\IE.au3" (2308) : ==> The requested action with this object has failed.: $oTemp = $oObject.document.body $oTemp = $oObject^ ERROR After executing javascript, when I view source in IE, there are HTML code like below.
      <html> <head> ... </head> <body> ... </body> </html> What should I do?