【问题标题】:Scrolling to element using webdriver?使用 webdriver 滚动到元素?
【发布时间】:2017-06-04 07:18:05
【问题描述】:

我仍在学习并回答我的一个问题:here,有人告诉我这可能是由于相关元素不在视图中。

我查看了文档,所以,这是最相关的答案:here

您可以使用“org.openqa.selenium.interactions.Actions”类移动到一个元素:

WebElement element = driver.findElement(By.id("my-id"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
## actions.click();
actions.perform();

当我尝试使用上面的滚动到元素时: 它说 WebElement 未定义。

我认为这是因为我没有导入相关模块。有人能指出我应该导入什么吗?

编辑: 正如alecxe所指出的,这是java代码。

但与此同时,在尝试了一段时间之后。我找到了WebElement的导入方法:

from selenium.webdriver.remote.webelement import WebElement

可能会帮助像我这样的人。

它的方法也是一个很好的教训,IMO:

前往:Documentation

class selenium.webdriver.remote.webelement.WebElement(parent, id_, w3c=False)

需要分离成上面提到的命令形式。

【问题讨论】:

    标签: python python-3.x selenium selenium-webdriver


    【解决方案1】:

    您正在尝试使用 Python 运行 Java 代码。在 Python/Selenium 中,org.openqa.selenium.interactions.Actions 反映在 ActionChains class 中:

    from selenium.webdriver.common.action_chains import ActionChains
    
    element = driver.find_element_by_id("my-id")
    
    actions = ActionChains(driver)
    actions.move_to_element(element).perform()
    

    或者,您也可以通过scrollIntoView()“滚动查看”:

    driver.execute_script("arguments[0].scrollIntoView();", element)
    

    如果您对差异感兴趣:

    【讨论】:

    • 啊...我花了 3 个小时尝试我在 SO 和文档中找到的所有方法。我尝试了第一个解决方案,但一定是以某种方式搞砸了。我将阅读 ScrollIntoView Vs moveToElement。只是一个简单的问题,我需要完成 100 次相同的步骤,我正在考虑使用 for 循环。这是一个好方法吗?
    • @Sid 很难说。在某些情况下,您可以将操作链接在一个循环中,然后在循环后执行一次,但这完全取决于用例。如果需要帮助,看看是否有必要为此创建一个单独的 SO 主题。谢谢。
    • move_to_element(ele).perform() 是否会简单地滚动到某个元素,即使该元素当前不在视图中?
    • @alecxe 我不明白它是如何工作的(它不适用于我的项目),因为如果对象不可见,selenium 如何找到要滚动到的对象?我的无法找到我希望它滚动到的元素。
    • 当我按照你的建议调用 move_to 时,我得到了 selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: (164, 1297) is out of the bound of viewport width (1366) 和 height (694)。我很感谢您的回答,我认为这就是方式(而且我也从您的回答中了解了 ActionChains),但看起来它需要一些改进。谢谢1
    【解决方案2】:

    这不是问题的直接答案(不是关于Actions),但它也允许您轻松滚动到所需的元素:

    element = driver.find_element_by_id('some_id')
    element.location_once_scrolled_into_view
    

    这实际上是为了返回页面元素的坐标(xy),但也向下滚动到目标元素

    【讨论】:

    • 谢谢@Andersson,我试图找到解决方法,因为您指出这可能是另一个问题的问题。 :)
    • 起初我在后面附加了(),并且错误''dict' object is not callable',我检查了元素类型是WebElement。然后我删除了() 并开始工作。这不是一种方法吗?我的意思是,为什么不需要()
    • @LeiYang,因为 location_once_scrolled_into_view 是 Python property。属性不带参数(对象实例 -self 除外)并且应该在不带括号的情况下调用
    • @Andersson .move_to_element() 对我不起作用(我评论了 alecxe 的答案),但您的解决方案确实有效。谢谢!
    • @LeiYang 这里是关于location_once_scrolled_into_view的源代码,帮助解释为什么不需要()selenium/webelement.py at d3b6ad006bd7dbee59f8539d81cee4f06bd81d64 · SeleniumHQ/selenium
    【解决方案3】:

    除了move_to_element()scrollIntoView() 之外,我还想编写以下代码,尝试将视图中的元素居中

    desired_y = (element.size['height'] / 2) + element.location['y']
    window_h = driver.execute_script('return window.innerHeight')
    window_y = driver.execute_script('return window.pageYOffset')
    current_y = (window_h / 2) + window_y
    scroll_y_by = desired_y - current_y
    
    driver.execute_script("window.scrollBy(0, arguments[0]);", scroll_y_by)
    

    【讨论】:

    • 感谢您的解决方案,尝试了其他方法,但元素不可点击。有些时候滚动不够,元素在底部的“聊天框”下,其他代码太多的滚动元素在下面的顶部。菜单
    【解决方案4】:

    例子:

    driver.execute_script("arguments[0].scrollIntoView();", driver.find_element_by_css_selector(.your_css_selector))
    

    对于任何类型的选择器,这个总是适用于我。 还有 Actions 类,但是对于这种情况,它不是那么可靠。

    【讨论】:

      【解决方案5】:

      如果元素具有"id" 属性,还有另一个选项可以将页面滚动到所需元素

      如果您想导航到页面并向下滚动到带有@id 的元素,可以通过将#element_id 添加到URL 来自动完成...

      例子

      假设我们需要导航到 Selenium Waits 文档并将页面向下滚动到“隐式等待”部分。我们可以的

      driver.get('https://selenium-python.readthedocs.io/waits.html')
      

      并添加滚动代码...或使用

      driver.get('https://selenium-python.readthedocs.io/waits.html#implicit-waits')
      

      导航到页面并自动滚动页面到带有id="implicit-waits"<div class="section" id="implicit-waits">...</div>)的元素

      【讨论】:

        【解决方案6】:

        您可以通过execute_javascript 方法使用javascript 滚动到元素。 例如,这是我在 Robot Framework 上使用 SeleniumLibrary 的方法:

        web_element = self.selib.find_element(locator)
        self.selib.execute_javascript(
            "ARGUMENTS",
            web_element,
            "JAVASCRIPT",
            'arguments[0].scrollIntoView({behavior: "instant", block: "start", inline: "start"});'
        )
        

        【讨论】:

          【解决方案7】:

          这可以使用 driver.execute_script() 来完成:-

          driver.execute_script("document.getElementById('myelementid').scrollIntoView();")
          

          【讨论】:

            猜你喜欢
            • 2015-04-12
            • 1970-01-01
            • 1970-01-01
            • 2017-01-03
            • 1970-01-01
            • 1970-01-01
            • 2017-12-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多