Это решение кажется довольно хакерским и может не учитывать некоторые крайние случаи. Тем не менее, я поделюсь им, так как других ответов пока нет.
Вы можете добавить следующий патч для обезьян, предполагая, что вы используете 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
По сути, целью этого патча является то, что метод Watir when_present
вызывается всегда. Например, вызов объекта вашей страницы будет переведен в Watir как browser.link.when_present.click
. Теоретически он должен вызываться для любого метода, вызываемого в элементе объекта страницы.
К сожалению, есть подвох. Есть некоторые ситуации, когда вы, вероятно, не хотите ждать появления элемента. Например, при выполнении page.link_element.when_not_visible
вы не хотели бы ждать появления элемента, прежде чем проверять, что он не появляется. В этих случаях вы можете заставить стандартное поведение не ждать, включив :wait => false
в локатор элемента:
page.link_element(:wait => false).when_not_visible
person
Justin Ko
schedule
03.12.2013
when_present
перед каждой командой или только при щелчке по элементам? - person Justin Ko   schedule 28.11.2013Page
, включающий модульPageObject
, а также содержащийBrowser instance
для инициализацииpageobject
. Каждая страница, представляющая класс, наследуется от вышеупомянутого класса.class Menu < Page link(:buy, {link_text: 'buy from the source'}) end
Ссылка,buy
, является одним из мест, где скрипт часто ломается, когда я пытаюсь щелкнуть!! Он терпит неудачу примерно в 3 из 10 раз, и это один из самых первых шагов во всех файлах! - person x-treme   schedule 02.12.2013