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

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

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

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

selenium

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

Q&A

解決済

1回答

3226閲覧

seleniumのwaitがうまく効かずアドバイス頂けますでしょうか

2019

総合スコア9

Ruby

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

selenium

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

0グッド

1クリップ

投稿2021/05/20 17:21

編集2021/05/23 06:11

rubyでseleniumを使用しており、clickメソッドでページ遷移した後に、
要素の取得ができるまで待機させたいのですが、waitがうまく機能せず、
find_elementメソッドを実行した際に、参照エラーになってしまいます。
※ ループを5回回した際に、1,2回目だけ取れたり取れなかったりしますので、
取得したい要素のpathが誤っていることは無さそうです。

ruby

1・エラーメッセージ 2Selenium::WebDriver::Error::StaleElementReferenceError (stale element reference: element is not attached to the page document

ruby

1driver = Selenium::WebDriver.for :chrome 2wait = Selenium::WebDriver::Wait.new(timeout: 10) 3driver.manage.timeouts.implicit_wait = 10 4 5〜〜clickメソッド後〜〜 6ページ遷移後に以下のコードを実行。 7 8・パターン1 9wait.until do 10 list = driver.find_elements(:xpath, "//*[@id='itemList']/div[@class='item']) 11 names = list.map |item| 12 item.find_element(:xpath, "//a/span[2]")&.text 13 end 14 names 15end 16 17・パターン2 18i = 1 19while i <= 5 20 wait.until{ driver.find_element(:xpath, "//*[@id='itemList']/div[#{i+1}]/a/span[2]")&.text } 21 i += 1 22end

html

1<div id="itemList"> 2 <div>〜〜〜</div> 3 <div class="item"> 4 <a> 5 <span>商品ID</span> 6 <span>商品名</span> 7 </a> 8 </div> 9 <div class="item"> 10 <a> 11 <span>商品ID</span> 12 <span>商品名</span> 13 </a> 14 </div> 15 ・・・ 16</div>

#####・想定される原因について
・パターン1については、
変数listに一時代入してますが、itemクラスのdiv以下の階層構造を取得する前に代入してしまい、
それをmapしているため、dataに対して、find_elementした際に、エラーになるのでは思われます。

・パターン2については、
取得したい要素までのpathを1行で全て記述しており、それが取得できるまで、waitをするような記述にして
いるので、こちらは機能しそうですが、同様にうまくいきません。。

※ ちなみに、どちらもパターンでも記述の前に、sleep(1)を付け加えれば問題なく取得出来ますが、
根本的な解決になっていないため、sleepは使用せずに解決したいです。

恐れ入りますが、アドバイス頂けると幸いです。

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

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

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

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

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

saoyagi2

2021/05/21 04:41

パターン1、パターン2の両方とも同じエラーが発生しますか?
2019

2021/05/21 04:44

はい、同じエラーになります。
otn

2021/05/22 10:38

引用符の対応が合ってないと言うことは、このコードは実際に実行しているものをコピペした物でないという事ですよね? 実際に実行しているコードはどういうコードでしょうか?
2019

2021/05/23 06:12

確かにずれている箇所がありました。失礼致しました。現状のコードを記載致します。
guest

回答1

0

自己解決

今回、明示的な待機と暗黙的な待機を両方使用しており、下記の資料によると、必要以上に長い予測できない待機時間が発生する可能性があるとの事で、混在させない様に警告されてました。
今回、自分の場合は、設定していた時間より短めにタイムアウトしたため、この原因と一致するのか特定出来ませんでしたが、暗黙的な待機を削除し、解決した様に思われます。

・暗黙的な待機
driver.manage.timeouts.implicit_wait = 10
・明示的な待機
wait = Selenium::WebDriver::Wait.new(timeout: 10)

https://www.selenium.dev/documentation/ja/webdriver/waits/

投稿2021/05/24 13:56

2019

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問