如何使用机器人框架和 python 在不滚动的情况下获取所有匹配的元素?

Posted

技术标签:

【中文标题】如何使用机器人框架和 python 在不滚动的情况下获取所有匹配的元素?【英文标题】:How to get all matching elements without scrolling using robot framework and python? 【发布时间】:2017-10-11 19:26:28 【问题描述】:

我需要获取与 xpath 匹配的所有元素以列出而不需要滚动到所有元素,因为我永远无法知道是否真的需要滚动(取决于显示器分辨率,并且列的宽度也可以由开发人员更改)而且我不知道在哪里滚动,因为我正在检查列的存在,在某些情况下,正确的结果也是该列不存在......

我在测试中使用这些函数来获取列标题列表:

Get all columns of table $table
    $columns_loc=  replace substring placeholder $GRID_HEADERS  $table
    @locators=   Get Webelements    $columns_loc
    $result=       Create List
    :FOR   $locator   in    @locators
    \       $name=    Get Text    $locator
    \       Append To List  $result  $name
    [Return]   $result

Check column $column is visible
   $headers2=  Get all values
   $res=  value is in list   $headers2   $column
   run keyword if    $res==False  fail  wrong columns displayed
...                  else  pass execution

我也试过用这个:

def dict_elements(self, xpath):
    elements = self.get_library_instance()._element_find(xpath, False, True)
    headers_map = 
    if elements is not None:
        for index, element in enumerate(elements):
            headers_map[element.text] = index
        return headers_map
    return None

def list_elements(self, xpath):
    dict = self.dict_elements(xpath)
    return dictionary_keys_to_list(dict)

Get all columns of table $table
    $columns_loc=  replace substring placeholder $GRID_HEADERS  $table
    @cols=  list elements  $columns_loc

但两种变体都返回 9 列 - 这是正确的,确实有 9 列,但最后一个是 EMPTY(仅返回 u'')而不是元素的实际文本(如 u'last column name')。最后一列标题不直接可见,必须水平滚动才能到达... 表格由angular动态生成。

感谢您的建议!

【问题讨论】:

为什么您认为需要滚动才能获取所有元素。如果元素存在于 DOM 中,则无需滚动。只有当您的应用程序在您到达页面末尾并加载新组件时发送新的 AJAX 请求时,您才需要滚动。 我的意思是手动查看列标题 - 通过我的眼睛。该元素似乎从一开始就在DOM中,因为如果我将xpath粘贴到chrome中的开发者控制台中,它可以找到所有列.. 如果它是 Angular 中动态生成的表格,则意味着需要滚动。我没有看到任何选择,只能一直滚动到最后。如果您在滚动时遇到问题,请尝试使用 scrollTop 的“执行 javascript”关键字。 在某些情况下,检测到 Web 元素但获取文本返回 EMPTY,因为它当前在屏幕上不可见。这些也可能是特定于浏览器的。 groups.google.com/forum/#!topic/selenium-users/l91EJBOnUZc 【参考方案1】:

您可以使用Get Matching Xpath Count 有关详细信息,请参阅文档中的Get Matching Xpath Count 关键字。

【讨论】:

【参考方案2】:

如果应用程序确实需要在浏览器的视口中显示一个元素来填充其文本值,那么我有一个“技巧”可以做到这一点 - 使用 Selenium2Library 关键字 Mouse Over

调用它会在浏览器中物理滚动页面,使元素可见;我尝试了其他常用的解决方案——计算元素的绝对/相对位置并调用 js scrollTo() 等,但它们不可靠——处理某些元素,而不是其他元素,不同的浏览器行为等等。 Mouse Over 出人意料地(至少对我来说:)有效。

所以在您的代码示例中:

:FOR   $locator   in    @locators
\       Mouse Over  $locator
\       $name=    Get Text    $locator
\       Append To List  $result  $name

希望这会有所帮助。


顺便说一下,你的问题是非常具体的,一般请包括/链接一些截图,html源,相关关键字的来源(value is in list - 这和内置的Should Contain一样吗?) - 所以我们可以更好地理解这个问题。我的 2 ç。 ;)

【讨论】:

以上是关于如何使用机器人框架和 python 在不滚动的情况下获取所有匹配的元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用“除外”python的情况下退出不和谐机器人

放弃机器学习,Python 如何进行物体检测?

放弃机器学习框架,如何用Python做物体检测?

如何在不将其添加到目录的情况下在多个团队中安装机器人?

如何在不滚动的情况下直接降落在特定位置?

如何在不滚动的情况下触发滚动事件