Скрипт Powershell для автоматизации веб-интерфейса не работает - PullRequest
0 голосов
/ 13 декабря 2010

У меня есть этот скрипт для запуска IE, перехода на страницу и поиска текста:

$ie = new-object -com "InternetExplorer.Application"
$ie.Visible = $true
$ie.Navigate("http://www.google.com")
$doc = $ie.Document
if ($doc -eq $null)
{
    Write-Host "The document is null."
    return
}
$tb1 = $doc.getElementsByName("q") # a text box
$tb1.value = "search text";
$btn = $doc.getElementsByName("btnG")
$btn.click()

Я сохраняю это как файл ps1 и запускаю из командной строки ... но объект документа, возвращаемый $ie.Document, всегда равен нулю.

Что я делаю не так?

Также, когда я запускаю скрипт построчно в режиме интерпретатора, документ возвращается, но следующая строка $tb = $doc.getElementsByName("q") выдает ошибку с этим: Свойство 'Value' не может быть найдено для этого объекта; убедитесь, что он существует и может быть установлен.

Как мне установить значение текстового поля, тогда?

Ответы [ 2 ]

3 голосов
/ 13 декабря 2010

Вам нужно проверить, завершил ли IE загрузку страницы до назначения $ doc.Например,

while ($ie.busy) {
#Sleep a bit
}

Я попробовал тот же код для ввода текста поиска и нажатия кнопки, но это не сработало.Итак, в итоге ваш код изменился до

$ie = new-object -com "InternetExplorer.Application"
$ie.Visible = $true
$ie.Navigate("http://www.google.com")
While ($ie.Busy) {
Sleep 2
}
$doc = $ie.Document

$btns = $doc.getElementsByTagName("input")
$SearchText = $btns | ? { $_.Name -eq "q" }
$SearchText.value = "search text"
$SearchButton = $btns | ? { $_.Name -eq "btnG" }
$SearchButton.click()
1 голос
/ 05 августа 2013

Я считаю, что есть две проблемы, которые я вижу. Во-первых, важно предложение Равикахта добавить возможность ждать окончания загрузки страницы. Если вы не ждете загрузки страницы (т.е. $ ie.busy -eq $ false), вы не получите полный документ.

Во-вторых, по какой-то причине Google решил добавить несколько полей ввода с именем «q». Вы можете добавить второе условие к запросу Ravikanth, как указано ниже:

$SearchText = $btns | ? { $_.Name -eq "q" -and $_.Type -eq "text"}
...