如何解决Powershell:无法在空值表达式上调用方法
每个人,我刚开始学习Powershell,现在我刚刚开始练习一些脚本,我以为我的第一个脚本应该是一个脚本,它可以让我打开浏览器,单击登录名,填写信息,登录我,然后在我的工作单位中登录。
这是我到目前为止编写的代码:
$ie = New-Object -com InternetExplorer.Application #åbner internet explorer
$ie.visible=$true #gør den synlig
$ie.navigate('https://itd-skp.sde.dk/')
while ($ie.Busy -eq $true){Start-Sleep -seconds 4;}
$link = $ie.Document.getElementsByTagname('A') | Where-Object {$_.innerText -eq 'Log ind'}
$link.click()
这是我可以访问的所有网站代码,所以我希望足够。
我在编码和Powershell上都很烂,因为我对此很陌生(这基本上是我的第二天),所以如果我可以得到愚蠢的版本,那就太好了。
现在我的问题是,在这种情况下,如何为$ link函数添加值?如何单击底部的按钮?
解决方法
继续我的评论...
有些站点只是不允许或禁止自动化,然后有些站点您所看到的并不是真正的。你必须去挖掘它。例如,您显示的URL有很多类和Divs,框架。因此,如果您追求的是嵌入其中,则需要更多代码。
您还需要深入研究如何抓取网站以查看可以使用的对象。
一个简单的刮痕显示了这一点...
# Scrape the site for object info.
$url = 'https://itd-skp.sde.dk'
($WebSite = Invoke-WebRequest -Uri $url -SessionVariable fe)
$WebSite.Links
# Results
<#
innerHTML : Registrering lukket
innerText : Registrering lukket
outerHTML : <a class="col-xs-12 btn btn-primary btn-load btn-lg disabled" role="button" style="cursor: not-allowed;" href="javascript:void(0);">Registrering
lukket</a>
outerText : Registrering lukket
tagName : A
class : col-xs-12 btn btn-primary btn-load btn-lg disabled
role : button
style : cursor: not-allowed;
href : javascript:void(0);
innerHTML :
Log ind
innerText : Log ind
outerHTML : <a class="col-xs-12 btn btn-primary btn-load btn-lg" href="admin/login.php">
Log ind</a>
outerText : Log ind
tagName : A
class : col-xs-12 btn btn-primary btn-load btn-lg
href : admin/login.php
#>
加载并使用网站上的信息
$IE = New-Object -ComObject 'InternetExplorer.Application'
$FormElementsequestURI = 'https://itd-skp.sde.dk'
$IE.Visible = $true
$IE.Silent = $true
$IE.Navigate($FormElementsequestURI)
While ($IE.Busy) {Start-Sleep -Milliseconds 100}
$Doc = $IE.Document
<#
$Doc.getElementsByTagName('a')
# Or simply
$Doc.links |
Select-Object -Property className,id,tagname,innertext,outertext,href,ie8_href
# Results
<#
className : col-xs-12 btn btn-primary btn-load btn-lg disabled
id :
tagName : A
innerText : Registrering lukket
outerText : Registrering lukket
href : javascript:void(0);
ie8_href : javascript:void(0);
className : col-xs-12 btn btn-primary btn-load btn-lg
id :
tagName : A
innerText : Log ind
outerText : Log ind
href : https://itd-skp.sde.dk/admin/login.php
ie8_href : https://itd-skp.sde.dk/admin/login.php
#>
逐步浏览元素以查找具有点击方法的
$Doc.links |
ForEach-Object {
[PSCustomObject]@{
className = $PSItem.className
tagName = $PSItem.tagName
innerText = $PSitem.innerText
outerText = $PSitem.outerText
href = $PSItem.href
ClickMethod = $PSItem.Click
}} | Format-Table -AutoSize
# Results
<#
className tagName innerText outerText href ClickMethod
--------- ------- --------- --------- ---- -----------
col-xs-12 btn btn-primary btn-load btn-lg disabled A Registrering lukket Registrering lukket javascript:void(0); System.__ComObject
col-xs-12 btn btn-primary btn-load btn-lg A Log ind Log ind https://itd-skp.sde.dk/admin/login.php System.__ComObject
#>
请注意,返回的数组中有多个'A',它们从零开始,但是在这种情况下,您只希望第二个在此位置,但这实际上是在索引1处,而不是2。
# Or
($Doc.getElementsByTagName('A') |
Get-Member -MemberType Method) -match 'click'
# Results
<#
TypeName: System.__ComObject#{3050f502-98b5-11cf-bb82-00aa00bdce0b}
Name MemberType Definition
---- ---------- ----------
click Method void click ()
#>
但是,请注意“ Log ind”的文本呈现方式。
(($Doc.getElementsByTagName('A')[1]).outerText).Length
# Results
<#
8
#>
(($Doc.getElementsByTagName('A')[1]).innerText).Length
# Results
<#
8
#>
有空格。因此,不包含空格的'-eq'将找不到它。
如前所述,引用正确的对象将授予对click方法的访问权限。但是如图所示,它们又回来了……
$Doc.links[1].click()
# Results
<#
System.__ComObject
#>
$Link = $Doc.getElementsByTagName('A') |
Where-Object {$PSItem.href -eq 'https://itd-skp.sde.dk/admin/login.php'}
# Results
<#
System.__ComObject
#>
因此,所有这些,本网站仅适用于此。
$IE = New-Object -ComObject 'InternetExplorer.Application'
$FormElementsequestURI = 'https://itd-skp.sde.dk'
$IE.Visible = $true
$IE.Silent = $true
$IE.Navigate($FormElementsequestURI)
While ($IE.Busy) {Start-Sleep -Milliseconds 100}
$Doc = $IE.Document
$Doc.links[1].click()
这只会使您通过主登录页面(按您发布的查询)。处理新页面是一项新的尝试。
再次,通过我在原始注释中调用的指针,花必要的时间来加快PowerShell的运行速度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。