0

我正在尝试对包含部分和子部分的页面进行建模,并且在范围界定方面遇到了麻烦。

我正在定义的部分可以在 DOM 中的层次结构中找到,如下所示:

html > body > div.page-background > div#wrapper > div#content > div#primary > ... > div#reserve-search

因此,我使用 CSS 选择器div#reserve-search定义了页面上的部分。但是,单击本节中的按钮会弹出一个需要与之交互的弹出面板。尽管弹出窗口在逻辑上是该部分的一部分,但它位于 DOM 的不同部分:

html > 正文 > div#overlay-address

这让我陷入了困境。当前代码看起来有点像这样:

class ReserveSearchPage < SitePrism::Page
    section :reserve_search_section, ReserveSearchSection, "div#reserve-search"
end

class ReserveSearchSection < SitePrism::Section
    section :overlay_address_section, OverlayAddressSection, "div#overlay-address"
    element :address_section_button, "a#button"

    def interactWithAddressSection
        address_section_button.click
        wait_until_overlay_address_section_visible
        ...
    end
end

class OverlayAddressSection < SitePrism::Section
    elements :things, "blah#stuff"
    ...
end

上面的问题是,当我尝试调用时interactWithAddressSectionOverlayAddressSection由 的范围定义,因此它实际上在div#reserve-search div#overlay-addressReserveSearchSection下的 DOM 中查找子部分。由于子部分不在那里,调用超时并且找不到子部分。

我想在更大的部分中定义这个子部分,这绝对是它在逻辑上属于的地方和需要访问的地方。有没有办法在不使用父节范围的情况下定义子节的定位器?

显然,子部分存在于 DOM 中的父级中更方便和“正确”,但我见过很多这样定义的弹出窗口和面板,从技术上讲,它们位于页面的一个非常不同的部分,即使该结构绝对应该建模为 DOM 不同部分的子部分。似乎应该有一种方法让我摆脱父部分的范围,也许是通过使用某种绝对选择器定义子部分。这样的方法存在吗?如果没有,还有其他解决方法吗?

4

1 回答 1

0

我在不小心创建了一个新帐户后发布了这个。我相信我已经回答了我自己的问题。像我的大多数问题一样,我想出的答案很简单。

假设没有神奇的解决方案,我只是制作了OverlayAddressSectionaSitePrism::Page而不是 a SitePrism::Section。我可以在一个部分中创建和调用此页面,而不需要任何页面的元素或部分继承总体部分的范围。

对于希望不常见的问题,这似乎是一个足够好的解决方案。

于 2014-01-06T21:47:26.197 回答