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()

This is the webpage i want it to click on

This is the Line of code,that is referencing the link that needs to be clicked

这是我可以访问的所有网站代码,所以我希望足够。

我在编码和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的运行速度。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...