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)
恐れ入りますが、どなたかご教示いただけますでしょうか。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー