.net 通过powershell在IE内部调用dopostback

.net 通过powershell在IE内部调用dopostback,.net,internet-explorer,powershell,vbscript,.net,Internet Explorer,Powershell,Vbscript,我正在编写powershell脚本,它模拟用户在页面上执行的操作。 我在执行单击按钮时遇到问题。页面具有表单和内部按钮,用于保存对数据库的更改: input type="button" onClick="__doPostBack('someIdentifier','SAVE')" value="Save changes" 我需要从客户端调用它。问题是按钮本身具有id=“”和tag=“”,因此以下内容不起作用: $ie = new-object -com "InternetExplorer.Ap

我正在编写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使用率跳到了最大值

我正在考虑获取表单的
元素[]
,并在那里找到按钮,但两者都没有(效果与前一种情况类似)

有没有其他(绝妙的)方法可以做到这一点(显然我不知道)?我需要类似于
InvokeScript

webBrowser = new System.Windows.Forms.WebBrowser()
webBrowser.Document.InvokeScript(@"__doPostBack", new object[] {@"someIdentifier", @"SAVE"});

但我需要使用由powershell(或其他脚本/编程语言,可能是VBScript?)操纵的IE实例,而不是.NET独立应用程序。

第二次尝试

以下代码搜索并单击具有
value=“Save changes”
属性的所有
input
元素

我必须动态读取属性的
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>

函数alertMsg(){alert(“按钮已单击!”)}

第二次尝试

以下代码搜索并单击具有
value=“Save changes”
属性的所有
input
元素

我必须动态读取属性的
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>

函数alertMsg(){alert(“按钮已单击!”)}
Yoosiba, 我一直在努力解决类似的问题。我可以给你元素名。从CLI运行此代码。然后使用tab键高亮显示要单击的图元。 然后您可以键入“$doc.activeelement”以获取所需元素的属性。请记住,您可以通过标记名、名称或ID获取元素。我必须进行如下排序才能获取所需的元素:

$link=$doc.getElementsByTagName(“A”)|其中{$\类似于.sourceIndex的“256”}

你也可以做类似的事情。 戴夫M

约西巴, 我一直在努力解决类似的问题。我可以给你元素名。从CLI运行此代码。然后使用tab键高亮显示要单击的图元。 然后您可以键入“$doc.activeelement”以获取所需元素的属性。请记住,您可以通过标记名、名称或ID获取元素。我必须进行如下排序才能获取所需的元素:

$link=$doc.getElementsByTagName(“A”)|其中{$\类似于.sourceIndex的“256”}

你也可以做类似的事情。
Dave M

这就是问题所在-对于这个按钮,标签和ID都是空的(我在问题中提到过)。所以我不能(或者我不知道如何)捕获button对象,所以我正在寻找一种方法来调用在button click上执行的u dopostback。好吧,我没有看到。您应该提供最少但完整的代码,以减少误解的机会。您的输入元素BTW确实有一个标记。这是“输入”。不幸的是,getElementsByTagName(“输入”)返回的集合没有任何有用的方法或属性。。。。。。奇怪的是,PowerShell中IE中的大多数DOM对象都有不完整的接口。这将使工作更加困难。我以后可能再看一眼。那个代码真的对你有用吗?首先,循环中应该有getProperty吗?我的PS正在抛出错误。如果您的意思是$a.GetProperty('nodeValue'),则此对象不包含此方法。如果它应该是get member$a'nodeValue',那么这个对象不包含这个属性。是的,它当然对我有用。getProperty是我编写的一个函数。它位于代码的顶部。正如我所解释的,我需要它访问nodeValue属性。您可以在此处查找nodeValue:。正如我所说,nodeValue不可见。。。这就是问题所在——这个按钮的标签和ID都是空的(我在问题中提到过)。所以我不能(或者我不知道如何)捕获button对象,所以我正在寻找一种方法来调用在button click上执行的u dopostback。好吧,我没有看到。您应该提供最少但完整的代码,以减少误解的机会。您的输入元素BTW确实有一个标记。这是“输入”。不幸的是,getElementsByTagName(“输入”)返回的集合没有任何有用的方法或属性。。。。。。奇怪的是,PowerShell中IE中的大多数DOM对象都有不完整的接口。这将使工作更加困难。我以后可能再看一眼。那个代码真的对你有用吗?首先,循环中应该有getProperty吗?我的PS正在抛出错误。如果您的意思是$a.GetProperty('nodeValue'),则此对象不包含此方法。如果它应该是get member$a'nodeValue',那么这个对象不包含这个属性。是的,它当然对我有用。getProperty是我编写的一个函数。它位于代码的顶部。正如我所解释的,我需要它访问nodeValue属性。您可以在此处查找nodeValue:。正如我所说,nodeValue不可见。。。顺便说一句,接受答案并不回答问题,但它回答了问题背后的问题。所以现在我不需要直接调用回发。。。但如果有人知道如何做到这一点,请分享知识!顺便说一句,接受答案并不回答问题,但它回答了问题背后的问题。所以现在我不需要直接调用回发。。。但如果有人知道如何做到这一点,请分享知识!