SeleniumでEdge(Chromium版)をヘッドレスモードで利用する。

Edgeのバージョン

Edgeには2つのバージョンがあります。

  • レガシー版Edge
    Windows10に標準機能として提供されていたEdge
    InternetExplorerから派生したEdgeHTMLベースのEdge
    (2021年3月9日サポート終了予定)
  • Chromium版Edge
    2020年1月15日にリリースされた、オーブソースであるChromiumベースのEdge
    (現在はこちらが提供されている)

InternetExplorerとレガシー版のEdgeには、ヘッドレスモードがありません。
Chomium版のEdgeは、ヘッドレスモードで動かすことができます。

ヘッドレスモードは、画面を描画しないので

  • 通常のEdgeより高速で、リソースの消費も少ない
  • Linuxなど、GUIを持たない環境でも利用できる
  • バックグラウンドで処理されるのでPCを占有しない。
    Seleniumが動作している間も、ユーザーは別作業ができる。

といった特長があります。

ヘッドレスモードでEdgeDriver(Chromium版)を起動する

EdgeDriverのEdgeOptionsクラスを利用します。
add_argumentメソッドを使用して、起動時のオプションに【headless】を追加します。

#msedge-selenium-toolsが必要
#pip install msedge-selenium-tools
from msedge.selenium_tools import Edge, EdgeOptions
#from selenium.webdriver.edge.options import Options

options = EdgeOptions()
options.use_chromium = True
options.add_argument('--headless')

path = r'D:\tmp\driver\Edge\msedgedriver.exe'
driver = Edge(executable_path=path, options=options)

driver.get('https://google.com')
driver.get_screenshot_as_file(r"D:\tmp\sc1.png")    #上書きOK

driver.quit()
/* selenium-java-4.0.0-alpha-7が必要
*  ダウンロード元:https://www.selenium.dev/downloads/
*/
package example;
import java.io.*;
import org.apache.commons.io.*;
//import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.OutputType;
public class headless_edge {
    public static void main( String[] args )
    {
        EdgeOptions options = new EdgeOptions();
        options.addArguments("--headless");

        System.setProperty("webdriver.edge.driver", "D:\\tmp\\driver\\Edge\\msedgedriver.exe");
        EdgeDriver driver = new EdgeDriver(options); 

        driver.get("https://google.com");
        File tmp = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        try{
            System.out.println(tmp);
            File sc1 = new File("D:\\tmp\\sc1.png");
            FileUtils.forceDelete(sc1);
            FileUtils.moveFile(tmp, sc1); //上書きNG
        }catch(Exception e){
            e.printStackTrace();
        }
        driver.quit();
    }
}
// Microsoft.Edge.SeleniumToolsが必要
using System;
using OpenQA.Selenium;
//using OpenQA.Selenium.Edge;
using Microsoft.Edge.SeleniumTools;

namespace example
{
    class Program
    {
        static void Main(string[] args)
        {
            EdgeOptions options = new EdgeOptions();
            options.UseChromium = true;
            options.AddArgument("--headless");

            String path = @"D:\tmp\driver\Edge";    //フォルダを指定
            EdgeDriver driver = new EdgeDriver(path, options);

            driver.Navigate().GoToUrl("https://google.com");
            Screenshot ss = ((ITakesScreenshot)driver).GetScreenshot();
            ss.SaveAsFile(@"D:\tmp\sc1.png", ScreenshotImageFormat.Png);    //上書きOK
            driver.Quit();
        }
    }
}
' Microsoft.Edge.SeleniumToolsが必要
Imports OpenQA.Selenium
Imports Microsoft.Edge.SeleniumTools
'Imports OpenQA.Selenium.Edge
Module Module1
    Sub Main()
        Dim options = New EdgeOptions()
        options.UseChromium = True
        options.AddArgument("--headless")

        Dim path = "D:\\tmp\\driver\\Edge"   'フォルダを指定
        Dim driver = New EdgeDriver(path, options)

        driver.Navigate().GoToUrl("https://google.com")
        Dim ss = driver.GetScreenshot()
        ss.SaveAsFile("D:\\tmp\\sc1.png", ScreenshotImageFormat.Png)    '上書きOK
        driver.Quit()
    End Sub
End Module
# selenium-webdriver 4.0.0が必要
# gem install selenium-webdriver --pre
gem "selenium-webdriver", "4.0.0.alpha7"
require "selenium-webdriver"

options = Selenium::WebDriver::EdgeChrome::Options.new
options.add_argument('--headless')

Selenium::WebDriver::Edge::Service.driver_path = 'D:\tmp\driver\Edge\msedgedriver.exe'
driver = Selenium::WebDriver.for :edge_chrome , options: options

driver.get("https://google.com")
driver.save_screenshot("D:\\tmp\\sc1.png")    #上書きOK
driver.quit()
/* edge-selenium-toolsが必要
*  npm install @microsoft/edge-selenium-tools
*/
const fs = require('fs');
let edge = require('selenium-webdriver/edge');
//let webdriver = require('selenium-webdriver');
 
let options = new edge.Options();
options.setEdgeChromium(true);
options.addArguments("--headless");

let path = "D:\\tmp\\driver\\edge\\msedgedriver.exe";
let service = new edge.ServiceBuilder(path).build();

(async () => {
    var driver = await edge.Driver.createSession(options, service);

    await driver.get("https://google.com");
    var ss = await driver.takeScreenshot();
    fs.writeFile('D:\\tmp\\sc1.png', ss, 'base64', function(err) {
        //console.log(err);
    });
    /* 1行で書く場合
    await driver.takeScreenshot().then(function(image){
        fs.writeFile('D:\\tmp\\sc1.png', image, 'base64', function(err) {
            console.log(err);
        });
    });*/
    await driver.quit();
})();

プログラムを実行すると、画面上には何も現れませんが、Edgeが起動します。

タスクマネージャー

ブラウザの画面イメージも取得可能です。

取得イメージ
sc1.png

2021-01-26Selenium Tips--headless,EdgeDriver,EdgeOptions

Posted by sj