我正在编写powershell脚本,模拟用户在页面上执行的操作。 我在点击按钮时遇到问题。页面具有表单和内部按钮,用于保存对数据库的更改:
input type="button" onClick="__doPostBack('someIdentifier','SAVE')" value="Save changes"
我需要从客户端调用它。问题是它自己的按钮有id =“”和tag =“”所以以下不起作用:
$ie = new-object -com "InternetExplorer.Application";
$ie.visible = $true;
$ie.navigate("http://myTestedPage.com");
$doc = $ie.Document;
#doesn't work
$save = $doc.getElementByID("")
#doesn't work neither
$save = $doc.getElementsByTagName("");
#so how to call
$save.click();
getElementbyID和getElementsByTagName只执行一些操作,但只有它们的效果才是我的CPU使用率跳到最大值。
我正在考虑获取表单的elements[]
并在那里找到按钮,但它既没有(效果与之前的情况相同)。
是否还有其他(明智的)方法(显然我不知道)?我需要像InvokeScript
webBrowser = new System.Windows.Forms.WebBrowser()
webBrowser.Document.InvokeScript(@"__doPostBack", new object[] {@"someIdentifier", @"SAVE"});
但我需要使用由powershell(或其他脚本/编程语言,可能是VBScript?)操纵的IE实例,而不是.NET独立应用程序。
答案 0 :(得分:1)
第二次尝试
以下代码搜索并点击具有input
属性的所有value="Save changes"
元素。
我必须动态读取属性的nodeValue
属性,因为它没有在界面中公开。
function getProperty ([System.__ComObject] $obj, [string] $prop)
{
[System.__ComObject].InvokeMember($prop, [System.Reflection.BindingFlags]::GetProperty, $null, $obj, $null)
}
$ie = new-object -com "InternetExplorer.Application"
$ie.visible = $true
$ie.navigate('e:\scratch\h.html')
$doc = $ie.Document
$inputElts = $doc.getElementsByTagName('input')
foreach ($elt in $inputElts)
{
$a = $elt.getAttributeNode('value')
if ($a -and (getProperty $a 'nodeValue') -eq 'Save changes')
{
$elt.Click()
}
}
这是我的HTML:
<html>
<head>
<script type="text/javascript">
function alertMsg() {alert("Button was clicked!")}
</script>
</head>
<body>
<form>
<input type="button" onclick="alertMsg()" value="Save changes" />
</form>
</body>
</html>
答案 1 :(得分:0)
Yoosiba, 我一直在努力解决类似的问题。我可以给你元素名称。从CLI运行此代码。然后使用Tab键突出显示要单击的元素。 然后,您可以键入“$ doc.activeelement”以获取所需元素的属性。请记住,您可以通过标记名,名称或ID获取元素。我不得不这样做以获得我想要的元素:
$ link = $ doc.getElementsByTagName(“A”)|其中{$ _。sourceIndex -like“256”}
你可以做类似的事情。 戴夫M