Selenium webdriver 我如何处理技术上不属于节的元素和子节';什么范围?

Selenium webdriver 我如何处理技术上不属于节的元素和子节';什么范围?,selenium-webdriver,site-prism,Selenium Webdriver,Site Prism,我试图对一个包含节和子节的页面进行建模,但在范围界定方面遇到了麻烦 我定义的部分可以在DOM中的层次结构中找到,如下所示: html>body>div.page-background>div#wrapper>div#content>div#primary>…>div#reserve search 因此,我使用CSS选择器div#reserve search定义了页面上的部分。但是,单击此部分中的按钮会弹出一个需要与之交互的面板。尽管弹出窗口在逻辑上是部分的一部分,但它位于DOM的不同部分: ht

我试图对一个包含节和子节的页面进行建模,但在范围界定方面遇到了麻烦

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

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

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

html>body>div#覆盖地址

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

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
class ReserveSearchPage
上面的问题是,当我试图调用
interactivewithaddresssection
时,
OverlayAddressSection
是由
ReserveSearchSection
的作用域定义的,因此它实际上在DOM中的div#reserve search div#overlay address下查找子节。因为子分区不在那里,所以调用超时,找不到子分区

我想在更大的部分中定义这个子部分,这肯定是它在逻辑上所属的位置以及需要访问的位置。是否有任何方法可以在不使用父节范围的情况下定义子节的定位器


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

我在无意中创建了一个新帐户后发布了此消息。我相信我已经回答了我自己的问题。和我的大多数问题一样,我的答案很简单

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

这似乎是一个很好的解决方案,希望很少出现的问题