Page 1 sur 1
[..] Contenu d'une iframe introuvable
Posté : ven. 06 juin 2014 17:00
par DavidRobin33
Bonjour,
Après quelques heures de recherche infructueuse, je me permets de vous solliciter.
Je possède une page html qui contient une iframe dont voici le squelette (je peux fournir la page si besoin) :
Code : Tout sélectionner
<html>
<head>...</head>
<body>
<iframe>
<html>
<head>...</head>
<body>
<button>...</button>
</body>
</html>
</iframe>
</body>
</html>
Et bien, je ne parviens pas à "trouver" le bouton afin de pouvoir cliquer dessus ensuite.
J'ai tenté tout simplement ce genre de chose :
Local $oFrame = _IEFrameGetObjByName($oIE, "HostedIFrame") ; @error = 0 et @extended = 0
Local $oButton = _IEGetObjById($oFrame, "finalizeButton")
Egalement la fonction "_IEFrameGetCollection" avec les exemples fournit dans la doc mais j'ai toujours un message du type "la variable doit être de type objet".
Merci d'avance de toute piste que vous seriez me proposer.
David
Re: [..] Contenu d'une iframe introuvable
Posté : ven. 06 juin 2014 17:04
par julie
peut tu donner la page en question stp ?
Re: [..] Contenu d'une iframe introuvable
Posté : lun. 09 juin 2014 10:41
par DavidRobin33
Bonjour,
Ma page est trop grosse, la voici en pièce jointe (MaPage.txt).
David
Re: [..] Contenu d'une iframe introuvable
Posté : lun. 09 juin 2014 10:55
par DavidRobin33
Je viens de m'apercevoir que la page que je viens de fournir (via fonction CopyHTML de firebug) ne contient pas le contenu de la iframe. Voici donc le contenu de la iFrame "HostedIFrame" dans cette seconde pièce jointe.
David
Re: [..] Contenu d'une iframe introuvable
Posté : lun. 09 juin 2014 14:46
par mikell
Pas évident
Faudrait tester ça pour voir si on arrive à se caler sur le bouton
Code : Tout sélectionner
#include <IE.au3>
;; $oIE = _IECreate(@scriptdir & "\MaPage.htm")
$oFrames = _IETagNameGetCollection($oIE, "iframe")
For $oFrame In $oFrames
If $oFrame.id == "HostedIFrame" Then $addr = $oFrame.src
Next
;; Msgbox(4096, "", $addr)
_IENavigate($oIE, $addr)
Local $oButton = _IEGetObjById($oIE, "finalizeButton")
Msgbox(4096, "", $oButton.title)
Re: [..] Contenu d'une iframe introuvable
Posté : lun. 09 juin 2014 17:49
par DavidRobin33
Merci mikell pour cette piste.
J'ai testé, la redirection fonctionne bien. Du coup, le contenu de la page contient bien le contenu de la iframe. J'ai donc bien mes boutons de visible mais étrangement le _IEGetObjById retourne un @error à 4 (ce qui ne correspond à rien dans la doc).
Pour info, un
retourne également un @error à 4 (Invalid Object Type).
Je continue mes recherches sur cette piste qui me semble la meilleure idée du moment

Re: [..] Contenu d'une iframe introuvable
Posté : lun. 09 juin 2014 21:41
par mikell
ça vaudrait le coup de tenter ça (on ne sait jamais...)
Code : Tout sélectionner
$oIE.document.parentwindow.execScript("FinalizePayment(false)", "JavaScript")
Sinon peut-être essayer _IETagNameGetCollection($oIE, "span") en cherchant le texte "Valider le paiement"
Ah c'est dur quand on peut pas tester

Re: [..] Contenu d'une iframe introuvable
Posté : jeu. 12 juin 2014 17:20
par DavidRobin33
Merci beaucoup pour toutes ces idées mais malheureusement aucune ne fonctionne.
Quelque soit la méthode par laquelle je passe et quelque soit ce que je recherche, un "$oMyObject.innerHtml" génère l'erreur 'Variable must be of type "Object"' !
Quant à l'exécution direct de la fonction via "ExecScript", c'est le même problème je pense, cela n'a pas d'effet puisque pas connue (la fonction est dans la iframe).
Je ne comprends même pas que ta solution du "_IENavigate" ne fonctionne pas !
Je me demande s'il ne s'agirait pas d'un problème de sécurité ? Ou un manque sur AutoIt pour IE 11 (je suis en v3.3.12) ?
Je continue mes recherches...
David
Re: [..] Contenu d'une iframe introuvable
Posté : jeu. 12 juin 2014 17:29
par mikell
Hum
Pour ce que j'ai pu en voir c'est un site sécurisé, je suis pas optimiste ... et faut des identifiants donc je peux rien tester

Re: [..] Contenu d'une iframe introuvable
Posté : mer. 23 juil. 2014 10:38
par DavidRobin33
Pour info, je crois avoir l’explication à mon problème : l'accès à une iFrame est possible uniquement lorsque la page redirigée provient du même domaine que la page d'origine. Il semble s'agir d'une contrainte de sécurité. Dans tous les cas, je constate bien se comportement au travers notre logiciel lorsque des redirections sont faites, alors que cela fonctionne bien lorsqu'il n'existe pas de redirection.
J'ai découvert pour la première fois cette piste au travers ce forum :
http://stackoverflow.com/questions/1445 ... lementbyid
Un wiki existe à ce sujet
http://en.wikipedia.org/wiki/Same_origin_policy faisant référence au "World Wide Web Consortium" (
http://www.w3.org/Security/wiki/Same_Origin_Policy)
Pour info, cela semble se confirmer suite aux différents tests réalisés sur FireBug.
Via javascript, un "document.getElementById('MaFrameID')" me trouve bien ma frame et me renvoie tous les attributs de cet élément. Tant dis que la récupération du contenu de cette frame par un "document.getElementById('MaFrameID').contentWindow.document" me renvoie un défaut de permission (cf. copie d'écran ci-dessous).
Si rien n'est possible au niveau du paramétrage du serveur, je crains qu'il s'agisse d'une limite à l'utilisation d'un automate, quelle qu'il soit.
Je vais essayer de voir prochainement pour ce dernier point.
Re: [..] Contenu d'une iframe introuvable
Posté : jeu. 24 juil. 2014 02:19
par orax
Effectivement, "document.getElementById('MaFrameID').contentWindow.document" ne fonctionnera pas dans ce cas. Par contre, je ne vois pas pourquoi le _IENavigate() fait des caprices.
Local $oButtons = _IETagNameGetCollection($oIE, "button")
retourne également un @error à 4 (Invalid Object Type).
De ce que j'en ai compris, il vérifie que $oIE soit d'un type valide (via __IEIsObjType).
Par exemple dans le code que j'ai mis plus bas, après un _IENavigate(), ObjName($oIE) me retourne IWebBrowser2. Si ce n'est pas le cas, il y a peut-être un problème.
Code : Tout sélectionner
Sortie console :
@@ (21) :
@@ Debug(40) : {Object} ->
@error=0 @extended=0x00000000
nom : IWebBrowser2
desc : Web Browser Interface for IE4.
► Afficher le textevoir le code !
Code : Tout sélectionner
#include <IE.au3>
#include <MsgBoxConstants.au3>
#include <debug.au3>
_DebugSetup(Default, True, 2)
$oIE = _IECreate("c:\temp\MaPage.html")
;~ $oIE = _IECreate("MaPage.html")
$oFrames = _IETagNameGetCollection($oIE, "iframe")
dbg($oFrames, "$oFrames")
For $oFrame In $oFrames
dbg($oFrame, "$varStr")
If $oFrame.id == "HostedIFrame" Then $addr = $oFrame.src
Next
_DebugOut("_IENavigate() / _IECreate() : " & $addr)
;~ _IENavigate($oIE, $addr)
$oIE = _IECreate($addr)
dbg($oIE)
;~ ClipPut(_IEDocReadHTML($oIE)) ; la page serait-elle changée ???
_DebugOut("$oIE.locationURL : " & $oIE.locationURL)
Local $oButtons = _IETagNameGetCollection($oIE, "button")
dbg($oButtons, "$oButtons")
Local $oButton = _IEGetObjById($oIE, "finalizeButton")
dbg($oButton, "$oButton")
_DebugOut("@@ (" & @ScriptLineNumber + 1 & ") :")
_DebugOut($oButton.title)
_DebugOut($oButton.outerHtml)
_DebugOut($oButton.innerText)
_IEQuit($oIE)
Func dbg($var, $varStr = "", $ligne = @ScriptLineNumber - 1)
_DebugOut("@@ (" & $ligne & ") :")
_DebugReportVar($varStr, $var, True)
_DebugOut("nom : " & ObjName($var))
_DebugOut("desc : " & ObjName($var, 2))
_DebugOut("")
EndFunc