[Ex] IE.au3 // Exemples et FAQ

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

[Ex] IE.au3 // Exemples et FAQ

#1

Message par timmalos »

Bonjour à tous. Comme beaucoup d'entre vous bossent avec l'include IE.au3, je poste ici quelques recherches que j'ai pu effectuer sur le sujet. Je mettrai des exemples à la suite en fonction des questions qui se posent sur le forum. Ce post sera tenu propre mais n'hesitez pas à commenter certains exemples si ils ne vous parlent pas !

Bien du courage à ceux qui mettent les mains dans le cambouis :)
Modifié en dernier par timmalos le lun. 18 juil. 2011 09:00, modifié 5 fois.
Raison : Mise à jour du sujet
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [Ex] IE.au3 // Exemples et approfondissements

#2

Message par timmalos »

Qu'est ce qu' IE.au3?

IE.au3 est un UDF qui nous permet d'automatiser, de contrôler et d'utiliser IExplore, le celèbre navigateur de Microsoft, aussi appelé Internet Explorer. La version de base utilisée dépend de votre version de windows.
Pour ceux qui se diraient actuellement : "IE c'est de la daube, rien à foutre de ce sujet à la con", sachez seulement qu'IE est le seul programme installé sur tous les ordinateurs sous Windows qui permet d'acceder à internet. Si vous avez besoin d'utiliser une fonctionnalité avancée d'un navigateur dans votre programme et que ce programme va être distribué à grande echelle, c'est vers IE.au3 qu'il faudra vous tourner.
Cependant, si c'est pour votre usage personnel, vous pouvez envisager l'utilisation de FF.au3 qui utilise Firefox et un module externe à installer nommé MozRepl. Suivez le lien suivant : http://autoitscript.fr/forum/viewtopic.php?f=21&t=2296

La première chose à savoir, c'est que Microsoft propose 2 objets bien distincts :
  • Le premier est l'objet complet, qui permet à peu près de tout faire. A peu de choses près, cela correspond au meme que lorsque vous lancez IExplore.exe manuellement, sauf qu'ici on récupère une variable $oIE qui nous permet de travailler sur cet objet.
    Vous pouvez tester le code suivant qui va juste lancer IE puis se fermer.

    Code : Tout sélectionner

    Local $o = ObjCreate("InternetExplorer.Application")
    $o.visible = 1
    Cette version est celle qui est attachée à _IECreate()
  • Le deuxième est une version minimaliste, mais qui peut être integrée directement dans un programme, ce que ne permet pas le premier.

    Code : Tout sélectionner

    ObjCreate("Shell.Explorer.2")
    Ce dernier doit être integré dans un programme car il ne peut pas fonctionner en autonomie. On utilise pour cela la fonction GUICtrlCreateObj en Autoit.
    Cette version est celle qui est attachée à _IECreateEmbedded()
    Vous pouvez alors voir l'aide de cette fonction pour comprendre le fonctionnement de cet objet.
    Gardez en mémoire que si cet objet est très utile pour être intégré directement dans une fenêtre de votre cru, pour simuler un navigateur internet par exemple, il ne permet pas de TOUT faire comme le premier, et certaines propriétés vous seront interdites.
N'hesitez pas à visiter les liens qui suivent pour plus d'informations.



Comment acceder à la documentation pour aller plus loin que ce que propose IE.au3?

Reference for Visual Basic Developers WebBrowser: (=ACCUEIL de L'aide MSDN)
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Reference for Internet Explorer Object : (=_IECreate)
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Reference for WebBrowser Object : (=_IECreateEmbedded)
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Reference for Document Object:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Reference for A element Object : (<a href=...></a>)
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [Ex] IE.au3 // Exemples et approfondissements

#3

Message par timmalos »

Comment obtenir l'adresse URL de ma fenêtre IE active?

Code : Tout sélectionner

_IEPropertyGet($oIE,"locationurl")
Souvenez vous de la fonction _IEPropertyGet qui peut être une mine d'or. L'aide vous sera fort utile !

Comment obtenir les cookies/en définir de nouveaux sur ma page?

Code : Tout sélectionner

If IsObj($oIE) Then $doc = _IEDocGetObj($oIE)
        If IsObj($doc) Then
            $cookies = string($doc.cookie)
Vous obtiendrez une chaine de charactère contenant tous les cookies de la page. A vous de l'analyser avec des RegExp pour obtenir seulement la valeur souhaitée.
Pour définir de nouveaux cookies, veuillez lire le sujet suivant (EN) http://www.autoitscript.com/forum/topic ... ntry873962


Comment capter les evenements qui surviennent sur ma fenêtre IE?

Dans le premier exemple, IE.au3 n'est pas utilisé.

Tout est basé sur les infos que vous pouvez trouver sur MSDN : http://msdn.microsoft.com/en-us/library ... 85%29.aspx
► Afficher le texteIe Events
Comment prévenir/controler la navigation/rafraichissement/fermeture de ma fenêtre IE?
J'ai eu besoin de contrôler la fermeture d'Internet Explorer, en affichant en message à l'utilisateur pour l'informer que si il fait cela, il perdra tout son travail sur mon application. Il n'existe pas à proprement parler d'evenement OnQuit pour Internet Explorer ce qui rend très difficile cette tâche, même si MSDN dit le contraire :shock:
Voilà donc une solution retenue sur le forum américain par Dale (toujours lui) qui permet de controler le rafraichissement de la page ou la fermeture d'une fenetre IE grâce à du javascript.
► Afficher le texte
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [Ex] IE.au3 // Exemples et FAQ

#4

Message par timmalos »

Comment savoir si la fenêtre IE répond bien?

Il peut arriver que la fenetre Internet Explorer plante completement. Et alors la, vous l'avez bien dans l'os avec votre automatisation de tâche, car tout va planter lamentablement, et un simple ProcessKill() sur IExplore.exe peut ne pas suffire.
Dans ce cas, je vous invite à utiliser le bout de code suivant, qui detecte si votre fenêtre IE freeze ou non :

Code : Tout sélectionner

If IsObj($oIE) Then
        _IELoadWait($oIE)
        $aerror = 0
        $v_ret = DllCall("user32.dll", "int", "IsHungAppWindow", "hwnd", HWnd($oIE.HWND))
        If @error <> 0 Or $v_ret[0] Then $aerror = 1
    Else
        $aerror = 1
    EndIf
si $aerror = 1, Alors vous pouvez enclencher le plan B : Detruire tous les objets, Fermer IE, et relancer votre automatisation.


Comment forcer la fermeture d'IE?
J'ai précedemment publié un outil qui marche à merveille, mieux même que quand vous faites Ctrl+Alt+Del pour forcer la fermeture d'un programme. Suivez le lien suivant, il contient tous les exemples pour la fermeture d'un process IE :
http://autoitscript.fr/forum/viewtopic.php?f=21&t=3761

Vous pourrez voir dans les exemples du lien précédant qu'il vius faut connaitre le PID du process pour pouvoir forcer sa fermeture.

Si vous voulez forcer la fermeture de la fenêtre IE active mais pas des autres fenetres IE, vous pouvez utiliser la fonction suivante _GetHwndFromPID($PID) qui retourne l'Handle de la fenetre à partir du PID. Ainsi vous pourrez comparer l'Handle de la fenetre active à celle retournée et être certain de fermer le bon IExplore.exe
http://autoitscript.fr/forum/viewtopic.php?f=21&t=5411

Comment supprimer le cache d'IE?
Pour certaines simulations, le cache peut poser problème, par exemple en ne téléchargeant pas certaines informations, et pour un système de Log j'avais besoin d'avoir toujours le même temps de chargement de page en cas de réussite du scénario. Voilà donc une fonction qui vide tout le cache d'IE. Cette fonction a été écrite par Tlem.
► Afficher le texteFunc _EmptyIECache()
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [Ex] IE.au3 // Exemples et FAQ

#5

Message par timmalos »

Réservé
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [Ex] IE.au3 // Exemples et FAQ

#6

Message par timmalos »

_IECreateEmbedded est trop limité pour mes besoins, comment faire?

Comme expliqué précedemment, _IECreateEmbedded utilise une version limité d'Internet Explorer, qui ne permet pas de tout faire. Il existe une alternative, mais il vous sera difficile de l'exploiter pleinement sans un niveau suffisant, très peu d'informations étant disponibles à ce sujet.
Cette alternative permet l'utilisation d'une instance d'IE complète, comme si vous utilisiez _IECreate(), tout en l'incorporant à votre fenêtre comme vous le feriez avec ActiveX et _IeCreateEmbedded()

Voilà un code montrant cette alternative: (Plus d'infos ici : http://www.autoitscript.com/forum/topic ... hl__ie+dns)

Code : Tout sélectionner

#Include <WindowsConstants.au3>
#include <WinAPI.au3>
#Include <Constants.au3>
local $pid, $hHandle, $hGUI, $sURL, $xHeight, $xWidth
$sURL = "www.google.com"
$xWidth = 1024
$xHeight = 568
$hGUI = GUICreate("Test", $xWidth, $xHeight)
$oIE = _IECreate2($xWidth, $xHeight, $hGUI)
;Apres cette ligne, vous pouvez utilisez les fonctions _IE comme vous l'auriez fait normalement.

func _IECreate2($xWidth, $xHeight, $hGUI)
$pid = Run(@ProgramFilesDir&"\internet explorer\iexplore.exe -k "&$sURL, "", @SW_HIDE)
Sleep(2000)
$hHandle = _ProcessGetHWnd($pid)
GUISetState(@SW_SHOW, $hGUI)
_WinAPI_SetParent($hHandle, $hGUI)
_WinAPI_MoveWindow($hHandle, 0, 0, $xWidth, $xHeight, True)
_WinAPI_SetWindowLong($hHandle, $GWL_STYLE, $WS_POPUP+$WS_VISIBLE)
Send("{F5}")
EndFunc
Func _ProcessGetHWnd($iPid, $iOption = 1, $sTitle = "", $iTimeout = 2000)
    Local $aReturn[1][1] = [[0]], $aWin, $hTimer = TimerInit()
    While 1
      $aWin = WinList($sTitle)
        For $i = 1 To $aWin[0][0]
            If $iPid = WinGetProcess($aWin[$i][1]) Then
                If $iOption = 1 OR ($iOption = 0 And $aWin[$i][0] <> "") Then
                    Return $aWin[$i][1]
                ElseIf $iOption = 2 Then
                    ReDim $aReturn[UBound($aReturn) + 1][2]
                    $aReturn[0][0] += 1
                    $aReturn[$aReturn[0][0]][0] = $aWin[$i][0]
                    $aReturn[$aReturn[0][0]][1] = $aWin[$i][1]
                EndIf
            EndIf
        Next
        If $iOption = 2 And $aReturn[0][0] > 0 Then Return $aReturn
        If TimerDiff($hTimer) > $iTimeout Then ExitLoop
        Sleep(Opt("WinWaitDelay"))
    WEnd
       SetError(1)
    Return 0
EndFunc  ;==>_ProcessGetHWnd

Do
    Sleep(200)
Until GUIGetMsg() = -3
ProcessClose($pid)
Répondre