2017-10-07 96 views
0

我试图找到在网页中是否存在一个元素:PowerShell的:测试在网页是否存在一个元素

$ie = New-Object -com InternetExplorer.Application 
$ie.visible = $true 
$ie.Navigate("http://10.0.0.1") 
BrowserReady($ie) # wait for page to finish loading 
if ($ie.Document.getElementById("admin")) { 
    $ie.Document.getElementById("admin").value = "adminuser" 
} 
etc, etc 

(是的,有可能在http://10.0.0.1的页面不包含元素ID为“admin” - 为什么没有关系)

我的问题是,第5行中的测试看起来没有正常工作:无论元素是否存在,它总是返回TRUE。我也试过

if ($ie.Document.getElementById("admin") -ne $NULL) {...} 

具有相同的结果。

我正在使用Windows 10系统。有任何想法吗?

+0

因此,在'if'语句中测试 –

+0

D'oh!我正在阅读它,但认为它正在测试'不存在' – TessellatingHeckler

回答

1

问题在于你的比较。命令​​返回DBNull,其本身不等于Null。因此,在执行时:

if ($ie.Document.getElementById("admin")) 
{ 
    ... 
} 

您总是会返回True。正如您在以下示例中看到的,$my_element不等于$null,其类型为DBNull

PS > $my_element = $ie.Document.getElementById("admin") 

PS > $my_element -eq $null 
False 

PS > $my_element.GetType() 

IsPublic IsSerial Name          BaseType                          
-------- -------- ----          -------- 
True  True  DBNull         System.Object 

我建议你使用这个比较的一个,以确定是否为“admin”确实存在:

PS > $my_element.ToString() -eq "" 
True 

PS > [String]::IsNullOrEmpty($my_element.ToString()) 
True 

PS > $my_element.ToString() -eq [String]::Empty 
True 

如果比较有True返回这意味着价值所以“管理员”不存在。当然,您可以使用-ne以获得更多便利。

相关问题