Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium 如何移动到浏览器窗口中不可见的geb页面内容?_Selenium_Automation_Geb - Fatal编程技术网

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

Selenium 如何移动到浏览器窗口中不可见的geb页面内容?,selenium,automation,geb,Selenium,Automation,Geb,如何让geb webdriver移动到页面上可能不在浏览器视图中的元素。该元素存在于页面上并显示,但该元素可能会出现在页面底部,浏览器需要向下滚动才能查看该元素 import geb.Page class myPage extends Page { static url = "mypage.xhtml" static at = {title == "myPage"} static content = { someElement = {$("#bottomOfPage")}

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

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(“页面底部”))
确实有效,但并不理想,因为我不需要硬编码的值。如果可能的话,我宁愿传递页面内容对象本身

根据我的经验,我可以说,如果您要求WebDriver单击当前不在视图中的元素,它将首先滚动到该元素,然后单击该元素。因此,如果没有发生,您可能遇到了某种错误,或者元素不在视图中这一事实并不是导致您的元素未被单击的原因

如果仍要使用
Actions.moveToElement()显式移动到元素
然后,您可以轻松地使用从内容定义返回的对象实现
Navigator
,如果您想要获取多元素
Navigator
的第一个
WebElement
,或者当您的
Navigator
正好有一个时,您应该使用它
WebElement

还有一种更简单的方法,它不需要从
Navigator
s中提取
WebElement
s-使用块:


我认为您必须在页面对象类中添加方法moveToElement。该方法将使用JavaScriptExecutor执行JS以向下滚动到对象的位置。看看如何在hmm上下滚动我刚刚做了一个快速测试,尝试点击一个看不见的元素,你是对的。它将滚动到元素并单击。我应该在我的问题中举一个例子,关于在文本字段中输入值。我回顾了我的代码,当a文本框不在视图中时,它不会输入值,因此测试失败。我曾考虑过使用interact{},但我总是得到“无法解析符号‘moveToElement’”。是否有需要导入的内容?同样,文本框不在视图中这一事实不应阻止文本被输入其中。文本框有什么特别之处吗?您确定该值未放入文本框中吗?写下你关于互动的问题-你得到的完整跟踪是什么?你是怎么用的?在测试、页面或模块中,我没有得到堆栈跟踪错误。这些元素只是作为文本框的输入字段。我的测验填了一张表格。浏览器窗口中可见的文本框确实会接收值,但不在浏览器视图中的文本框不会被填充。即使在使用断点时,也表明它们确实填充了。他们好像被跳过了。最后,我使用Actions.moveToElement()方法创建了一个helper函数,以显式地移动到顽固的文本框,这确实有效。这真的很奇怪,哈哈。现在这是一个合理的解决方案。
interact {
    moveToElement(someElement)
}