2010-10-15 8 views
2

J'essaye d'automatiser un site Web et me trouve avoir besoin d'arriver au contenu d'un iframe. Comme il est une application interne, je l'ai mis dans cet exemple, qui illustre l'erreurComment interagir avec un Iframe en utilisant Powershell?

$ie = new-object -com "InternetExplorer.Application" 
$ie.navigate("http://arstechnica.com/") 

$ie.visible = $true 
$doc = $ie.document 
$maglistcontrol = $doc.getElementById("mag_list") 
$maglistcontrol.value= "Concierge" 

Voici le message d'erreur que je reçois

You cannot call a method on a null-valued expression. 
At line:6 char:38 
+ $maglistcontrol = $doc.getElementById <<<< ("mag_list") 
    + CategoryInfo   : InvalidOperation: (getElementById:String) [], RuntimeExce 
    ption 
    + FullyQualifiedErrorId : InvokeMethodOnNull 

Property 'value' cannot be found on this object; make sure it exists and is settable. 
At line:7 char:17 
+ $maglistcontrol. <<<< value= "Concierge" 
    + CategoryInfo   : InvalidOperation: (value:String) [], RuntimeException 
    + FullyQualifiedErrorId : PropertyNotFound 

Le problème est, le champ mag_list est dans un iframe et la référence n'est pas valide. Des idées?

Répondre

0

J'ai essayé de le faire mais je n'ai pas réussi à manipuler IE à partir de PowerShell (bizarre, j'ai une variable $ ie, mais tous les accès échouent par la suite).

Les cadres sont dans l'objet Fenêtre: la collection de cadres.

Théoriquement, vous pouvez accéder à l'objet window via $ ie.document.parentWindow.

Donc, cela devrait fonctionner, mais je ne pouvais pas le tester:

$doc = $ie.document 
$w = $doc.parentWindow 
$fr = $w.frames[0] # assuming you want the first frame 
$uidfield = $fr.document.getElementById("uid") 

Hope this helps.

+0

$ w.frames ne renvoie pas de valeurs qui signifie que futher $ w.frames [0] a pas de valeur non plus –

+0

Oui, je ne comprends pas. L'objet window est censé avoir une propriété frames. Voir http://www.w3schools.com/jsref/obj_window.asp par exemple. – Timores

+0

ressemble à powershell ne donne pas un accès complet à ce modèle .... (soupir). Peut-être d'une autre façon? –

0

Il semblerait que votre problème soit que l'objet COM devienne inutilisable. J'ai vu cela se produire parfois quand un nouvel objet IE est engendré pour gérer la demande (je ne sais pas pourquoi, peut-être quelqu'un sait). Vous aurez besoin de trouver à nouveau la fenêtre comme ceci:

$Shell = New-Object -COM Shell.Application 
$Shell.Windows() ## Find the right one in the list 

$ie = $Shell.Windows().Item(1) ## Grab the window 

Mais je ne pouvais trouver que le tag « mag_list » que vous recherchez.

+0

Mais si je peux voir d'autres éléments sur la page que l'iframe, comment est-ce que mon objet COM est inutilisable? –

+0

Eh bien, d'après votre message d'erreur, l'élément de document est $ null. Étant donné que c'est la seule information que je vois dans votre message, j'ai suggéré une solution possible basée sur ce que j'ai vu auparavant. J'ai moi-même essayé votre code et n'ai eu aucun problème pour accéder aux membres. Mais je ne pouvais pas trouver l'iframe auquel vous faisiez référence. – JasonMArcher

3

Ci-dessous le code a fonctionné pour moi, certains d'information a obtenu de http://www.dyn-web.com/tutorials/iframes/

# give your url here in this line instead of sample url 
& "$env:programfiles\Internet Explorer\iexplore.exe" 'http://blahblahblah' 
$win = New-Object -comObject Shell.Application 
$try = 0 
$ieObj = $null 
do { 
    Start-Sleep -milliseconds 500 

# plese use your title instead of "your_title" to identify the window correct 
$ieObj = @($win.windows() | ? { $_.locationName -like '*your_title*' })[0] 

$try ++ 
if ($try -gt 20) { 
Throw "Web Page cannot be opened." 
} 
} while ($ieObj -eq $null) 

[System.Threading.Thread]::Sleep(1000) 

# put both Iframe name and id both to "fraMain" 
$ieObj.document.getElementbyID("fraMain").contentWindow.document.getElementbyID("name").value = "test name" 
$ieObj.document.getElementbyID("fraMain").contentWindow.document.getElementbyID("button").Click() 

Hope this helps

+0

Cela fonctionne très bien pour moi lorsque l'iFrame fait référence à des informations de page provenant du même site Web. Cependant, j'ai un problème en saisissant un iFrame qui a une source à partir d'une page Web complètement différente. Le fichier contentWindow.document est vide pour celui-là. Une quelconque idée du pourquoi? –

Questions connexes