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は使用せずに解決したいです。
恐れ入りますが、アドバイス頂けると幸いです。
回答1件
あなたの回答
tips
プレビュー