如何使用DOM层次结构(父元素)访问元素?

时间:2012-08-07 12:09:15

标签: html dom testing selenium automation

我想通过其父节点使用DOM层次结构节点结构访问元素。我试图通过firebug找到DOM层次结构;想要<parent_node1>.<child_node1>.<child_node2>不是 document.getElementByIDgetElementbyname)来访问元素。

我想自动化一个场景,比如我有列标题和相应的值。想要测试每个列标题下的值是否正确...

我正在考虑使用DOM作为自动化这种情况的方法......但是,我怎样才能找到DOM层次结构......?

我通过Firebug中的Inspect Element看到的是,事件列表,元素,并且看起来不像层次结构节点结构......有人可以在这方面提供帮助吗?

2 个答案:

答案 0 :(得分:1)

使用DOM,

document.getElementByIddocument.getElementByTagname 。它们获取DOM中的对象(特别是文档对象,尽管您也可以在元素上调用它们)并返回一个对象,该对象分别是单个元素或零个或多个元素的集合。这是一个DOM操作。从那里你可以对结果进行其他DOM操作,比如让孩子,父母或兄弟姐妹,改变价值观等。

所有DOM操作都归结为:

  1. 采取一个起点。这通常是document,但我们经常做的第一件事是调用document.getElementByIddocument.getElementByTagname,然后从我们真正认为是起点的结果开始工作。
  2. 找到我们感兴趣的一个或多个元素,相对于起点是通过startingPoint.getElementById *还是startingPoing.getElementByTagname或许与某些测试相结合(例如,只处理具有特定{{1}的那些如果他们有特殊类型的孩子等,
  3. 读取和/或更改某些值,添加新的子节点和/或删除节点。
  4. 在与您类似的情况下,起点将是classnamedocument.getElementById(someID)或类似地找到的一个或多个表格。从该表中,document.getElementById(someID).getElementsByTagname('table')[0]将为您提供列标题。根据结构以及您正在使用的内容,您只需从myTable.getElementsByTagname('th')中选择相应的元素,或者遍历每一行,然后使用myTable.getElementsByTagname('td')。 您也可以使用curRow.getElementsByTagname('td')firstChild等等,但通常使用标记名过滤掉您不关心的元素会更方便。

    *由于文档中只能有一个具有给定id的元素,如果在文档层次结构中较高的任何元素上调用,它将返回相同的内容,因此我们通常只在childNodes上调用它。如果我们想要在元素是当前元素的后代时执行某些操作,那么在元素上调用它会很有用,而不是其他。

答案 1 :(得分:1)

如上所述,您可能意味着DOM Element properties,例如element.childNodeselement.firstChild或类似。

看一下DOM Element property reference over at JavaScriptKit,您将对如何访问层次结构有一个很好的了解。

var currentTD = document.getElementsByTagName("td")[0];
var currentTable = document.getElementsByTagName("table")[0];

currentTD.parentNode // contains the TR element the TD resides in.
currentTable.childNodes // contains THEAD TBODY and TFOOT if present.

DOM Tables even have more properties喜欢rows集合和cells集合。

谨慎提醒:请注意这些集合是实时集合,因此迭代它们并在每次迭代中访问collection.length可能非常慢,因为为了获得长度,DOM具有每次都要被查询。