Как мне взаимодействовать с Iframe с помощью Powershell? - PullRequest
2 голосов
/ 15 октября 2010

Я пытаюсь автоматизировать веб-сайт, и мне нужно получить доступ к содержимому фрейма. Поскольку это внутреннее приложение, я поместил в этот пример, который иллюстрирует ошибку

$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"

Вот сообщение об ошибке, которое я получаю

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

Проблема в том, что поле mag_list находится в iframe, а ссылка недействительна. Есть идеи?

Ответы [ 3 ]

3 голосов
/ 11 октября 2011

Ниже код работал для меня, некоторая информация получена от 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()

Надеюсь, это поможет

0 голосов
/ 16 октября 2010

Похоже, ваша проблема в том, что COM-объект стал непригодным для использования.Я иногда видел, как это происходит, когда новый объект IE создается для обработки запроса (я не уверен, почему, может быть, кто-то знает).Вам нужно будет снова найти окно так:

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

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

Но я не смог найти тот тег "mag_list", который вы искали.

0 голосов
/ 15 октября 2010

Я пытался сделать это, но не смог успешно манипулировать IE из PowerShell (странно; я получил переменную $ ie, но после этого все обращения завершались неудачей).

Кадры в объекте Window: коллекция кадров.

Теоретически, вы можете получить объект окна через $ ie.document.parentWindow.

Итак, это должно сработать, но я не смог проверить это:

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...