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

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

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

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

Q&A

解決済

1回答

1202閲覧

Ruby selenium Error : element is not attached to the page documentが解決できない

Komama

総合スコア28

Ruby

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

0グッド

0クリップ

投稿2019/04/19 07:29

■分からないこと
seleniumで特定サイトにログインしてテキスト情報を取得しようとしています。
プロセスは
①ログイン
②一覧ページから「テキスト」というボタンをクリック
③ウィンドウタブ遷移
④テキスト情報取得
⑤CSVに格納
⑥元の一覧ページに戻る
⑦ページ遷移(2ページ目に移行)
以下、繰り返し全ページのテキストを取得しCSVを作る。

■試したこと
find_elementで一つの要素で動かした場合はCSVを作ることができました。
ただ、複数の要素になるとタイトルのエラーが発生してしまいます。
原因をどなたか教えていただけると助かります。
よろしくお願いします。

Ruby

1require 'csv' 2require 'kconv' 3require 'open-uri' 4require 'nokogiri' 5require 'selenium-webdriver' 6require 'byebug' 7require 'date' 8 9def exec(driver) 10 @base_window = driver.window_handle 11 #検索結果のテキスト要素を配列で取得 12 elements = driver.find_elements(:xpath, '//a[contains(text(), "テキスト")]') 13 14 @result_text = [] 15 #1ページのテキスト内容を取得 16 elements.each do |e| 17 e.click; sleep 2 18 @wait.until {driver.find_element(:id, 'scrollUp')} 19 #ページ切替 20 window = driver.window_handles.last 21 driver.switch_to.window(window) 22 iframe = driver.find_element(:id, 'contentF') 23 driver.switch_to.frame(iframe) 24 get_text = e.find_element(:xpath, '/html/body') 25 @result_text << get_text.text 26 #元のページに戻る 27 driver.switch_to.window(@base_window) 28 end 29 30 headers = ["テキスト"] 31 CSV.open("kanpo_result.csv", "a", write_headers: true) do |csv| 32 csv << headers 33 @result_text.each do |idx| 34 csv << [idx] 35 end 36 end 37end 38 39driver = Selenium::WebDriver.for :chrome 40@wait = Selenium::WebDriver::Wait.new(timeout: 10) 41driver.navigate.to "hogehoge";sleep 2 42# ログイン情報入力後、ログインボタン押下 43driver.find_element(:id, 'userId_input').send_keys('hoge');sleep 1 44driver.find_element(:id, 'password_input').send_keys('hoge');sleep 1 45driver.find_element(:xpath, '//p[@class="loginBtn"]/input').click;sleep 2 46# 詳細検索ボタン押下 47driver.find_element(:xpath, '//*[@id="pageTop"]/div/main/article/div[1]/section[2]/div/ul/li[2]/a/img').click;sleep 2 48# 日付選択 49# システム日付を取得 50y = Date.today.strftime("%Y") 51# 年、月、日に変数の値を入れる(年、月、日のテキストを空にして変数を入れる) 52driver.find_element(:xpath, '//*[@id="pageTop"]/div/main/article/form/section[1]/div/ul[1]/li[2]/label/input[2]').clear; 53driver.find_element(:xpath, '//*[@id="pageTop"]/div/main/article/form/section[1]/div/ul[1]/li[2]/label/input[2]').send_keys(y);sleep 1 54d = Date.today.strftime("%d") 55driver.find_element(:xpath, '//*[@id="pageTop"]/div/main/article/form/section[1]/div/ul[1]/li[4]/label/input[2]').clear 56driver.find_element(:xpath, '//*[@id="pageTop"]/div/main/article/form/section[1]/div/ul[1]/li[4]/label/input[2]').send_keys(d);sleep 1 57 58# 掲載項目の指定 59driver.find_element(:id, 'checkItem').click;sleep 2 60driver.find_element(:id, 'checkCogp').click;sleep 2 61# 検索するボタン押下 62driver.find_element(:xpath, '//div[@class="btnBox"]/input').click;sleep 2 63#画面下までスクロール 64driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 65#ページ数を取得 66pages = driver.find_element(:xpath, '//*[@id="pageTop"]/div/main/article/section/form/div[4]/div/ul/li[7]/a').text 67byebug 68(2..pages.to_i).to_a.each do |idx| 69 exec(driver) 70 #ページ数の遷移 71 driver.find_elements(:xpath, '//a[contains(text(), "#{idx}")]').click;sleep 2 72end 73 74driver.quit
15: from selenium_kanpo_aoki.rb:71:in `<main>' 14: from selenium_kanpo_aoki.rb:71:in `each' 13: from selenium_kanpo_aoki.rb:72:in `block in <main>' 12: from selenium_kanpo_aoki.rb:16:in `exec' 11: from selenium_kanpo_aoki.rb:16:in `each' 10: from selenium_kanpo_aoki.rb:24:in `block in exec' 9: from /Users/ryo/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/common/search_context.rb:60:in `find_element' 8: from /Users/ryo/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/oss/bridge.rb:550:in `find_element_by' 7: from /Users/ryo/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/oss/bridge.rb:584:in `execute' 6: from /Users/ryo/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/bridge.rb:166:in `execute' 5: from /Users/ryo/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:62:in `call' 4: from /Users/ryo/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/default.rb:104:in `request' 3: from /Users/ryo/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:84:in `create_response' 2: from /Users/ryo/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:84:in `new' 1: from /Users/ryo/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/response.rb:32:in `initialize' /Users/ryo/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok': stale element reference: element is not attached to the page document (Selenium::WebDriver::Error::StaleElementReferenceError) (Session info: chrome=73.0.3683.103)

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

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

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

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

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

guest

回答1

0

ベストアンサー

投稿2019/04/19 10:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Komama

2019/04/19 12:33

ありがとうございます。until使ってやってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問