Powershell:无法在空值表达式上调用方法
Powershell: Cannot call a method on a null-valued expression
各位,我刚开始学习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',它们是 zero-based,但在这种情况下您只希望打开第二个,但它实际上位于索引 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
#>
它有 spaces。因此,不包含 space 的 '-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
#>
所以,all-in-all一,对于本站只能到此为止。
$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()
这只会让您通过主登录页面(根据您的 post 查询)。处理新页面是一个新的努力。
再次,花必要的时间通过我在原始评论中提到的指针来加快 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',它们是 zero-based,但在这种情况下您只希望打开第二个,但它实际上位于索引 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
#>
它有 spaces。因此,不包含 space 的 '-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
#>
所以,all-in-all一,对于本站只能到此为止。
$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()
这只会让您通过主登录页面(根据您的 post 查询)。处理新页面是一个新的努力。
再次,花必要的时间通过我在原始评论中提到的指针来加快 PowerShell 的速度。