Jump to content

Recommended Posts

Posted (edited)

I have one script that creates _IECreateEmbedded and another script that does _IEAttach.

I do this because when autoit is doing something, the Embedded IE starts stalling (eg jquery progress animation)

But there is a new problem.

When IE is having its own process (like in the example above) any _IE command is slow (in the script that Attaches).

Here is a comparison of when its in separate and when its in same process:

Separate process _IETagNameGetCollection : 5000ms

Separate process _IEAction: 850ms

Same process _IETagNameGetCollection : 1ms

Same proccess _IEAction: 135ms

 

If I try to attach to an embedded IE that is done in c#, I get lightning fast results.

As you can see, _IE functions work very slow when the embedded IE we are attaching to is made in Autoit.

 

I did a test and if I empty the WHILE loop in IE process I get these results(but the cpu is at 30% as expected):

Separate process _IETagNameGetCollection : 33ms

Separate process _IEAction: 13ms

 

It slows down if you put anything (like GUIGetMsg) in the WHILE loop.

 

How do I fix this?

 

Create IE:

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

Local $oIE = _IECreateEmbedded()
GUICreate("My Embedded Web control Test", 640, 580, (@DesktopWidth - 640) / 2, (@DesktopHeight - 580) / 2, $WS_OVERLAPPEDWINDOW + $WS_CLIPSIBLINGS + $WS_CLIPCHILDREN)
GUICtrlCreateObj($oIE, 10, 40, 600, 360)

GUISetState(@SW_SHOW) ;Show GUI

_IENavigate($oIE, "http://www.autoitscript.com")


$timer = TimerInit()
$oLink = _IETagNameGetCollection($oIE, "a", 3) ;takes 1ms
ConsoleWrite(TimerDiff($timer) & @CRLF)

$timer = TimerInit()
_IEAction($oLink, "click")  ;takes 135ms
ConsoleWrite(TimerDiff($timer) & @CRLF)



While 1
    Local $iMsg = GUIGetMsg()
    Select
        Case $iMsg = $GUI_EVENT_CLOSE
            ExitLoop
    EndSelect
WEnd

 

Attach to IE:

#include <IE.au3>

Local $oIE = _IEAttach("My Embedded Web control Test", "embedded")




$timer = TimerInit()
$oLink = _IETagNameGetCollection($oIE, "a", 3)  ; 5000ms
ConsoleWrite(TimerDiff($timer) & @CRLF)

$timer = TimerInit()
_IEAction($oLink, "click")  ; 850ms
ConsoleWrite(TimerDiff($timer) & @CRLF)

 

 

attach.au3Fetching info...

create.au3Fetching info...

Edited by milos83
Posted

I replicated the issue, could this be a question for developers? @Jos

Seeing as no one has replied.

  Reveal hidden contents

IUIAutomation - Topic with framework and examples

Au3Record.exe

Posted

I will try in next 8 hour

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

Posted (edited)

I have some progress.

EDIT:
I'm tired, going sleep, will check it toomorow.

Edited by mLipok

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

Posted

I'm at work in my office.
This is problem which I must look closer at night.

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

Posted

Try this  modified _IETagNameGetCollection_mod()  :

#include <IE.au3>

_Example()
Func _Example()
    Local $timer = TimerInit()

;~  Local $oIE = _IEAttach("http://www.autoitscript.com", "url") ; for testing with stnadard IE - not embedded
    Local $oIE = _IEAttach("My Embedded Web control Test", "embedded") ; for testing with embedded IE
    ConsoleWrite(@ScriptLineNumber & " " & TimerDiff($timer) & @CRLF)

    Local $oLink = _IETagNameGetCollection($oIE, "a", 3) ; 5000ms
    ConsoleWrite(@ScriptLineNumber & " " & TimerDiff($timer) & @CRLF)

    $timer = TimerInit()
    $oLink = _IETagNameGetCollection_mod($oIE, "a", 3) ; 5000ms
    ConsoleWrite(@ScriptLineNumber & " " & TimerDiff($timer) & @CRLF)

    $timer = TimerInit()
    _IEAction($oLink, "click") ; 850ms
    ConsoleWrite(@ScriptLineNumber & " " & TimerDiff($timer) & @CRLF)

EndFunc   ;==>_Example


Func _IETagNameGetCollection_mod(ByRef $oObject, $sTagName, $iIndex = -1)
    If Not IsObj($oObject) Then
        __IEConsoleWriteError("Error", "_IETagNameGetCollection", "$_IESTATUS_InvalidDataType")
        Return SetError($_IESTATUS_InvalidDataType, 1, 0)
    EndIf
    ;
    If Not __IEIsObjType($oObject, "browserdom") Then
        __IEConsoleWriteError("Error", "_IETagNameGetCollection", "$_IESTATUS_InvalidObjectType")
        Return SetError($_IESTATUS_InvalidObjectType, 1, 0)
    EndIf

    ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
    Local $oTemp
    If __IEIsObjType($oObject, "documentcontainer") Then
        $oTemp = _IEDocGetObj($oObject)
    Else
        $oTemp = $oObject
    EndIf

    ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
    $iIndex = Number($iIndex)
    Local $oTemp2 = $oTemp.GetElementsByTagName($sTagName)
    ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
    Select
        Case $iIndex = -1
            ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
            Return SetError($_IESTATUS_Success, $oTemp2.length, _
                    $oTemp2)
        Case $iIndex > -1 And $iIndex < $oTemp2.length
            ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
            Return SetError($_IESTATUS_Success, $oTemp2.length, _
                    $oTemp2.item($iIndex))
        Case $iIndex < -1
            ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
            __IEConsoleWriteError("Error", "_IETagNameGetCollection", "$_IESTATUS_InvalidValue", "$iIndex < -1")
            Return SetError($_IESTATUS_InvalidValue, 3, 0)
        Case Else
            ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
            __IEConsoleWriteError("Error", "_IETagNameGetCollection", "$_IESTATUS_NoMatch")
            Return SetError($_IESTATUS_NoMatch, 0, 0) ; Could be caused by parameter 2, 3 or both
    EndSelect
    ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
EndFunc   ;==>_IETagNameGetCollection_mod

 

This is not solution to this problem but it is speed up for IE.au3    _IETagNameGetCollection() function.

I am still researching the problem to know the cause and the solution.

 

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

Posted
  On 1/24/2018 at 9:49 PM, mLipok said:

Try this  modified _IETagNameGetCollection_mod()  :

#include <IE.au3>

_Example()
Func _Example()
    Local $timer = TimerInit()

;~  Local $oIE = _IEAttach("http://www.autoitscript.com", "url") ; for testing with stnadard IE - not embedded
    Local $oIE = _IEAttach("My Embedded Web control Test", "embedded") ; for testing with embedded IE
    ConsoleWrite(@ScriptLineNumber & " " & TimerDiff($timer) & @CRLF)

    Local $oLink = _IETagNameGetCollection($oIE, "a", 3) ; 5000ms
    ConsoleWrite(@ScriptLineNumber & " " & TimerDiff($timer) & @CRLF)

    $timer = TimerInit()
    $oLink = _IETagNameGetCollection_mod($oIE, "a", 3) ; 5000ms
    ConsoleWrite(@ScriptLineNumber & " " & TimerDiff($timer) & @CRLF)

    $timer = TimerInit()
    _IEAction($oLink, "click") ; 850ms
    ConsoleWrite(@ScriptLineNumber & " " & TimerDiff($timer) & @CRLF)

EndFunc   ;==>_Example


Func _IETagNameGetCollection_mod(ByRef $oObject, $sTagName, $iIndex = -1)
    If Not IsObj($oObject) Then
        __IEConsoleWriteError("Error", "_IETagNameGetCollection", "$_IESTATUS_InvalidDataType")
        Return SetError($_IESTATUS_InvalidDataType, 1, 0)
    EndIf
    ;
    If Not __IEIsObjType($oObject, "browserdom") Then
        __IEConsoleWriteError("Error", "_IETagNameGetCollection", "$_IESTATUS_InvalidObjectType")
        Return SetError($_IESTATUS_InvalidObjectType, 1, 0)
    EndIf

    ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
    Local $oTemp
    If __IEIsObjType($oObject, "documentcontainer") Then
        $oTemp = _IEDocGetObj($oObject)
    Else
        $oTemp = $oObject
    EndIf

    ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
    $iIndex = Number($iIndex)
    Local $oTemp2 = $oTemp.GetElementsByTagName($sTagName)
    ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
    Select
        Case $iIndex = -1
            ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
            Return SetError($_IESTATUS_Success, $oTemp2.length, _
                    $oTemp2)
        Case $iIndex > -1 And $iIndex < $oTemp2.length
            ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
            Return SetError($_IESTATUS_Success, $oTemp2.length, _
                    $oTemp2.item($iIndex))
        Case $iIndex < -1
            ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
            __IEConsoleWriteError("Error", "_IETagNameGetCollection", "$_IESTATUS_InvalidValue", "$iIndex < -1")
            Return SetError($_IESTATUS_InvalidValue, 3, 0)
        Case Else
            ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
            __IEConsoleWriteError("Error", "_IETagNameGetCollection", "$_IESTATUS_NoMatch")
            Return SetError($_IESTATUS_NoMatch, 0, 0) ; Could be caused by parameter 2, 3 or both
    EndSelect
    ConsoleWrite("! " & @ScriptLineNumber & " " & @MIN & ":" & @SEC & ":" & @MSEC & @CRLF)
EndFunc   ;==>_IETagNameGetCollection_mod

 

This is not solution to this problem but it is speed up for IE.au3    _IETagNameGetCollection() function.

I am still researching the problem to know the cause and the solution.

 

Expand  

Thanks @mLipok

Basically, the _IETagNameGetCollection() was just an example.

Most of _IE UDF functions are slowed down.

 

Posted

I know as I said this is not a solution just a speed up, and an information to show that I'm working on this.

Question 1:
Did you make test on older Au3 version ?
 

Question 2:
Did you make test on few different system WIn7, 8, 8.1, 10 and with different IE version ? with different ServicePack or without recent Windows Updates ?

I have only fully updated Windows station and do no have possibility to test on different environment.

 

Q

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

Posted (edited)
  On 1/25/2018 at 11:44 AM, mLipok said:

I know as I said this is not a solution just a speed up, and an information to show that I'm working on this.

Question 1:
Did you make test on older Au3 version ?
 

Question 2:
Did you make test on few different system WIn7, 8, 8.1, 10 and with different IE version ? with different ServicePack or without recent Windows Updates ?

I have only fully updated Windows station and do no have possibility to test on different environment.

 

Q

Expand  

Tested on win7 and win10. both fully updated. Latest Autoit.

Latest test showed something interesting.

If you rightclick the embedded IE  the requests are fast again and issue is gone!

Run this with and then without rightclick context menu up or just give it a right click while its running and see the timers.

 

#include <IE.au3>

Local $oIE = _IEAttach("My Embedded Web control Test", "embedded")

For $i = 1 To 20
    
    $timer = TimerInit()
    $oLink = _IETagNameGetCollection($oIE, "a", 3)  ; 5000ms
    ConsoleWrite(TimerDiff($timer) & @CRLF)

Next

 

There is another bug regarding _IEAttach that I discovered today.

After about a minute from attaching about 4 _IEGetObjById requests will crash the autotit entirely giving "Autoit has been closed...".

Opposed to the first bug, this one happens no matter if the embedded IE is made in AutoIt or C#. 

That means its an _IEAttach issue.

I'll test on win 10 and see if it acts the same and I'll make another thread about it.

This second bug appears only on win 7.

 

 

Edited by milos83
Posted

And here the other bug reproducer.

This script will cause Autoit v3 Script has stopped working crash

#include <IE.au3>

$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
Local $oIE = _IEAttach("My Embedded Web control Test", "embedded")


For $i = 1 To 1000
    $obj = _IEGetObjById($oIE, "main-content")
    ConsoleWrite("Run:" & $i & @TAB & IsObj($obj) & @CRLF)
    ;Fails after about 590 cycles
;~  Sleep(1000); takes 10 min with this sleep and about 10s without it.
Next


Func MyErrFunc()
EndFunc

It only happens if the embedded IE script has an empty WHILE loop (that is done in order to avoid the IE UDF delays regarding the first bug).

This means, once you are attached, you have a limited number of actions you can send to IE.

eg. If you add _IEAction focus to the script above, the number of steps until the crash is halved.

 

Opposed to the limit on number of actions, when attaching to c# made IE embedded, we have a time limit and its about 70 seconds!

No matter if you send one of 1000 actions, it fails after about a minute.

 

Posted (edited)
  On 1/25/2018 at 4:36 PM, milos83 said:

If you rightclick the embedded IE  the requests are fast again and issue is gone!

Expand  

Confirm that issue is gone in this workaround.
Also confirm that in case when While Wend loop is empty then the speed is fast.


Here are my testing scripts:
 

  Reveal hidden contents

I test this with Au3.3.14.2, Au3.3.12.0, Au3.3.10.0, Au3.3.8.1, all version works in the sam way - slowly in this testing scenario.

 

I'm not an system enginer or C++ dev, so my answer is only a guess.

The problem is in how Sleep() or GUIGetMsg() works.
This two functions internall make an internall loop which literaly sleep's Au3 script durring interpretation.

When internall loop is in progress, then no more messages, communication is maintained by Au3 Core so also, embeded IE is not exposed ("in real time") to the outer environment, this mean any program which want to access embeded object must wait to the end of internall loop.

Hower IMHO this is looking like an issue as Sleep() or GUIGetMsg() should generate only few miliseconds delay.

 

More precise answer could be done by @Jon or @trancexx.

 

Edited by mLipok

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

Posted (edited)
  On 1/26/2018 at 12:15 PM, milos83 said:

And here the other bug reproducer.

This script will cause Autoit v3 Script has stopped working crash

#include <IE.au3>

$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
Local $oIE = _IEAttach("My Embedded Web control Test", "embedded")


For $i = 1 To 1000
    $obj = _IEGetObjById($oIE, "main-content")
    ConsoleWrite("Run:" & $i & @TAB & IsObj($obj) & @CRLF)
    ;Fails after about 590 cycles
;~  Sleep(1000); takes 10 min with this sleep and about 10s without it.
Next


Func MyErrFunc()
EndFunc

It only happens if the embedded IE script has an empty WHILE loop (that is done in order to avoid the IE UDF delays regarding the first bug).

This means, once you are attached, you have a limited number of actions you can send to IE.

eg. If you add _IEAction focus to the script above, the number of steps until the crash is halved.

 

Opposed to the limit on number of actions, when attaching to c# made IE embedded, we have a time limit and its about 70 seconds!

No matter if you send one of 1000 actions, it fails after about a minute.

 

Expand  

I little modify your testing script:
 

#include <IE.au3>

;~ $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
_IEErrorHandlerRegister(MyErrFunc)
Local $oIE = _IEAttach("My Embedded Web control Test", "embedded")


For $i = 1 To 100000
    $obj = _IEGetObjById($oIE, "main-content")
    If @error Then ConsoleWrite('! ---> @error=' & @error & '  @extended=' & @extended & ' : ' & @CRLF)
    ConsoleWrite("Run:" & $i & @TAB & IsObj($obj) & @CRLF)
Next

Func MyErrFunc($oError)
    ; Do anything here.
    ConsoleWrite( _
            @ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
            @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
            @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
            @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
            @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
            @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
            @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
            @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
            @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
            @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
EndFunc   ;==>_ErrFunc

And I do not have any problem in 10000 pasess.

 

Edited by mLipok

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

Posted
  On 1/30/2018 at 11:02 PM, mLipok said:

I little modify your testing script:
 

#include <IE.au3>

;~ $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
_IEErrorHandlerRegister(MyErrFunc)
Local $oIE = _IEAttach("My Embedded Web control Test", "embedded")


For $i = 1 To 100000
    $obj = _IEGetObjById($oIE, "main-content")
    If @error Then ConsoleWrite('! ---> @error=' & @error & '  @extended=' & @extended & ' : ' & @CRLF)
    ConsoleWrite("Run:" & $i & @TAB & IsObj($obj) & @CRLF)
Next

Func MyErrFunc($oError)
    ; Do anything here.
    ConsoleWrite( _
            @ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
            @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
            @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
            @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
            @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
            @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
            @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
            @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
            @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
            @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
EndFunc   ;==>_ErrFunc

And I do not have any problem in 10000 pasess.

 

Expand  

Still crashes for me after about 800 turns.

Are you sure you used an IE with empty while loop like this:

 

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

Local $oIE = _IECreateEmbedded()
GUICreate("My Embedded Web control Test", 640, 580, (@DesktopWidth - 640) / 2, (@DesktopHeight - 580) / 2, $WS_OVERLAPPEDWINDOW + $WS_CLIPSIBLINGS + $WS_CLIPCHILDREN)
GUICtrlCreateObj($oIE, 10, 40, 600, 360)

GUISetState(@SW_SHOW) ;Show GUI

_IENavigate($oIE, "http://www.autoitscript.com")


While True
WEnd

 

Posted (edited)
  On 1/31/2018 at 2:34 PM, milos83 said:

Still crashes for me after about 800 turns.

Expand  

Which:

  • IE version ?
  • Windows Version 64/32 Bit ?

Please also put here SciTE console output.

 

 

  On 1/31/2018 at 2:34 PM, milos83 said:

Are you sure you used an IE with empty while loop like this:

Expand  

Yes I was tested this with empty loop.

But I do not know what you mean, to what you are refering ?
 

Edited by mLipok

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

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
×
×
  • Create New...