2019/2/8更新
一度「解決済み」にしましたが、後から再度試してみたところ、再現ができなかったので、未解決扱いとしてご確認をお願いいたします。
こんにちは。
現在、SeleniumとChromeDriverを利用してChromeを動かしてスクレイピングを行っております。
今回、SeleniumWebDriverにuser-data-dirとheadlessとの設定を両立させることができなくて困っています。
##経緯
これまで、Seleniumの初期設定コードを
ruby
1caps = Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: {args: ["--user-data-dir=./profile"]}) 2@d = Selenium::WebDriver.for :chrome, desired_capabilities: caps
とし、問題なくSeleniumが起動しておりました。user-data-dirを設定することで、Cookie値などの情報を残しています。
今回、Seleniumなどのアップデートがあったこと、headlessモードを組み込みたいと思い、
- 最新のSeleniumに対応したコードの記述への変更(参考:https://ppworks.github.io/posts/324/)
- headlessモード実装の記述
を以下のように追加しました。
ruby
1caps = Selenium::WebDriver::Remote::Capabilities.chrome( 2 options: Selenium::WebDriver::Chrome::Options.new( 3 args: ["--headless", "--user-data-dir=./profile"] 4 ) 5) 6 7@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>'
これまで試したこと
これらのことが起こったため、これまでに以下の対応策を試しましたが全部ダメでした。
######以前のコード様式に書き足してみた
ruby
1caps = Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: {args: ["--headless", "--user-data-dir=./profile"]}) 2@d = Selenium::WebDriver.for :chrome, desired_capabilities: caps
結果…Timeoutエラー
######以前のコード様式でheadlessのみ書いてみた
ruby
1caps = Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: {args: ["--headless"]}) 2@d = Selenium::WebDriver.for :chrome, desired_capabilities: caps
結果…headlessがちゃんと動いた!(でも、当然user-data-dirは機能しないです)
######新しいコード様式でheadlessのみ書いてみた
ruby
1caps = Selenium::WebDriver::Remote::Capabilities.chrome( 2 options: Selenium::WebDriver::Chrome::Options.new( 3 args: ["--headless"] 4 ) 5)
結果…普通にChromeが立ち上がってしまう
######設定値にdisable-gpuを組み込んだ
ruby
1--disable-gpu
変化なし(というか、今のバージョンではいらないらしいですね!)
######Capabilitiesとかのコードを省いた
ruby
1options = Selenium::WebDriver::Chrome::Options.new 2options.add_argument("--headless") 3options.add_argument("--user-data-dir=./profile") 4@d = Selenium::WebDriver.for :chrome, options: options
Timeoutエラー
※ちなみに、なぜかMac環境では動いた…がdriver.find_elementsなどのコードでXPATHを特定することができなくなってた
######この形式を試してみたその1
ruby
1caps = 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
ruby
1caps = 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上では機能する…ということがわかり、ベトナムのエンジニアさんにも確認をしてみましたが解決せず現状は今も変わっておりません。仕方がないので、実現しようと思っていたことを違う方法で試してみたいと思いますが、もし、解決方法をご存知の方がいらっしゃいましたらご教授いただければ幸いです。
回答5件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2019/02/01 07:07
2019/02/08 02:04