代码之家  ›  专栏  ›  技术社区  ›  WontonJon

如何移动到浏览器窗口中不可见的geb页面内容?

  •  2
  • WontonJon  · 技术社区  · 8 年前

    如何让gebwebdriver移动到页面上可能不在浏览器视图中的元素。该元素存在于页面上并显示,但可能会出现在页面底部,浏览器需要向下滚动才能查看该元素。

    import geb.Page
    class myPage extends Page {
      static url = "mypage.xhtml"
      static at = {title == "myPage"}
      static content = {
        someElement = {$("#bottomOfPage")}
        anotherElement = {$(".someClass",5)}
      }
    
      void clickElement(){
        //possibility to fail because element may not be displayed in browsers view
        //if not in view, scroll to element, then click
        someElement.click()
      }
    }
    

    以这个页面为例,如果一个元素在页面上不在视图中,可能在最底部,我如何告诉webdriver将该元素带入视图?我有一些复杂的测试,当页面内容不在视图中时会失败。在某些情况下,驱动程序将移动到元素,即使它不在视图中。但我想明确地告诉驱动程序,如果某个元素不在视图中,那么它就不能自己移动。

    selenium库确实有一个moveToElement()函数,但它只接受WebElement类的对象。使用geb,当创建页面类时,我的测试中使用的所有元素都在内容部分中声明,因此属于SimplePageContent类。SimplePageContent也不能强制转换为WebElement。 moveToElement(By.id("bottomOfPage")) 确实有效,但并不理想,因为我不想要硬编码的值。如果可能的话,我更愿意传递页面内容对象本身。

    1 回复  |  直到 8 年前
        1
  •  3
  •   erdi    8 年前

    根据我的经验,我可以说,如果你让WebDriver点击当前不在视图中的元素,它将首先滚动到该元素,然后点击它。因此,如果没有发生错误,或者元素不在视图中,这不是导致元素不被单击的原因。

    如果仍要使用显式移动到元素 Actions.moveToElement() 然后,您可以使用它们实现的事实轻松地转换从内容定义返回的对象 Navigator 它带有一个 firstElement() 如果你想得到第一个 WebElement 多元素的 导航器 singleElement() 当你的 导航器 正好有一个 Web元素 .

    还有一种更简单的方法,不需要提取 Web元素 来自您的 导航器 s-使用 interact {} 块:

    interact {
        moveToElement(someElement)
    }