【发布时间】:2019-05-14 15:25:12
【问题描述】:
我想从当前页面获取所有子元素,因为我正在使用下面的代码
${childElements} = Get Child WebElement xpath=//*
上面的代码抛出一个错误 No keyword with name 'Get Child WebElement'
还有其他库可以让这个工作吗?
【问题讨论】:
我想从当前页面获取所有子元素,因为我正在使用下面的代码
${childElements} = Get Child WebElement xpath=//*
上面的代码抛出一个错误 No keyword with name 'Get Child WebElement'
还有其他库可以让这个工作吗?
【问题讨论】:
您已经发现这些关键字尚未出现在已发布的 SeleniumLibrary 版本中。
如果您正在处理一个元素或者只是有一个字符串定位器,那么您可以使用自定义 SeleniumLibrary 扩展中@yash 的答案中提到的 SelenniumLibrary Pull Request #702 中建议的代码。
在下面的示例中,有两个自定义 Robot Framework 关键字可以使用 #702 中提到的方法为您提供关键字:
在下面的示例中,它显示您可以使用常规定位器 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 |
<table..> 的直接子代,因此这些关键字不会返回。如果您想返回包含这些记录的列表,请使用 Get Webelements //table[@id='SomeId']//tr/td|//tr/th
有PR #702 提出同样的问题。围绕这一点正在进行一些讨论。 因为目前还没有任何 ETA/结论。同时你可以通过你的标识符控制一切。
如果你想要子元素,你的标识符将是:- In case of css:- <<parent identifier > child >>In case of xpath:- <<parent identifier/child>>
使用这种方法的限制是您不能将 2 种不同的选择器类型作为父/子。
【讨论】: