PowerShell経由でIE内で__dopostbackを呼び出す
-
03-07-2019 - |
質問
私は、ユーザーがページで実行するアクションをシミュレートする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"});
しかし、.NETスタンドアロンアプリではなく、powershell(または他のスクリプト/プログラミング言語、おそらくVBScript?)によって操作されるIEのインスタンスを使用する必要があります。
解決
2回目の試行
次のコードは、 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>
他のヒント
ヨシバ、 私は同様の問題に苦しんでいます。要素名を取得できます。 CLIからこのコードを実行します。次に、タブキーを使用して、クリックする要素を強調表示します。 次に、「$ doc.activeelement」と入力します。目的の要素のプロパティを取得します。タグ名、名前、またはIDで要素を取得できることに注意してください。必要な要素を取得するには、このような並べ替えを行う必要がありました。
$ link = $ doc.getElementsByTagName(&quot; A&quot;)|ここで、{$ _。sourceIndex -like&quot; 256&quot;}
おそらく同様のことができます。 デイブM