2016年11月20日日曜日

PowerShell 非同期処理 (JavaScript ダイアログ対応)

PowerShellのIE自動実行ツールでJavaScriptの「Alert」,「Confirm」などのダイアログが出たときに、ボタンが押せない。
Sendkeyを使えればいいのだが、確認ダイアログを表示させると、入力待ち状態となり、PowerShellからキーを送ることができない。

RunspacePoolを使えばいいかと思ったが、使い方が悪いのかできなかった。
すべての処理を、RunspacePool制御下におかないと、非同期処理はできないようだ。

やむなく、非同期でEnterキーを送る処理を作って、DLLで呼び出すことにした。




-----------------------------------------------------------------------------------------------------------------
C#
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;


namespace SendKeysAsync
{
    public   class SendKeyAsyncUTL
    {
        public void SendEnter()
        {
          Task.Run(() =>{Thread.Sleep( 3000 );SendKeys.SendWait("{ENTER}");} );
        }
    
    }
}

-----------------------------------------------------------------------------------------------------------------

PowerShell

[System.Reflection.Assembly]::LoadFile("D:/sendkeys.dll") 

function SendkeysJavaScript()
{
    
    $dd = New-Object SendKeysAsync.SendKeyAsyncUTL
    $dd.SendEnter()
}

SendkeysJavaScript

$btn=$doc.getElementByID("Button1")  
$btn.click()



-----------------------------------------------------------------------------------------------------------------
HTML

< INPUT onclick="javascript:if (confirm('よろしいですか?')){return true;} else {return false;};"  id=Button1 >

-----------------------------------------------------------------------------------------------------------------

Button1により、Confirmが出力される。
その前に、非同期でSendKeyを実行するモジュールを呼び出しておく。

これにより、Button1でのConfirmが表示された後、Enterが送られ、Confirmが処理される。
ただし、問題もある。
Sendkeyが実行される前に、ダイアログが表示されている必要があるため、Sleep時間の調整が必要となり、対象のダイアログがアクティブになっていないといけない。


本日の河上選手:お休み
  11/18~ 江戸川