最近業務で使用するWebアプリの操作を自動化すべくVisualStudioからPlaywrightをNuGet。
…はいいのだが。この子、ググって出てくる関数がことごとくNode.js版。(C#とか.NETを付けない自分が悪い)
OK/Cancelダイアログを出すのにGemini曰く
// 1. ダイアログが発生するアクションを実行する Task を作成(すぐには await しない)
var dialogTask = page.WaitForDialogAsync();
// 2. ダイアログを発生させるクリックアクションを実行
await page.ClickAsync("button#confirm");
// 3. ダイアログのイベントを待機し、処理する
var dialog = await dialogTask;
Console.WriteLine(dialog.Message);
await dialog.AcceptAsync(); // または await dialog.DismissAsync();
だそうだが、playwright.devではそんなものかけらも存在しない。
一度だけ応答すれば良いのであればOnceを使えと言われるのだが…これも無い。
しょうがないから全部OKさせるか?
// 1. ダイアログイベントのハンドラを登録
page.Dialog += async (_, dialog) =>
{
// ダイアログのメッセージを確認(オプション)
System.Console.WriteLine(dialog.Message);
// ダイアログを確定(OK)する
await dialog.AcceptAsync();
// キャンセルしたい場合は以下を使用
// await dialog.DismissAsync();
};
…と、諦めきれずいろいろなワードでググったらこんな回答が来た。
ハンドラの変数作って自分をデクリメントさせる…そういえばそんな方法あったけど、こんな簡単にいくか?
// 1. ダイアログが表示された時の処理を定義
EventHandler<IDialog> handler = null;
handler = async (sender, dialog) =>
{
// OK(承諾)する
await dialog.AcceptAsync();
// 【重要】一度だけ実行するためにハンドラーを解除
page.Dialog -= handler;
};
// 2. イベントを登録
page.Dialog += handler;
↑をconfirm→aleat→confirmを連続で出すhtmlで実行させてみる。
<script>
function clicked()
{
var b = confirm("hoge");
document.getElementById("pppp").innerText = b;
alert("piyo");
b = confirm("fuga");
document.getElementById("qqqq").innerText = b;
}
</script>
<button id="btn" onclick="clicked()">こんふぁーむ</button>
<p id="pppp"></p>
<p id="qqqq"></p>
ということで、Geminiさんは関数でっち上げないでください。(無理なのわかってるけど)
余談。
確認のために自宅PCでプログラム書いて実行させてみた時の例外。
╔════════════════════════════════════════════════════════════╗
║ Looks like Playwright was just installed or updated. ║
║ Please run the following command to download new browsers: ║
║ ║
║ pwsh bin/Debug/netX/playwright.ps1 install ║
║ ║
║ <3 Playwright Team ║
╚════════════════════════════════════════════════════════════╝
pwsh…ごん、お前PowerShell 7.x必須やったんか…
