【问题标题】:No keyword with name 'Get Child WebElement' found In Robot在机器人中找不到名为“Get Child WebElement”的关键字
【发布时间】:2019-05-14 15:25:12
【问题描述】:

我想从当前页面获取所有子元素,因为我正在使用下面的代码

${childElements} =  Get Child WebElement    xpath=//*

上面的代码抛出一个错误 No keyword with name 'Get Child WebElement'

还有其他库可以让这个工作吗?

【问题讨论】:

    标签: python-2.7 robotframework


    【解决方案1】:

    您已经发现这些关键字尚未出现在已发布的 SeleniumLibrary 版本中。

    如果您正在处理一个元素或者只是有一个字符串定位器,那么您可以使用自定义 SeleniumLibrary 扩展中@yash 的答案中提到的 SelenniumLibrary Pull Request #702 中建议的代码。

    在下面的示例中,有两个自定义 Robot Framework 关键字可以使用 #702 中提到的方法为您提供关键字:

    1. 获取子 Web 元素
    2. 获取父 Web 元素

    在下面的示例中,它显示您可以使用常规定位器 id=main 或 WebElement ${children[0]} 来查找父级和子级。这是由WebElement python 对象的python 方法find_element(s) 处理的。

    注意:出于安全原因和可读性,将关键字从 Evaluate 更改为 Call Method

    example.robot

    *** Settings ***
    Library    SeleniumLibrary      
    
    Suite Teardown    Close All Browsers
    
    *** Test Cases ***
    Get Children Then Parent
        Open Browser    http://www.google.com    headlesschrome
    
        ${children}  Get Child Webelements   id=main
        ${parent}    Get Parent Webelement   ${children[0]}
    
        ${id}        Get Element Attribute   ${parent}    id
        Should Be Equal    ${id}    main
    
    *** Keywords ***
    Get Child Webelements
        [Arguments]    ${locator}
    
        ${element}    Get WebElement    ${locator}    
        ${children}     Call Method       
        ...                ${element}    
        ...                find_elements   
        ...                  by=xpath    value=child::*    
    
        [Return]      ${children}
    
    Get Parent Webelement
        [Arguments]    ${locator}
    
        ${element}    Get WebElement    ${locator}      
        ${parent}     Call Method       
        ...                ${element}    
        ...                find_element    
        ...                  by=xpath    value=parent::*
    
        [Return]    ${parent}  
    

    【讨论】:

    • 感谢您的回复。这部分符合我的预期。我想遍历子元素的结尾。例如
      Head 1 Head 2 Head 3
      第 1 行文本 1 第 2 行文本 第 3 行文本
      第 2 行文本 1 Text 2 Text 3
      我想要0=>
      Head 1 1=> Head 2 n=> Text 3 有没有办法做到这一点?
    • 那些不是父 <table..> 的直接子代,因此这些关键字不会返回。如果您想返回包含这些记录的列表,请使用 Get Webelements //table[@id='SomeId']//tr/td|//tr/th
    • 我想从 div 中获取所有孩子。例如
      Div Span 1
      Div Span 2内跨度 11 Div Span 3内跨度 21 Inner span 22
      列表是这样的 0 => Div span 1, 1 => Div span 2, 2 => Div span 11, 3 => 分区跨度 3、4 => 分区跨度 21、5 => 分区跨度 22,
    • 这个例子/问题与前面的例子不一致,我考虑一个单独的问题。此外,这些例子确实应该成为问题的一部分。你可以edit一个问题来补充这些细节。否则,关键信息会分散在不属于它们的 cmets 中。
    • 谢谢我现在发布新问题。
    【解决方案2】:

    PR #702 提出同样的问题。围绕这一点正在进行一些讨论。 因为目前还没有任何 ETA/结论。同时你可以通过你的标识符控制一切。

    如果你想要子元素,你的标识符将是:-
    In case of css:- <<parent identifier > child >>
    In case of xpath:- <<parent identifier/child>>

    使用这种方法的限制是您不能将 2 种不同的选择器类型作为父/子。

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 2019-12-21
      • 2019-06-20
      • 1970-01-01
      • 2015-03-06
      • 2018-08-01
      • 2019-01-01
      • 2017-09-18
      相关资源
      最近更新 更多