質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Capybara

Capybaraは、 Rubyで開発されているWebアプリケーションテストフレームワークです。Webブラウザ不要でブラウザ上のユーザー操作及びJavaScriptの挙動を自動化することができます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

3167閲覧

Capybara で Selenium::WebDriver::Error::UnknownError

NCC1701

総合スコア1680

Capybara

Capybaraは、 Rubyで開発されているWebアプリケーションテストフレームワークです。Webブラウザ不要でブラウザ上のユーザー操作及びJavaScriptの挙動を自動化することができます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2020/03/29 03:46

前提・実現したいこと

Capybara でクローラーを作ろうとしてます。
まずは、単純にサイトにアクセスしてスクリーンショットを撮ることころから始めようとしたのですが、しょっぱなからつまずいています。
(いわゆるテストではなくてクローラーです。Mechanize だと Javascript が扱えないので、乗り換えを企図してます。)

ウェブドライバー側に原因がありそうなのですが、具体的な対処法がわかりません。
(インストールし足りないものがあるのか?設定が間違っているのか?)

発生している問題・エラーメッセージ

後記スクリプトを実行するとこのエラーになります。

Traceback (most recent call last): 19: from lib/crawler.rb:22:in `<main>' 18: from lib/crawler.rb:17:in `start_scraping' 17: from lib/crawler.rb:17:in `tap' 16: from lib/crawler.rb:18:in `block in start_scraping' 略 1: from /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/response.rb:34:in `initialize' /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/response.rb:72:in `assert_ok': unknown error: Chrome failed to start: exited abnormally (Selenium::WebDriver::Error::UnknownError) (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location /usr/lib/chromium/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

シェルから直接次のように実行すると、エラーが出るのですが(ワーニングはとりあえず無視)、スクリーンショットは撮れてしまいます。
chromium-browser --headless --disable-gpu --screenshot --no-sandbox --disable-dev-shm-usage https://www.teratail .com

sh

1[0329/122614.302251:WARNING:dns_config_service_posix.cc(341)] Failed to read DnsConfig. 2[0329/122614.444994:ERROR:gl_implementation.cc(282)] "Failed to load /usr/lib/chromium/swiftshader/libGLESv2.so: Error loading shared library /usr/lib/chromium/swiftshader/libGLESv2.so: No such file or directory" 3[0329/122614.449670:ERROR:viz_main_impl.cc(180)] "Exiting GPU process due to errors during initialization" 4[0329/122614.460360:WARNING:gpu_process_host.cc(1213)] The GPU process has crashed 1 time(s) 5[0329/122614.474090:WARNING:dns_config_service_posix.cc(341)] Failed to read DnsConfig. 6[0329/122614.571643:WARNING:gpu_process_host.cc(982)] Reinitialized the GPU process after a crash. The reported initialization time was 0 ms 7[0329/122614.573588:ERROR:gpu_channel_manager.cc(450)] "ContextResult::kFatalFailure: Failed to create shared context for virtualization." 8[0329/122615.273748:ERROR:child_process_sandbox_support_impl_linux.cc(79)] "FontService unique font name matching request did not receive a response." 9[0329/122615.278219:ERROR:child_process_sandbox_support_impl_linux.cc(79)] "FontService unique font name matching request did not receive a response." 10 1112 13[0329/122620.627196:INFO:headless_shell.cc(620)] Written to file screenshot.png.

上記エラー中
/usr/lib/chromium/swiftshader/libGLESv2.soがないと言われてるのですが /usr/lib/libGLESv2.soにはあります。
ln -s /usr/lib/libGLESv2.so /usr/lib/chromium/swiftshader/libGLESv2.so をしても変わりなかったです。)

該当のソースコード

ruby

1require 'capybara' 2require 'selenium-webdriver' 3 4Capybara.register_driver :selenium do |app| 5 Capybara::Selenium::Driver.new(app, 6 browser: :chrome, 7 desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome( 8 chrome_options: { 9 args: %w(headless disable-gpu window-size=1280,800 no-sandbox disable-dev-shm-usage), 10 }, 11 ) 12 ) 13end 14Capybara.javascript_driver = :selenium 15 16def start_scraping(url, &block) 17 Capybara::Session.new(:selenium).tap { |session| 18 session.visit url 19 session.instance_eval(&block) 20 } 21end 22start_scraping 'https://www.teratail.com/' do 23 p title 24 save_screenshot 25end 26

試したこと

Docker上の環境でやっています。apkでインストールしてるのはつぎのとおり

apk --no-cache update && apk --no-cache upgrade && apk --no-cache --update add \ cups-client \ nodejs \ yarn \ tzdata \ sqlite \ git \ postgresql-dev \ libc-dev \ libxml2-dev \ libxslt-dev \ linux-headers \ ruby-dev \ zlib-dev \ yaml-dev \ sqlite-dev \ build-base \ less \ mesa-dev \ udev \ chromium-chromedriver chromium

補足情報(FW/ツールのバージョンなど)

Alpine Linux version 4.9.184-linuxkit (root@a8c33e955a82) (gcc version 8.3.0 (Alpine 8.3.0) )
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux-musl]
chromium-browser Chromium 79.0.3945.130

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

ruby

1options = Selenium::WebDriver::Chrome::Options.new 2options.add_argument('--headless') 3options.add_argument('--disable-gpu') 4options.add_argument('--no-sandbox') 5@driver = Selenium::WebDriver.for :chrome, options: options 6 7url = 'https://https://teratail.com' 8 9@driver.get url 10@driver.save_screenshot 'screenshot.png'

原因不明のため Capybara を諦めました。とりあえず、selenium のみを使用してます。

投稿2020/03/31 05:44

NCC1701

総合スコア1680

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問