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

时间:2017-05-12 12:55:58

标签: python selenium xpath automated-tests robotframework

我需要将所有匹配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动态生成。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果应用程序确实需要在浏览器的视口中显示一个元素来填充它的文本值,那么有一个“技巧”可以让我这样做 - 使用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 - 这与内置{{1}相同}) - )所以我们可以更好地理解这个问题。我的2ç。 ;)