通过powershell在IE中调用__dopostback

时间:2009-03-04 07:33:39

标签: .net internet-explorer powershell vbscript

我正在编写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独立应用程序。

2 个答案:

答案 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