質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

4438閲覧

C# WinformsのWebView2でFrameのあるページで読み込み完了後にjavascript実行したい

neji-thon

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2021/01/22 12:10

編集2021/01/22 22:37

WebView2でWeb自動ログイン、2ページ目3ページなど操作を自動化したいと思っています。

ログイン後から複数のFrame構成になってるページで目的のFrame側の読み込みが完了してからじゃないとうまくJavascriptがかまない事があり、どうにかFrameの完了を待てないかと情報を探しております。

わざとMessageBoxを置いて時間稼ぎしたり、タイミングによっては、読み込みが先に終わり、javascriptが想定通りに走ることもあるのですが、読み込み完了を待ってないので空振りして何も起きないことが多いので明示的?にちゃんと完了を待ちたいと思ってます。
ソースは以下の通りです。

C#

1 public partial class From1 : Form 2 { 3 private WebView2 hogebrowser = new WebView2 { Source = new Uri("https://URL"), }; 4 private int hoge_count = 1; 5 6 public From1() 7 { 8 InitializeComponent(); 9 InitializeWebView2(); 10 } 11 12 public void InitializeWebView2() 13 { 14 webView22.Controls.Add(hogebrowser); 15 hogebrowser.Dock = DockStyle.Fill; 16 hogebrowser.NavigationCompleted += hoge_Load; 17 } 18 19 private void hoge_Load(object sender, CoreWebView2NavigationCompletedEventArgs e) 20 { 21 if (hogebrowser.CoreWebView2 != null) 22 { 23 if (hoge_count == 1) 24 { 25 hoge_auto("Login"); 26 hoge_count = 2; 27 } 28 if (hoge_count == 2) 29 { 30 hoge_auto("Side_Menu_Click"); 31 hoge_count = 3; 32 } 33 if (hoge_count == 3) 34 { 35 hoge_auto("Number_Search"); 36 hoge_count = 4; 37 } 38 } 39 } 40 private async void hoge_auto(string function) 41 { 42 if (function == "Login") 43 { 44 ~~ 問題ないので略 ~~ 45 } 46 if (function == "Side_Menu_Click") 47 { 48 ~~ 問題ないので略 ~~ 49 } 50 if (function == "Number_Search") 51 { 52 MessageBox.Show("ここで時間稼ぎ?のMessageBox"); 53 await hogebrowser.ExecuteScriptAsync(string.Format($"main.document.getElementsByName('hoge')[0].value = '{hoge}';")); 54 await hogebrowser.ExecuteScriptAsync(string.Format($"main.document.querySelector('input[name=\"test\"]').click();"; 55 } 56 } 57 }

※実際にはhoge_countのあたりでreturnして、再度NavigationCompletedを走るように調整はしてます。

javascriptはそのままでも、問題なく最後まで行く事があるので後はページの読み込み完了をなんとかできればと考えています。

以下、TN8001さんより提案いただき試してみた事です。
■「FrameNavigationCompleted」
⇒"WebView2にFrameNavigationCompletedの定義が含まれてない"といったようなエラーで使えず。(ヒントも出ず)
変更前 hogebrowser.NavigationCompleted += hoge_Load;
変更後 hogebrowser.FrameNavigationCompleted += hoge_Load;

■「ContentLoading」
⇒以下で動きはするものの、完了を待ってない?ようでログインすらできなくなる。
変更前 hogebrowser.NavigationCompleted += hoge_Load;
変更後 hogebrowser.ContentLoading += hoge_Load;

変更前 private void hoge_Load(object sender, CoreWebView2NavigationCompletedEventArgs e)
変更後 private void hoge_Load(object sender, CoreWebView2ContentLoadingEventArgs e)

恐れ入りますが、どなたかご教示いただけますでしょうか。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2021/01/22 16:11

試していないのでこちらに書きますが、この辺はどうでしょうか? [CoreWebView2.DOMContentLoaded Event (Microsoft.Web.WebView2.Core) | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/api/microsoft.web.webview2.core.corewebview2.domcontentloaded [CoreWebView2.FrameNavigationCompleted Event (Microsoft.Web.WebView2.Core) | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/api/microsoft.web.webview2.core.corewebview2.framenavigationcompleted
neji-thon

2021/01/22 22:35 編集

ありがとうございます。 公式でContentLoadingも気になってたので試してみました。 その結果を質問に追記します。 DOMContentLoaded v1.0.721-prereleaseのようでしたので、インストール&再起動はしてみたのですが、デザイナが開けなくなったり、そもそもDOMContentLoadedの使い方がわかりませんでした。。今は安定版(1.0.664.37)に戻しました。 namespace Microsoft.Web.WebView2.WinFormsを直接みるとFrameNavigationCompletedはないようだったのでまだ使えない?のかもです。 とりあえず、以下を2つほどに分けて(なぜか分けて別スコープで実行しないといけないですが)回避できそうかなという感じです。 await Task.Delay(3500); ただ、読み込み完了ではないので気持ち悪い状態です。 しばらくこの質問は開けたままにして誰かの意見を待ちたいなと思います。
TN8001

2021/01/22 22:44

hogebrowser.CoreWebView2.DOMContentLoaded等 CoreWebView2のほうです。 その際タイミングによって取れないらしいので、↓のようにやってみてください(こちらではNewWindowRequestedですが) [WebView2 Windows Form C#(.Net) の実装と詰まった点・困った点 - Qiita](https://qiita.com/NagaJun/items/4925a63ce7b93b80639e
neji-thon

2021/01/23 02:31

またまたありがとうございますm(__)m いざawait Task.Delay(3500);でさらに次のページ、次のページと進めていこうとしてたらツミました。 全然うごかないですw やはりちゃんと読み込み完了を認識するような手段が必要ですね。 たくさんご提案いただきありがとうございます! 全然勉強が追い付いてなくてすいません。。 一番興味のあるFrameは以下でエラーは消えましたが、実行したらNullで実行できずでした。 hogebrowser.CoreWebView2.FrameNavigationCompleted += hoge_Load; これで参考サイトのNewWindowRequested をCoreWebView2NavigationCompletedEventArgsに帰る感じでいけそうなんですかね? if (WebView.CoreWebView2 != null) { //ブラウザーのポップアップ発生時のイベント WebView.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested; } 全然わかってなくてすいません。 いったん頭整理するために睡眠をとろうと思います。
neji-thon

2021/01/23 11:31 編集

なんとかできました! 以下のコードを応用していって出来まして、次、さらに次のページもFrameのページ読み込み完了を認識して順次、実行することができました。 hogebrowser.CoreWebView2.FrameNavigationCompleted += hoge_FrameCompleted; ↓ private void hoge_FrameCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e) { hogebrowser.CoreWebView2.FrameNavigationCompleted -= hoge_FrameCompleted; return; } 正直、まだ+=と-=の意味が分かってないのでそこはおいおい勉強します。 取り急ぎは大丈夫かなと思います。 ご教示ありがとうございます。
TN8001

2021/01/23 12:05

>なんとかできました! そうですかよかったです。 自己回答をしてベストアンサーし、解決済みにしていただけたらと思います。 >+=と-=の意味が分かってない 「C# イベント」や「C# イベントハンドラ」等で検索してみてください^^
neji-thon

2021/01/23 12:13

ありがとうございます。 終わらせかたで悩んでました。 TN8001に感謝したいのですが、何かいいね!をするボタンが見当たらず恐縮です。 自分で聞いておいて、自己解決でクローズが恐縮です。。 何かしてほしいことありますか?フォローしてほしいとか。 teratailを知らず恐縮ですが、、ご教示いただけたら幸いです。
TN8001

2021/01/23 13:20

お気になさらず^^ 試してもいないことを回答するのは私のポリシーではないので、こちらに書かせていただきました。 実際に動いたコードを自己回答されるほうが有益かと思います。
guest

回答1

0

自己解決

TN8001さんご教示の下、以下のコードでFrameのあるページでも読み込み完了後に正しくjavascriptを渡すことができました。

■Frame読み込みさせたい所でこちら

C#

1hogebrowser.CoreWebView2.FrameNavigationCompleted += hogebrowser_NavigationFrameCompleted;

■上記から呼び出される関数内でjavascript実行

C#

1private void hoge_FrameCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e) 2 { 3 hogeBrowser.ExecuteScriptAsync(string.Format($"alert('test');")); 4 hogebrowser.CoreWebView2.FrameNavigationCompleted -= hoge_FrameCompleted; 5 return; 6 }

※上記の通り-=というのを入れないと、ループ処理で大量アクセスが発生したので必ず入れた方がよさそうです。

javascript実行時に最初入れていたawaitも外して問題なかったです。全然勉強不足なので恐縮ですが・・・
環境にも依存してるのかもですが、誰かの役に立てば幸いです。

投稿2021/01/23 13:59

neji-thon

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問