web-dev-qa-db-ja.com

DockerコンテナでSelenium chromeドライバを実行するにはどうすればよいですか?

tl; dr

DockerコンテナでSeleniumを実行するためにすべてのコンポーネントをインストールする方法を教えてください。


質問

私はこの画像から始めています:

FROM Microsoft/aspnetcore-build:2 AS builder
WORKDIR /source

COPY . .
RUN dotnet restore
RUN dotnet build
ENTRYPOINT ["dotnet", "run"]

ヘッドレスChrome Driver with this:

ChromeOptions options = new ChromeOptions();
options.AddArgument("--headless");
options.AddArgument("--disable-gpu");
var driverPath = Path.GetFullPath(Path.Combine(environment.ContentRootPath, "bin/Debug/netcoreapp2.0"));
return new ChromeDriver(driverPath, options, TimeSpan.FromSeconds(60));

dockerコンテナー内?


私は何を試しましたか

Chromeドライバのインストール

chromedriverSelenium.WebDriver.ChromeDriver NuGetパッケージを介して配布されます。

Chromeのインストール

GoogleがインストールされているMac OS X Chromeがインストールされている場合、現在の設定は問題なく動作します。

私はこれらの行を追加しようとしました:

RUN apt-get update && apt-get -y install libglib2.0-dev libxi6 libnss3-dev
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
RUN apt-get update && apt-get -y install google-chrome-stable

上記はこのバージョンのChromeをインストールします:

google-chrome-stable:
  Installed: 64.0.3282.119-1
  Candidate: 64.0.3282.119-1
  Version table:
 *** 64.0.3282.119-1 500
        500 http://dl.google.com/linux/chrome/deb stable/main AMD64 Packages
        100 /var/lib/dpkg/status

Chromeドライバのバージョンと互換性があります。

これは、DockerコンテナでSeleniumを実行しようとすることで発生する各エラーを解決しようとすることから生じます。

このセットアップを実行すると、次のようになります。

ポート57889でChromeDriver 2.35.528139(47ead77cb35ad2a9a83248b292151462a66cd881)を起動していますローカル接続のみが許可されています。リクエストの送信中にエラーが発生しました。接続できませんでした

コンテナを実行するとき。

コンテナでのデバッグ

コンテナを手動で入力してchromeドライバを手動で実行しようとすると、次のようになります。

ポート9515でChromeDriver 2.35.528139(47ead77cb35ad2a9a83248b292151462a66cd881)を起動していますローカル接続のみが許可されています。

実行中のcurl -i http://localhost:9515/statusを取得:

HTTP/1.1 200 OK
Content-Length:136
Content-Type:application/json; charset=utf-8
Connection:close

{"sessionId":"","status":0,"value":{"build":{"version":"alpha"},"os":{"Arch":"x86_64","name":"Linux","version":"4.9.60-linuxkit-aufs"}}}

そのため、ドライバーは正常に動作しているようです。

代わりにchromeヘッドレスをgoogle-chrome-stable --headless --disable-cpu --no-sandbox経由で実行すると、次のようになります。

[0125/210641.877388:WARNING:discardable_shared_memory_manager.cc(178)] Less than 64MB of free space in temporary directory for shared memory files: 63
[0125/210641.902689:ERROR:instance.cc(49)] Unable to locate service manifest for metrics
[0125/210641.902756:ERROR:service_manager.cc(890)] Failed to resolve service name: metrics
[0125/210642.031088:ERROR:instance.cc(49)] Unable to locate service manifest for metrics
[0125/210642.031119:ERROR:service_manager.cc(890)] Failed to resolve service name: metrics
[0125/210642.032934:ERROR:gpu_process_transport_factory.cc(1009)] Lost UI shared context.

最初の警告は、/dev/shm:/dev/shmにDockerボリュームを設定するか、-shm-sizeを64MBより大きい値に設定することで解決できます。

残りのエラーは、Googleの場合、Googleからの多くのバグレポートにつながりますChromeリポジトリ。

14
Shoe

最も一般的なオプションは、「docker Selenium」または「selenoid」です。実装は異なりますが、どちらのソリューションもdockerを利用して、Seleniumグリッドに似たテスト環境を作成します。

私は「セレノイド」をお勧めし、それを適切に構成するには、次のガイドから始めることができます: https://www.swtestacademy.com/selenoid-tutorial/

「docker Selenium」を選択した場合、これが出発点になる可能性があります。 https://www.swtestacademy.com/docker-Selenium-tutorial/

1
eroteev

リモートドライバーの場所として使用されるDockerコンテナーを中心に構築された、かなりきちんとしたフレームワークがあります。

http://aerokube.com/selenoid/latest/

まだ完全には実装していませんが、適切なchromeと内部にFirefoxドライバーを備えたDockerコンテナーを簡単に作成できました。

0