Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

SeleniumのChromeDriverで起動済みのブラウザを操作する

More than 1 year has passed since last update.

はじめに

ブラウザ自動テストのデファクトスタンダードであるSelenium
基本的にSeleniumを使用して組んだプログラムは、自分自身でブラウザを起動して自動操作を開始します

しかし、起動済みのブラウザを自動操作したい!というケースもありますよね?
はたしてChromeDriverを使って起動済みのブラウザを操作することができるのか?

動かせた時の感動は省略

やったこと

ブラウザの起動

今回の手法は、Google Chrome を起動するところにポイントがあります。
コマンドライン引数で-remote-debugging-port=9222を指定してあげるのです!
DevTools Protocol が有効な状態でブラウザが起動するので、 Selenium がアタッチできるようになるんですね。

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -remote-debugging-port=9222 --user-data-dir=C:\Temp_ForChrome

--user-data-dirの指定も忘れずに。
操作対象のブラウザ以外に Google Chrome を起動している場合、
ユーザプロファイルがあるフォルダとして同一パスをSeleniumで指定することができないようです。
私の環境ではタイムアウトエラーになってしまいました。

OpenQA.Selenium.WebDriverException: The HTTP request to the remote WebDriver server for URL http://localhost:61065/session timed out after 60 seconds. ---> System.Net.WebException: 要求は中止されました: 操作はタイムアウトになりました。

参考:SeleniumでChromeのユーザープロファイルを指定しつつ同時に自分もChromeを使う方法

ソース

ChromeOptions.DebuggerAddressにブラウザ起動時に指定したものと同じポート番号を指定します。
ブラウザ起動済みの状態で当プログラムを実行すると、見事に動き始めます。

var options = new ChromeOptions
{
    DebuggerAddress = "127.0.0.1:9222"
};

using (var driver = new ChromeDriver(options))
{
    var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 5));

    // 任意のブラウザ操作処理 ↓↓↓

    driver.Url = "https://www.google.com";
    var q = driver.FindElementByName("q");
    q.SendKeys("Chromium");
    q.Submit();

    wait.Until(ExpectedConditions.TitleIs("Chromium - Google 検索"));
    ((ITakesScreenshot)driver).GetScreenshot().SaveAsFile($"{DateTime.Now.ToString("yyyyMMddHHmmss")}.png");

    // 任意のブラウザ操作処理 ↑↑↑
}

おまけ

Google Chrome を起動する部分がポイントだったわけです。
ここで、手動ではなく別プログラム経由で起動されたブラウザを自動操作したい場合を考えてみます。
うまいこと-remote-debugging-portを指定してあげる必要がありますよね?

やるとすればこんな感じか。。?

using System.Diagnostics;

/// <summary>
/// chrome.exe という名前のアセンブリとしてビルドする
/// </summary>
namespace DummyChrome
{
    class Program
    {
        static void Main(string[] args)
        {
            var proc = new Process();
            proc.StartInfo.FileName = @"C:\Program Files (x86)\Google\Chrome\Application\_chrome.exe";
            proc.StartInfo.Arguments = @"-remote-debugging-port=9222 --user-data-dir=C:\Temp_ForChrome";
            proc.Start();
        }
    }
}

オリジナルのchrome.exe_chrome.exeにリネームしてしまいます。
Google Chrome の通常利用に支障が出るのはご愛敬。
image.png

おわりに

参考にしたページ:
Selenium: Attach to an existing Chrome browser with C#

参考になりそうでしなかったページ:
Re-using existing browser session in Selenium using C#
Reflectionをつかってprivateメンバーにアクセスしてるので黒魔術感が否めない。
そもそもやりたいことが違う雰囲気もある。

yk109
C#er。Seleniumer。業プロer。競プロer。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away