これは解決策のようで、非常にハッキリしているようで、いくつかのエッジケースを考慮していない可能性があります。ただし、他にまだ回答がないため、共有します。
watir-webdriver を使用していると仮定して、次のモンキー パッチを追加できます。これは、page-object を要求した後に追加されます。
require 'watir-webdriver'
require 'page-object'
module PageObject
module Platforms
module WatirWebDriver
class PageObject
def find_watir_element(the_call, type, identifier, tag_name=nil)
identifier, frame_identifiers, wait = parse_identifiers(identifier, type, tag_name)
the_call, identifier = move_element_to_css_selector(the_call, identifier)
if wait
element = @browser.instance_eval "#{nested_frames(frame_identifiers)}#{the_call}.when_present"
else
element = @browser.instance_eval "#{nested_frames(frame_identifiers)}#{the_call}"
end
switch_to_default_content(frame_identifiers)
type.new(element, :platform => :watir_webdriver)
end
def process_watir_call(the_call, type, identifier, value=nil, tag_name=nil)
identifier, frame_identifiers, wait = parse_identifiers(identifier, type, tag_name)
the_call, identifier = move_element_to_css_selector(the_call, identifier)
if wait
modified_call = the_call.dup.insert(the_call.rindex('.'), '.when_present')
value = @browser.instance_eval "#{nested_frames(frame_identifiers)}#{modified_call}"
else
value = @browser.instance_eval "#{nested_frames(frame_identifiers)}#{the_call}"
end
switch_to_default_content(frame_identifiers)
value
end
def parse_identifiers(identifier, element, tag_name=nil)
wait = identifier.has_key?(:wait) ? false : true
identifier.delete(:wait)
frame_identifiers = identifier.delete(:frame)
identifier = add_tagname_if_needed identifier, tag_name if tag_name
identifier = element.watir_identifier_for identifier
return identifier, frame_identifiers, wait
end
end
end
end
end
基本的に、このパッチの意図は、Watirwhen_present
メソッドが常に呼び出されることです。たとえば、ページ オブジェクトの呼び出しは として Watir に変換されbrowser.link.when_present.click
ます。理論的には、ページ オブジェクト要素で呼び出されるすべてのメソッドに対して呼び出される必要があります。
残念ながら、落とし穴があります。要素が存在するのを待ちたくない場合があります。たとえば、 をpage.link_element.when_not_visible
実行する場合、要素が表示されないことを確認する前に、要素が表示されるのを待ちたくありません。このような場合、:wait => false
要素ロケーターに含めることで、待機しないという標準的な動作を強制できます。
page.link_element(:wait => false).when_not_visible