用于执行Web UI自动化的Powershell脚本无法正常工作

时间:2010-12-13 07:36:52

标签: dom powershell ui-automation

我有这个脚本来启动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返回的文档对象始终为null。

我做错了什么?

此外,当我在解释器模式下逐行运行脚本时,将返回文档,但下一行$tb = $doc.getElementsByName("q")错误:属性'值'在此对象上找不到;确保它存在并且可以设置。

如何设置文本框的值呢?

2 个答案:

答案 0 :(得分:3)

您需要在$ doc assignment之前检查IE是否已完成加载页面。例如,

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 :(得分:1)

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

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

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