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

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

ただいまの
回答率

90.51%

  • Ruby

    9429questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 116

Komama

score 9

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

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

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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/19 21:33

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

    キャンセル

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

  • Ruby

    9429questions

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