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

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

ただいまの
回答率

90.45%

  • Ruby

    9711questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Windows

    1739questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • Windows 10

    1287questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

  • Chrome

    806questions

    Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

  • selenium

    738questions

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

【未解決】user-data-dirを設定しているSelenium WebDriverでChromeのheadlessモードが利用できない

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,056

Toku1011

score 16

2019/2/8更新
一度「解決済み」にしましたが、後から再度試してみたところ、再現ができなかったので、未解決扱いとしてご確認をお願いいたします。

こんにちは。
現在、SeleniumとChromeDriverを利用してChromeを動かしてスクレイピングを行っております。
今回、SeleniumWebDriverにuser-data-dirheadlessとの設定を両立させることができなくて困っています。

経緯

これまで、Seleniumの初期設定コードを

caps = Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: {args: ["--user-data-dir=./profile"]})
@d = Selenium::WebDriver.for :chrome, desired_capabilities: caps


とし、問題なくSeleniumが起動しておりました。user-data-dirを設定することで、Cookie値などの情報を残しています。

今回、Seleniumなどのアップデートがあったこと、headlessモードを組み込みたいと思い、

  • 最新のSeleniumに対応したコードの記述への変更(参考:https://ppworks.github.io/posts/324/)
  • headlessモード実装の記述
    を以下のように追加しました。
caps = Selenium::WebDriver::Remote::Capabilities.chrome(
  options: Selenium::WebDriver::Chrome::Options.new(
    args: ["--headless", "--user-data-dir=./profile"]
  )
)

@d = Selenium::WebDriver.for :chrome, desired_capabilities: caps

しかし、このプログラムでは毎回Timeoutエラーとなってしまいます。

エラーコード

[0822/111304.239:ERROR:gpu_process_transport_factory.cc(1016)] Lost UI shared context.

DevTools listening on ws://127.0.0.1:53760/devtools/browser/d3a80661-b207-45b7-9e12-cb0a5601914d
C:/Ruby23/lib/ruby/2.3.0/net/protocol.rb:158:in `rbuf_fill': Net::ReadTimeout (Net::ReadTimeout)
        from C:/Ruby23/lib/ruby/2.3.0/net/protocol.rb:136:in `readuntil'
        from C:/Ruby23/lib/ruby/2.3.0/net/protocol.rb:146:in `readline'
        from C:/Ruby23/lib/ruby/2.3.0/net/http/response.rb:40:in `read_status_line'
        from C:/Ruby23/lib/ruby/2.3.0/net/http/response.rb:29:in `read_new'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:1437:in `block in transport_request'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:1434:in `catch'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:1434:in `transport_request'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:1407:in `request'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:1400:in `block in request'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:853:in `start'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:1398:in `request'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.14.0/lib/selenium/webdriver/remote/http/default.rb:121:in `response_for'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.14.0/lib/selenium/webdriver/remote/http/default.rb:76:in `request'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.14.0/lib/selenium/webdriver/remote/http/common.rb:62:in `call'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.14.0/lib/selenium/webdriver/remote/bridge.rb:164:in `execute'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.14.0/lib/selenium/webdriver/remote/bridge.rb:97:in `create_session'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.14.0/lib/selenium/webdriver/remote/bridge.rb:53:in `handshake'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.14.0/lib/selenium/webdriver/chrome/driver.rb:48:in `initialize'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.14.0/lib/selenium/webdriver/common/driver.rb:44:in `new'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.14.0/lib/selenium/webdriver/common/driver.rb:44:in `for'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.14.0/lib/selenium/webdriver.rb:86:in `for'
        from like_follow_comment.rb:221:in `<main>'

これまで試したこと

これらのことが起こったため、これまでに以下の対応策を試しましたが全部ダメでした。

以前のコード様式に書き足してみた
caps = Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: {args: ["--headless", "--user-data-dir=./profile"]})
@d = Selenium::WebDriver.for :chrome, desired_capabilities: caps


結果…Timeoutエラー

以前のコード様式でheadlessのみ書いてみた
caps = Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: {args: ["--headless"]})
@d = Selenium::WebDriver.for :chrome, desired_capabilities: caps


結果…headlessがちゃんと動いた!(でも、当然user-data-dirは機能しないです)

新しいコード様式でheadlessのみ書いてみた
caps = Selenium::WebDriver::Remote::Capabilities.chrome(
  options: Selenium::WebDriver::Chrome::Options.new(
    args: ["--headless"]
  )
)


結果…普通にChromeが立ち上がってしまう

設定値にdisable-gpuを組み込んだ
--disable-gpu


変化なし(というか、今のバージョンではいらないらしいですね!)

Capabilitiesとかのコードを省いた
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument("--headless")
options.add_argument("--user-data-dir=./profile")
@d = Selenium::WebDriver.for :chrome, options: options


Timeoutエラー
※ちなみに、なぜかMac環境では動いた…がdriver.find_elementsなどのコードでXPATHを特定することができなくなってた

この形式を試してみたその1
caps = Selenium::WebDriver::Remote::Capabilities.chrome("chromeOptions" => {args: ["--headless","--user-data-dir=./profile"]})


結果…エラー

C:/Ruby23/lib/ruby/2.3.0/net/protocol.rb:158:in `rbuf_fill': Net::ReadTimeout (Net::ReadTimeout)
        from C:/Ruby23/lib/ruby/2.3.0/net/protocol.rb:136:in `readuntil'
        from C:/Ruby23/lib/ruby/2.3.0/net/protocol.rb:146:in `readline'
        from C:/Ruby23/lib/ruby/2.3.0/net/http/response.rb:40:in `read_status_line'
        from C:/Ruby23/lib/ruby/2.3.0/net/http/response.rb:29:in `read_new'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:1437:in `block in transport_request'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:1434:in `catch'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:1434:in `transport_request'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:1407:in `request'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:1400:in `block in request'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:853:in `start'
        from C:/Ruby23/lib/ruby/2.3.0/net/http.rb:1398:in `request'
この形式を試してみたその2
caps = Selenium::WebDriver::Remote::Capabilities.chrome("chromeOptions" => {args: ["--headless"]})


結果…headlessのみ、user-data-dirの設定であれば問題なく動いた!

開発環境

Windows…Windows Server 2016 Datacenter バージョン1607

Ruby… 2.3.3p222

ChromeDriver… 2.41.578737
ダウンロードしたexeファイルをCドライブ>Ruby23>binに格納
Selenium-WebDriver… 3.14.0
…gem install selenium-webdriverで導入

すべてパスなども問題なく通っています

このような状況でございます。解決策がわからない状況なので、ご教授のほどよろしくお願いいたします。。。設定コード以下についてはおそらく今回のエラーに関係ないと思われることと、企業秘密であるため公開しておりません。

9/21追記
結局、Windows(AWS EC2)ではheadlessは機能せず、Mac上では機能する…ということがわかり、ベトナムのエンジニアさんにも確認をしてみましたが解決せず現状は今も変わっておりません。仕方がないので、実現しようと思っていたことを違う方法で試してみたいと思いますが、もし、解決方法をご存知の方がいらっしゃいましたらご教授いただければ幸いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

check解決した方法

+1

USER_AGENT = "xxxxx"
option = Selenium::WebDriver::Chrome::Options.new(args: ["--headless", "--lang=ja", "--user-data-dir=./profile", "--user-agent=#{USER_AGENT}"])

driver = Selenium::WebDriver.for :chrome, options: option

自己解決したので更新します

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/01 16:07

    同じコードで試してみたのですが、headlessではできる自動ログイン処理をheadlessモードにすると、user-data-dirが効いていないようで期待している結果が得られません。@Toku1011さんはこのコードでログイン処理成功しているのですよね、、?

    キャンセル

  • 2019/02/08 11:04

    すみません、確認のため私の方で再度試してみたところ、セレニウムドライバーが立ち上がらないという事態になり再現性がありませんでした。
    そのため、再度この質問ページを質問中扱いにするため、【未解決】の文字を入れました。大変申し訳ございませんでした。再度、こちらでも調査を進めていきます。

    キャンセル

+1

こちらの問題に自分も引っかかったのですが、何か解決策がありましたらご教示いただければありがたいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/23 14:57 編集

    現在、このコードで利用できるようになりましたので更新して解決済みにしておきます。質問したままで解決後もほったらかしにしてしまいすみません。

    USER_AGENT = "xxxxx"
    option = Selenium::WebDriver::Chrome::Options.new(args: ["--headless", "--lang=ja", "--user-data-dir=./profile", "--user-agent=#{USER_AGENT}"])

    driver = Selenium::WebDriver.for :chrome, options: option

    キャンセル

0

Toku1011 さん

結局、headlessモードでuser-data-dirは有効(=ログイン状態の保持などができる)にできたということでしょうか?
また、その場合は何をすることでできるようになったのでしょうか?
上記コードにSNSログインをするコードを付け足して試してみたところ、
非headlessでは認証情報が保持されて、headlessでは保持されていませんでした。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/08 11:02

    すみません、確認のため私の方で再度試してみたところ、セレニウムドライバーが立ち上がらないという事態になり再現性がありませんでした。
    そのため、再度この質問ページを質問中扱いにするため、【未解決】の文字を入れました。大変申し訳ございませんでした。再度、こちらでも調査を進めていきます。

    キャンセル

0

大変申し訳ございません。
自己解決としていたのですが、再度実行する機会があり自己解決コードで試したところ、実行できなかったという事態がありました。
そのため、再度「質問中」扱いとしております。(システム上、一度解決済みにしてしまうと変更ができないみたいなので、表題に書いてあります)

私の方でも再度調査を進めてまいります。よろしくお願いいたします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/08 12:35

    ステータス変更ありがとうございます。
    私も同現象を追っているので何かわかったことがあればメモしていきます。
    よろしくお願いします。

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    9711questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Windows

    1739questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • Windows 10

    1287questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

  • Chrome

    806questions

    Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

  • selenium

    738questions

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