Jump to content

Recommended Posts

Posted (edited)

Hi Community

I am intending to load an intranet webpage that is preceded by a web SSO authentication. To check when my wanted page is successfuly loaded I look after URL and LocationName, that looks to be the best way to check a perfect loading

The problem comes when my original URL typed is replaced by SSO web authentication (that does its job) as I lose the link with the IE object. Therefore I can't check anymore neither URL nor LocationName
(The $hIE remains intact, I checked it)

In summary to be clear
  1. URL typed is https://myurl.com 
  2. Web SSO auto-authentication does its job, URL becomes https://mywebsso.com
  3. Authentication goes on
  4. URL comes back to the expected -> https://myrul.com 

I intended to force a link back with _Ieattach (), but it doesn't work

So my question is, how to make again the link available with my IE object ?

or

Have you a better method to check perfect loading of the expected web page

Here's the code I tried

; Step 1 : Creating RAW IE browser
$oIE = _IECreate ( "about:blank", 0, 1, 1, 1 )
Do
Until IsObj ( $oIE )
$hIE = _IEPropertyGet ( $oIE, "hwnd" )
If IsHWnd ( $hIE ) Then
    Do
        WinActivate ( $hIE )
    Until WinActive ( $hIE )
EndIf
ConsoleWrite ( "IE created successfully" & @CRLF )

; Step 2 : Waiting SSO web authentication
ConsoleWrite ( "Runing SSO authentication" & @CRLF)
_IENavigate ( $oIE, "https://myurl.com", 1 )
Local $oIE_Error = ObjEvent ( "AutoIt.Error", "_IE_Error_Handler" )
While 1
    Local $Location_URL = $oIE.LocationURL ( ) ; _IEPropertyGet ( $oIE, "locationurl" )

    Sleep ( 100 )
WEnd

Func _IE_Error_Handler ( )
    Local $sHexNumber
    
    $sHexNumber = Hex ( $oIE_Error.Number, 8 )
    ConsoleWrite ( "COM Error : " & $sHexNumber & " Desc : " & $oIE_Error.WinDescription  )
    If $sHexNumber == "80010108" Or "800706BA" Then
        Do
            Sleep ( 200 )
            _IEAttach ( $hIE, "hwnd" )
        Until Not @error
    EndIf
EndFunc   ;==>ErrFunc

and console log

IE created successfully
Runing SSO authentication
COM Error : 80010108 Desc : The invoked object has disconnected from its clients.
--> IE.au3 T3.0-2 Warning from function _IEAttach, Cannot register internal error handler, cannot trap COM errors (Use _IEErrorHandlerRegister() to register a user error handler)
--> IE.au3 T3.0-2 Warning from function internal function __IEIsObjType, Cannot register internal error handler, cannot trap COM errors (Use _IEErrorHandlerRegister() to register a user error handler)
--> IE.au3 T3.0-2 Warning from function internal function __IEIsObjType, Cannot register internal error handler, cannot trap COM errors (Use _IEErrorHandlerRegister() to register a user error handler)
--> IE.au3 T3.0-2 Warning from function _IEAttach, Cannot register internal error handler, cannot trap COM errors (Use _IEErrorHandlerRegister() to register a user error handler)
--> IE.au3 T3.0-2 Warning from function internal function __IEIsObjType, Cannot register internal error handler, cannot trap COM errors (Use _IEErrorHandlerRegister() to register a user error handler)
--> IE.au3 T3.0-2 Warning from function internal function __IEIsObjType, Cannot register internal error handler, cannot trap COM errors (Use _IEErrorHandlerRegister() to register a user error handler)



I got a similar problem in a thread I started here, but found a way to bypass it, but this time it's impossible to :/

 

 

Edited by Ebola57
Posted

fixed code:

#include <IE.au3>

Global $hIE
Global $oIE
_IEErrorHandlerRegister(_IE_Error_Handler)

_Example()


Func _Example()
    ; Step 1 : Creating RAW IE browser
    $oIE = _IECreate("about:blank", 0, 1, 1, 1)
    Do
    Until IsObj($oIE)
    $hIE = _IEPropertyGet($oIE, "hwnd")
    If IsHWnd($hIE) Then
        Do
            WinActivate($hIE)
        Until WinActive($hIE)
    EndIf
    ConsoleWrite("IE created successfully" & @CRLF)

    ; Step 2 : Waiting SSO web authentication
    ConsoleWrite("Runing SSO authentication" & @CRLF)
    _IENavigate($oIE, "https://myurl.com", 1)
    While 1
        Local $Location_URL = $oIE.LocationURL() ; _IEPropertyGet ( $oIE, "locationurl" )
        ConsoleWrite($Location_URL & @CRLF)

        Sleep(100)
    WEnd
EndFunc   ;==>_Example


Func _IE_Error_Handler(ByRef $oError)

    Local $sHexNumber = Hex($oError.Number, 8)
    ConsoleWrite("COM Error : " & $sHexNumber & " Desc : " & $oError.WinDescription)
    If $sHexNumber == "80010108" Or "800706BA" Then
        Do
            Sleep(200)
            $oIE = _IEAttach($hIE, "hwnd")
        Until Not @error
    EndIf
EndFunc   ;==>_IE_Error_Handler

and please read this:

 

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 6/4/2020 at 11:55 AM, Danp2 said:

You should be assigning the result of this function to $oIE or some other variable. Otherwise, it's pointless to make this call AFAICS.

Expand  

Indeed, this is a stupid oversight, I am so focused on the error handling

Thanks  

  On 6/4/2020 at 12:14 PM, mLipok said:

fixed code:

#include <IE.au3>

Global $hIE
Global $oIE
_IEErrorHandlerRegister(_IE_Error_Handler)

_Example()


Func _Example()
    ; Step 1 : Creating RAW IE browser
    $oIE = _IECreate("about:blank", 0, 1, 1, 1)
    Do
    Until IsObj($oIE)
    $hIE = _IEPropertyGet($oIE, "hwnd")
    If IsHWnd($hIE) Then
        Do
            WinActivate($hIE)
        Until WinActive($hIE)
    EndIf
    ConsoleWrite("IE created successfully" & @CRLF)

    ; Step 2 : Waiting SSO web authentication
    ConsoleWrite("Runing SSO authentication" & @CRLF)
    _IENavigate($oIE, "https://myurl.com", 1)
    While 1
        Local $Location_URL = $oIE.LocationURL() ; _IEPropertyGet ( $oIE, "locationurl" )
        ConsoleWrite($Location_URL & @CRLF)

        Sleep(100)
    WEnd
EndFunc   ;==>_Example


Func _IE_Error_Handler(ByRef $oError)

    Local $sHexNumber = Hex($oError.Number, 8)
    ConsoleWrite("COM Error : " & $sHexNumber & " Desc : " & $oError.WinDescription)
    If $sHexNumber == "80010108" Or "800706BA" Then
        Do
            Sleep(200)
            $oIE = _IEAttach($hIE, "hwnd")
        Until Not @error
    EndIf
EndFunc   ;==>_IE_Error_Handler

and please read this:

 

Expand  

Going to try your code

Thanks

I allready read this topic, but error handling still difficult to me.

EDIT : Thanks to both of you, Indeed attaching to $oIE is a lot better … and the function _IEErrorHandlerRegister was also the thing i forgot
going to learn deeper error handling now with such return

Have a nice day :)

Edited by Ebola57

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...