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

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

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

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

Chrome

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

selenium

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

Q&A

0回答

401閲覧

Selenium+Ruby、headlessにした途端に不思議な挙動

annaPanda

総合スコア130

Ruby

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

Chrome

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

selenium

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

0グッド

0クリップ

投稿2020/01/03 04:35

ローカルでターミナルで動かしています。
seleniumを使って楽天にログインして買い物かごにある商品を5個入れるという内容です。
headlessの部分をコメントアウトするとブラウザが目に見えて起動して思ったような結果になります。
headlessにするとかごに商品は入るのですが、商品数がなぜか倍になってしまいます。
HTML上、商品数はプルダウンでvalueと商品数が同じです。
細かく挙動を言うと、プルダウンで100まで用意されていて、1〜50は倍になり50〜100はそのままです。

require 'selenium-webdriver' options = Selenium::WebDriver::Chrome::Options.new options.add_argument('--headless') d = Selenium::WebDriver.for :chrome, options: options wait = Selenium::WebDriver::Wait.new(:timeout => 30) d.get("https://www.rakuten.co.jp/") wait.until { d.find_element(:xpath, '//*[@id="wrapper"]/div[5]/div/ul[2]/li[2]/button').displayed? } d.find_element(:xpath, '//*[@id="wrapper"]/div[5]/div/ul[2]/li[2]/button').click wait.until { d.find_element(:id, "loginInner_u").displayed? } d.find_element(:id, "loginInner_u").send_keys('メールアドレス') d.find_element(:id, "loginInner_p").send_keys('パスワード') d.find_element(:class, "loginButton").click d.get("https://item.rakuten.co.jp/kenkocom/e104166h/") Selenium::WebDriver::Support::Select.new(d.find_element(:xpath, '//*[@id="normal_basket_10852676"]/tbody/tr[3]/td/select')).select_by(:value, '5') d.find_element(:xpath, '//*[@id="normal_basket_10852676"]/tbody/tr[3]/td/span[2]/span/span[1]/button').click

わかるかたいらっしゃいましたらよろしくお願いいたします。

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

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

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

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

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

otn

2020/01/03 04:51

何番目の要素というXPath指定を多用しているのが気になります。 目的じゃないところをクリックしているとかはないでしょうか?
annaPanda

2020/01/03 06:15

コメントありがとうございます。 ``` Selenium::WebDriver::Support::Select.new(d.find_element(:class, 'rItemUnits')).select_by(:value, '5') d.find_element(:class, 'new-cart-button').click ``` と、下二行をclassに変えても同じです。 上にも書きましたが、 ``` options.add_argument('--headless') ``` をコメントアウトするだけで、思った挙動になるので、 別なとこをクリックというわけじゃないと思いますが、、、
otn

2020/01/03 10:42

それでは、 HTMLと画面イメージをファイルに保存してデバッグですね。
annaPanda

2020/01/03 12:08

クリックやプルダウン部分を同時にHTML出力もさせて、さらにスクショも撮るってことで間違いないですか?
otn

2020/01/03 12:15

そうですね。私ならそうします。ファイル名を変えながら、1動作ごとに取ります。 d.save_screenshot("#{file}.png") IO.write("#{file}.html",d.page_source)
annaPanda

2020/01/03 12:39

" 1動作ごと"、そうですよね、勉強になります。挑戦してみます。 派生する話で質問があり、もしお時間ありましたら回答お願いします。 上の機能を含んだrailsアプリの作成を考えていて、今実験として、上のコードを、すでにEC2にデプロイしている別のアプリのコントローラのcreateアクションにのせてみて挙動をみています。タイムアウトが原因でエラーになるのですが、数回目から、メモリー不足が原因でMysqlが立ち上がらない状態になってしまいました。AWSの無料枠でやっているのですが、上程度のコードでメモリーが溢れるのは普通のことなのでしょうか?
otn

2020/01/03 12:50

ちょっとそれだけだとわかりません。細かい状況を書いて別途質問してはどうでしょうか。
annaPanda

2020/01/03 13:04

わかりました。本当にありがとうございました!
annaPanda

2020/01/03 13:06

あれ、質問への追記・修正依頼だとベストアンサーつけられない(汗)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問