ローカルでターミナルで動かしています。
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
わかるかたいらっしゃいましたらよろしくお願いいたします。
何番目の要素というXPath指定を多用しているのが気になります。
目的じゃないところをクリックしているとかはないでしょうか?
コメントありがとうございます。
```
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')
```
をコメントアウトするだけで、思った挙動になるので、
別なとこをクリックというわけじゃないと思いますが、、、
それでは、
HTMLと画面イメージをファイルに保存してデバッグですね。
クリックやプルダウン部分を同時にHTML出力もさせて、さらにスクショも撮るってことで間違いないですか?
そうですね。私ならそうします。ファイル名を変えながら、1動作ごとに取ります。
d.save_screenshot("#{file}.png")
IO.write("#{file}.html",d.page_source)
" 1動作ごと"、そうですよね、勉強になります。挑戦してみます。
派生する話で質問があり、もしお時間ありましたら回答お願いします。
上の機能を含んだrailsアプリの作成を考えていて、今実験として、上のコードを、すでにEC2にデプロイしている別のアプリのコントローラのcreateアクションにのせてみて挙動をみています。タイムアウトが原因でエラーになるのですが、数回目から、メモリー不足が原因でMysqlが立ち上がらない状態になってしまいました。AWSの無料枠でやっているのですが、上程度のコードでメモリーが溢れるのは普通のことなのでしょうか?
ちょっとそれだけだとわかりません。細かい状況を書いて別途質問してはどうでしょうか。
わかりました。本当にありがとうございました!
あれ、質問への追記・修正依頼だとベストアンサーつけられない(汗)
あなたの回答
tips
プレビュー