这似乎解决方案似乎很老套,可能没有考虑一些边缘情况。但是,我会分享它,因为还没有其他答案。
假设您使用的是 watir-webdriver,您可以添加以下猴子补丁。这将在您需要页面对象后添加。
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
基本上,此补丁的目的when_present
是始终调用 Watir 方法。例如,您的页面对象调用将被转换为 Watir 为browser.link.when_present.click
. 理论上,应该为页面对象元素上调用的任何方法调用它。
不幸的是,有一个问题。在某些情况下,您可能不想等待元素出现。例如,在执行 时page.link_element.when_not_visible
,您不希望在检查元素是否出现之前等待元素出现。:wait => false
在这些情况下,您可以通过包含在元素定位器中来强制不等待的标准行为:
page.link_element(:wait => false).when_not_visible