我正在尝试了解如何使用powershell来自动化IE导航,我在http://scriptolog.blogspot.com/2007/01/automated-web-forms.html找到了一个示例脚本
以下是代码:
function Login-GMail{
param(
[string]$uname,
[string]$url="http://www.gmail.com",
[bool]$cookie=$false
)
$creds = get-credential $uname
$pass = $creds.GetNetworkCredential().Password
$ie=new-object -com internetexplorer.application
$ie.visible=$true
$ie.navigate($url)
while($ie.ReadyState -ne 4){start-sleep -m 100}
$ie.document.getElementbyId("Email").value=$creds
$ie.document.getElementbyId("Passwd").value=$pass
$ie.document.getElementbyName("PersistentCookie") | foreach {$_.checked=$cookie}
$ie.document.getElementbyId("gaia_loginform").submit()
}
Login-Gmail
代码看起来很好但是没有按预期工作
当我在命令行上运行它时,即C:\ sandbox \ gmail.ps1 me@gmail.com我收到错误,
Set-Location : A positional parameter cannot be found that accepts argument 'me@gmail.com'.
At line:1 char:3
+ cd <<<< c:\sandbox\gmail.ps1 p...@gmail.com
+ CategoryInfo : InvalidArgument: (:) [Set-Location], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SetLocationCommand
当我在Powershell GUI中运行它并按下绿色箭头时,弹出框会询问我的用户名和密码。但是,当它打开gmail.com时,它使用“System.Management.Automation.PSCredential”预填充用户名文本框,我收到以下错误
Method invocation failed because [mshtml.HTMLDocumentClass] doesn't contain a method named 'getElementbyName'.
At C:\sandbox\gmail.ps1:18 char:34
+ $ie.document.getElementbyName <<<< ("PersistentCookie") | foreach {$_.checked=$cookie}
+ CategoryInfo : InvalidOperation: (getElementbyName:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
如何解决此问题?
编辑:
@ Goyuix
我对参数列表进行了更改,添加了
Login-Gmail -uname me@gmail.com
我删除了
$creds=get-credential $uname
并收到错误
You cannot call a method on a null-valued expression.
At C:\sandbox\gmail.ps1:9 char:40
+ $pass = $creds.GetNetworkCredential <<<< ().Password
+ CategoryInfo : InvalidOperation: (GetNetworkCredential:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
和
Method invocation failed because [mshtml.HTMLDocumentClass] doesn't contain a method named 'getElementbyName'.
At C:\sandbox\gmail.ps1:18 char:34
+ $ie.document.getElementbyName <<<< ("PersistentCookie") | foreach {$_.checked=$cookie}
+ CategoryInfo : InvalidOperation: (getElementbyName:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
如果我删除
$ie.document.getElementbyName("PersistentCookie") | foreach {$_.checked=$cookie}
但包括
$creds = get-credential $uname
然后会出现一个弹出窗口,其中用户名预先填入了me@gmail.com。输入密码并按“确定”后,使用gmail appaers和用户名的网页预先填充
System.Management.Automation.PSCredential
但这里没有错误。
如何修复代码,以便自动打开Gmail并将我登录到我的帐户。到目前为止,这是代码:
function Login-GMail{
param(
[Parameter(Mandatory=$True,Position=1)][string]$uname,
[Parameter(Mandatory=$False,Position=2)][string]$url="http://www.gmail.com",
[Parameter(Mandatory=$False,Position=3)][bool]$cookie=$false
)
$creds = get-credential $uname
$pass = $creds.GetNetworkCredential().Password
$ie=new-object -com internetexplorer.application
$ie.visible=$true
$ie.navigate($url)
while($ie.ReadyState -ne 4){start-sleep -m 100}
$ie.document.getElementbyId("Email").value=$creds
$ie.document.getElementbyId("Passwd").value=$pass
$ie.document.getElementbyId("gaia_loginform").submit()
}
Login-Gmail -uname me@gmail.com
答案 0 :(得分:5)
第一个错误可以通过至少两种不同的方式解决:在调用Login-Gmail
函数时使用命名参数或通过使用位置信息修饰$uname
参数:
命名参数:
Login-Gmail -uname me@gmail.com
添加位置信息:
function Login-GMail{
param(
[Parameter(Mandatory=$True,Position=1)]
[string]$uname,
[Parameter(Mandatory=$False,Position=2)]
[string]$url="http://www.gmail.com",
[Parameter(Mandatory=$False,Position=3)]
[bool]$cookie=$false
)
关于System.Management.Automation.PSCredential
的第二个错误是,当IE DOM需要字符串时,您试图分配对象的值(PSCredential)。您可以完全省略对get-credential
的调用,只需指定$uname
变量中的值。