1

我有这个脚本来启动 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")错误:在此对象上找不到属性“值”;确保它存在并且是可设置的。

那么如何设置文本框的值呢?

4

2 回答 2

4

您需要检查 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()
于 2010-12-13T08:09:59.670 回答
1

我相信我可以看到两个问题。首先,Ravikahth 关于添加等待页面完成加载功能的建议很重要。如果您不等待页面加载(即 $ie.busy -eq $false),那么您将无法获得完整的文档。

其次,无论出于何种原因,Google 决定添加多个名称为“q”的输入字段。您可以向 Ravikanth 的查询添加第二个条件,如下所述:

$SearchText = $btns | ? { $_.Name -eq "q" -and $_.Type -eq "text"}
于 2013-08-05T11:47:53.480 回答