1

我正在使用cucumber和的组合pageobject的组合来测试我的 Web 应用程序。有时,脚本甚至在包含该元素的页面开始加载之前就尝试单击该元素。(我通过捕获失败场景的屏幕截图确认了这一点)

这种不一致并不普遍,它只会在少数几个元素上反复发生。如果我这样做,而不是直接访问这些元素example_element.when_visible.click如果我这样做,测试套件总是通过,

截至目前,我使用link_name(由 pageobject 模块在调用时生成)单击链接link(:name, identifier: {index: 0}, &block)

我不想编辑上面提到的代码段,而是表现得好像我调用了link_name_element.when_visible.click. 原因是,测试套件非常大,更改所有出现的情况会很乏味,而且我也相信该功能已经存在,不知何故我在任何地方都看不到它。谁能帮帮我?!

4

1 回答 1

2

这似乎解决方案似乎很老套,可能没有考虑一些边缘情况。但是,我会分享它,因为还没有其他答案。

假设您使用的是 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
于 2013-12-03T05:15:01.487 回答