我需要以编程方式驱动的输入字段没有 ID,因此我尝试使用表单名称来设置它们。
在 IE F12 开发者控制台中,此命令有效:
document.forms["loginForm"].elements["_ssoUser"].value = "someone's username"
但在 PowerShell 中,此命令失败:
$ie.document.forms["loginForm"].elements["_ssoUser"].value = "$username"
错误是“无法索引到空数组”。
你可能把这个问题过于复杂化了。过去几次我需要使用脚本登录网站,我没有关心 document.forms,我只是获得了文档元素。试试这个:
$Doc = $IE.Document
$UserNameField = $Doc.getElementById('_ssoUser')
$UserNameField.value = "$username"
$PassField = $Doc.getElementById('_ssoPassword')
$PassField.value = "$Password"
$LoginButton = $Doc.getElementById('LoginBtn')
$LoginButton.setActive()
$LoginButton.click()
是的,它可能比需要的要长一点,但是很容易根据需要进行跟踪和编辑,并且它过去一直对我有用。您可能需要编辑一些元素名称(我猜测了密码字段元素和登录按钮元素的名称,因此请检查它们)。
您可能找不到 ID,但可以使用标签名称。我使用麻省理工学院网站向您展示了如何做到这一点的示例。
# setup
$ie = New-Object -com InternetExplorer.Application
$ie.visible=$true
$ie.navigate("http://web.mit.edu/")
while($ie.ReadyState -ne 4) {start-sleep -m 100}
$termsField = $ie.document.getElementsByName("terms")
@($termsField)[0].value ="powershell"
$submitButton = $ie.document.getElementsByTagName("input")
Foreach($element in $submitButton )
{
#look for this field by value this is the field(look for screenshot below)
if($element.value -eq "Search"){
Write-Host $element.click()
}
}
Start-Sleep 10
很可能是 IFRAME 中的表单,因此通过 id 获取 IFRAME,然后通过 ID 获取表单,然后按名称选择子对象,例如:(模拟密码字段和登录按钮)。
($ie.document.getElementbyID("content").contentWindow.document.getElementbyID('loginForm') | Where-Object {$_.name -eq "_ssoUser"}).value = "username"