LoginSignup
25
27

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

Last updated at Posted at 2020-02-24

はじめに

ブラウザ自動テストのデファクトスタンダードである Selenium
そして新進気鋭の Playwright
これらを使用して組んだプログラムは、自分自身でブラウザを起動して自動操作を開始します。

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

動かせた時の感動は省略。

2023/05月 Playwright における実装方法を追記しました。

やったこと

ブラウザの起動

今回の手法は、ブラウザを起動するところにポイントがあります。
コマンドライン引数で -remote-debugging-port=9222 を指定してあげるのです!
DevTools Protocol が有効な状態でブラウザが起動します。
これによって、Selenium および Playwright がアタッチできるようになります。
※ MicrosoftEdge を起動したい場合は msedge
  GoogleChrome を起動したい場合は chrome を指定してください。

msedge --remote-debugging-port=9222 --user-data-dir=C:\Temp_ForChromium

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

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: 要求は中止されました: 操作はタイムアウトになりました。

Playwright の場合:

connect ECONNREFUSED 127.0.0.1:9222
=========================== logs ===========================
retrieving websocket url from http://localhost:9222
============================================================

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

ソース (Selenium の場合)

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.FindElement(By.Name("q"));
    q.SendKeys("Chromium");
    q.Submit();

    wait.Until(ExpectedConditions.TitleIs("Chromium - Google 検索"));
    ((ITakesScreenshot)driver).GetScreenshot().SaveAsFile($"{DateTime.Now.ToString("yyyyMMddHHmmss")}.png");
    // 任意のブラウザ操作処理 ↑↑↑
}

ソース (Playwright の場合)

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

using (var playwright = await Playwright.CreateAsync())
{
    var browser = await playwright.Chromium.ConnectOverCDPAsync("http://localhost:9222");
    var page = browser.Contexts[0].Pages[0];

    // 任意のブラウザ操作処理 ↓↓↓
    _ = await page.GotoAsync("https://playwright.dev/dotnet");
    _ = await page.ScreenshotAsync(new PageScreenshotOptions { Path = "screenshot.png" });
    // 任意のブラウザ操作処理 ↑↑↑

    await browser.DisposeAsync();
}

おわりに

参考にしたページ:
Selenium: Attach to an existing Chrome browser with C#
BrowserType | Playwright .NET ConnectOverCDPAsync

25
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
27