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

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

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

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

解決済

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

Komama
Komama

総合スコア0

Ruby

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

1回答

0評価

0クリップ

66閲覧

投稿2019/04/19 07:29

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

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

Ruby

require 'csv' require 'kconv' require 'open-uri' require 'nokogiri' require 'selenium-webdriver' require 'byebug' require 'date' def exec(driver) @base_window = driver.window_handle #検索結果のテキスト要素を配列で取得 elements = driver.find_elements(:xpath, '//a[contains(text(), "テキスト")]') @result_text = [] #1ページのテキスト内容を取得 elements.each do |e| e.click; sleep 2 @wait.until {driver.find_element(:id, 'scrollUp')} #ページ切替 window = driver.window_handles.last driver.switch_to.window(window) iframe = driver.find_element(:id, 'contentF') driver.switch_to.frame(iframe) get_text = e.find_element(:xpath, '/html/body') @result_text << get_text.text #元のページに戻る driver.switch_to.window(@base_window) end headers = ["テキスト"] CSV.open("kanpo_result.csv", "a", write_headers: true) do |csv| csv << headers @result_text.each do |idx| csv << [idx] end end end driver = Selenium::WebDriver.for :chrome @wait = Selenium::WebDriver::Wait.new(timeout: 10) driver.navigate.to "hogehoge";sleep 2 # ログイン情報入力後、ログインボタン押下 driver.find_element(:id, 'userId_input').send_keys('hoge');sleep 1 driver.find_element(:id, 'password_input').send_keys('hoge');sleep 1 driver.find_element(:xpath, '//p[@class="loginBtn"]/input').click;sleep 2 # 詳細検索ボタン押下 driver.find_element(:xpath, '//*[@id="pageTop"]/div/main/article/div[1]/section[2]/div/ul/li[2]/a/img').click;sleep 2 # 日付選択 # システム日付を取得 y = Date.today.strftime("%Y") # 年、月、日に変数の値を入れる(年、月、日のテキストを空にして変数を入れる) driver.find_element(:xpath, '//*[@id="pageTop"]/div/main/article/form/section[1]/div/ul[1]/li[2]/label/input[2]').clear; driver.find_element(:xpath, '//*[@id="pageTop"]/div/main/article/form/section[1]/div/ul[1]/li[2]/label/input[2]').send_keys(y);sleep 1 d = Date.today.strftime("%d") driver.find_element(:xpath, '//*[@id="pageTop"]/div/main/article/form/section[1]/div/ul[1]/li[4]/label/input[2]').clear driver.find_element(:xpath, '//*[@id="pageTop"]/div/main/article/form/section[1]/div/ul[1]/li[4]/label/input[2]').send_keys(d);sleep 1 # 掲載項目の指定 driver.find_element(:id, 'checkItem').click;sleep 2 driver.find_element(:id, 'checkCogp').click;sleep 2 # 検索するボタン押下 driver.find_element(:xpath, '//div[@class="btnBox"]/input').click;sleep 2 #画面下までスクロール driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") #ページ数を取得 pages = driver.find_element(:xpath, '//*[@id="pageTop"]/div/main/article/section/form/div[4]/div/ul/li[7]/a').text byebug (2..pages.to_i).to_a.each do |idx| exec(driver) #ページ数の遷移 driver.find_elements(:xpath, '//a[contains(text(), "#{idx}")]').click;sleep 2 end driver.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)

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Ruby

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