C# Selenium Chromeを起動してたら操作し、起動してなければ新たに起動したい

タグの編集
投稿者 えんぴー  (社会人) 投稿日時 2024/6/3 17:10:24
いつもお世話になっております。
調べても中々見つからないため、たびたび申し訳ありませんが質問させてください。

1.Chromeを起動して自動操作をする
2.①の段階でユーザーがChrome画面を閉じていたら起動しなおす、
  閉じておらず開いたままであれば再利用する

ということを実施したいと思っています。



        public static ChromeDriver driver;
        private readonly string driverLocation = Environment.GetEnvironmentVariable("CHROMEWEBDRIVER");

        private bool Chrome_Login(bool BrowserView = true)
        {

  try
  {
      string Path = System.AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\');
      new DriverManager().SetUpDriver(new ChromeConfig(), VersionResolveStrategy.Latest);
      var driverService = ChromeDriverService.CreateDefaultService();
      ChromeOptions options = new ChromeOptions();
      if (BrowserView == false)
      {
          options.AddArgument("--headless");//完全非表示
      }
      options.AddArgument("no-sandbox");//240517追記
      options.AddExcludedArgument("enable-automation");
      options.AddUserProfilePreference("download.default_directory", Path);
      driverService.HideCommandPromptWindow = true;//コマンドウィンドウ非表示
      driver = new ChromeDriver(driverService, options, TimeSpan.FromSeconds(20));//
      driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(3);//
  }
  catch (OpenQA.Selenium.WebDriverException)
  {
      MessageBox.Show("Chromeを起動してバージョンを最新にしてください");

      Process[] processes = Process.GetProcessesByName("chromedriver");
      foreach (Process process in processes)
      {
          process.Kill();
      }
  }
}


        private void TEST(int NowRow = 0)
        {
  bool KidouCheck = false;
  if (driver == null)//nullになっているパターンと、なっていないパターンがある
  {
      KidouCheck = Chrome_Login();
      if (KidouCheck == falsereturn;
  }

  driver.Url = "http:";//←手動でChromeを閉じると、すでに閉じたとエラーになる
}



自動操作途中のChromeを手動で閉じて
driverのローカル値を見ていましたが
driverがnullになるパターンとならないパターンがあります。
判定直前で落とすと、null判断になりませんでした。

SessionIDとかも関係あるかと思ったのですが
trueのままになってしまい、driverでブラウザを起動していて
ブラウザを閉じていないかの判断方法が分かりません。

あと、起動しているブラウザの拡大率を70%とかに変更したいのですが
それも方法が分かりませんでした。


以下のようにすることを考えたのですが、
何ヵ所か同じようにブラウザの確認をして~というのを利用するため
行数が増えるのと読みづらくなるのがとても嫌でした。


  if (driver == null)
  {
      KidouCheck = Chrome_Login();
      if (KidouCheck == falsereturn;
  }
  try
  {
      var ChromeHandle=chrome.CurrentWindowHandle;
  }
  catch (NoSuchWindowException ex)
  {
      KidouCheck = Chrome_Login();
  }



聞きたいこととしては以下3点です。
・Driver側で、閉じたかどうか簡単に判別する方法はあるか
 →上記方法はありますが、もっと使いまわしのしやすい方法やアドバイスがあればほしいです

・ログイン等をした際、「パスワードを保存するか」などその他ポップアップが出てきますが
 それを出てこないようにする方法はあるか
 →昨日から調べていますが見つからず、継続して調べているところです

・閉じる前の拡大率を保持しておく方法はあるか
 (デフォルトで拡大率を設定する方法はあるか)

質問ばかりで申し訳ありませんが、よろしくお願いいたします。
投稿者 とくま  (社会人) 投稿日時 2024/6/10 10:15:10
Selenium の情報収集は Selenium 中心に扱っているコミュニティ探したほうが良いよ。
C# より、python や basic の情報が倍以上あるので、直接の回答ではなくとも、仕組みや
作法はそっちを読んだ方が分かりやすいと思います。
また、複数の質問を書くのも、回答者側が回答を付け辛いです。
もし話題が膨らむと、枝分かれして収拾つかなくなります。
別にルールがあるわけでもないですし、謝ったりしなくていいですし、守らなくても問題ないですが、
回答がつかないだけです。

> driverがnullになるパターンとならないパターンがあります。
根本的にそういうもんじゃないの?って思います。
そもそも世の中のWEBブラウザという存在はほとんどが、非同期処理の完了を待たないで次の処理を実行します。
またユーザも、5秒ぐるぐるしたら、ブラウザ落としたり、ブラウザバックしたり、他のURLクリックしたり
します。
何か実行して失敗したら、しばらく待ってリトライみたいな世界だと思います。
リトライも3回してダメなら諦めろみたいな。
もちろん同期を取るような考え方もあるでしょうが、そんなプログラム書いたとしても、
ユーザの操作でほぼ意味ないよ?みたいな場面もあるように思います。
「ブラウザバックしないで画面上のボタンを押して終了してください」みたいなサイトもたまに見ますが。。。

> ポップアップ
それってブラウザのセキュリティレベルの設定を下げないと無理とかいう話にならないの?
全て非表示は、時代に逆行している気がします。Selenium では alert のボタンを押す操作で対応するみたい
です。それだけでは対応できなかったのでしょうか?

> 拡大率
「Ctrl + 0」で100%に戻して「Ctrl + +」で拡大、「Ctrl + -」で縮小みたいな
キーボードエミュレートのような操作しか引っ掛からなかったですね。
逆に、拡大率を変えても座標とかが100%のまま取れてきて、最初に「Ctrl + 0」してから
操作しないと成功しない事例とかの情報がありました。覚えておいたほうが良いかも。

以上、Selenium も ReoGrid も触ったこと無いですが、ざっくり検索して引っ掛かった範囲での回答です。
投稿者 えんぴー  (社会人) 投稿日時 2024/6/19 09:31:16
とくま様
回答ありがとうございます。返答が遅れ大変申し訳ありません。
driverがNullかどうか確認し、nullだったら起動、nullじゃなければtryで「CurrentWindowHandle」を確認。
catchで再度driverを定義するようにしたら上手くいきました。
理解しているかどうかは微妙なところですが、今のところ上手く動いてるためこのまま利用しようと思います。

>ポップアップ
options.AddArgument("--incognito");
上記を追加したら消えました!

>拡大率
options.AddArgument("--force-device-scale-factor=0.7"); 
上記で70%の拡大率になりました!

ありがとうございます、Selenium系のコミュニティも探してみます!