1

title次の構文を使用して、属性に基づいてリンクのコレクションを形成しています

in_frame(name: 'example frame') do |frame|
  links(:example_link, {title: 'This is an example title', frame: frame})
end

スニペット - 1

次に、各リンク (コレクションには 2 つある) をクリックして、ポップアップするウィンドウから情報を取得しようとします。

self.example_link_elements.each do |one_link|
  one_link.click
  @browser.window(index: 1).use do
    # do something here
    @browser.window.close
  end
end

スニペット - 2

これは最初のリンクでは問題なく実行されますが、ステートメントElement is no longer valid (Selenium::WebDriver::Error::StaleElementReferenceError)での 2 回目の反復ではエラーがスローされます!! one_link.clickその時はこうしてみました

2.times do |i|
  self.example_link_elements[i].click
    @browser.window(index: 1).use do
      # do something here
      @browser.window.close
    end
  end
end

上記のスニペットは正常に動作します!! 最初のスニペットがそのエラーをスローする理由がわかりません!! 最初のスニペットが機能している理由を明らかにできる体はありますか?!

アップデート

私がそれを理解していることを確認するために、次のテストページをコーディングしました

<html>
<body>
    <a target="_blank" href="http://www.google.com">click here</a>
    <a target="_blank" href="http://www.google.com">click here</a>  
</body>
</html>

その上で次のルビーコードを実行しました

require 'watir-webdriver'
require 'page-object'

class MyPageObject
  include PageObject

  def initialize(browser, visit)
    @browser = browser
    super browser, visit
  end

  def goto
    @browser.goto "file:///C:/Users/raveej1/Desktop/test.html"
  end
end

browser = Watir::Browser.new :firefox
page = MyPageObject.new browser, true
page.class.send(:links, :search_link, text: "click here")
page.search_link_elements.each_with_index do |p, p_index|
  p.click
  browser.window(index: 1).use do
    page.class.send(:link, :singin_link, text: "Sign in")
    page.singin_link
    browser.window.close
  end
end

出来た!!スニペット 1 とまったく同じ方法だと思います。2 つのページの動作が異なるのはなぜですか?!!

4

1 に答える 1