2009-03-04 12 views
1

私はページ上でユーザが実行したアクションをシミュレートするpowershellスクリプトを書いています。 ボタンをクリックする際に問題があります。ページには、データベースへの変更を保存するフォームと内部ボタンがあります。IE内でpowershell経由で__dopostbackを呼び出す

input type="button" onClick="__doPostBack('someIdentifier','SAVE')" value="Save changes" 

クライアント側から呼び出す必要があります。

$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使用率である:問題は、次が動作しないので、それは自己が「「= IDを持っている」とタグ=」というボタンですmax。

フォームと検索ボタンのelements[]を取得することを考えていましたが、どちらの効果もありません(以前のような効果)。

これを行うには他にも(鮮やかな)方法がありますか?私はInvokeScript

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

ようなものが必要でしょうが、私は(多分またはその他のスクリプト/プログラミング言語、VBScriptの?)のPowerShellによって操作IEのインスタンスではなく、.NETスタンドアロンアプリを使用する必要があります。

+0

ご質問にはお答えできませんが質問の背後にある質問にお答えします。だから、私は__postbackを直接呼び出す必要はありません...しかし、誰かがそれをやる方法を知っていれば、知識を共有してください! – yoosiba

答えて

1

第二の試み

次のコードを検索し、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> 
+0

それはポイントです - タグとIDの両方がこのボタンで空です(これは私の質問でこれを言及しました)。だから私はボタンオブジェクトをキャッチすることはできません(または私はどのように)わからないので、ボタンクリックで実行される__dopostbackを呼び出す方法を探しています。 – yoosiba

+0

さて、私はそれを見ませんでした。誤解の可能性を減らすために、最小限の*完全な*コードを提供する必要があります。あなたの入力要素BTWにはタグがあります。それは「入力」です。残念ながら、getElementsByTagName( "input")によって返されたコレクションには、便利なメソッドやプロパティはありません。 –

+0

...不思議なことに、IEのPowerShellのほとんどのDOMオブジェクトには不完全なインターフェイスがあります。それは仕事をより困難にするでしょう。私は後で別の顔をしているかもしれません。 –

0

Yoosiba、 私は同様の問題で苦労されています。私はあなたに要素名を得ることができます。このコードをCLIから実行します。次に、Tabキーを使用して、クリックしたい要素を強調表示します。 "$ doc.activeelement"と入力すると、必要な要素のプロパティを取得できます。タグ名、名前またはIDで要素を取得できることを忘れないでください。

$ link = $ doc.getElementsByTagName( "A")|次のような並べ替えを行う必要がありました。 {$ _。sourceIndex-like "256"}

あなたはおそらく同様のことを行うことができます。 Dave M

関連する問題