如何在Selenium中唯一标识元素?

时间:2015-05-13 21:38:59

标签: java sockets selenium

我希望能够在Selenium中唯一地标识一个元素,以便让人A点击元素x,我可以向人B发送一个数据包,让他们知道单击了一个元素,并且该元素是x。程序将是独立的,所以我不能只通过套接字发送WebElement对象。如何以一种可以通过套接字发送的方式唯一地标识元素并且每次都准确?

我想这样做,以便A人可以在实际托管在B人计算机上的浏览器上执行操作。人A对浏览器的看法与人B相同,但在浏览器上执行的所有操作实际上都是在人B的计算机上完成的,而人A的浏览器则更像是镜像(能够点击元素和类型)人B计算机上的真实浏览器。

1 个答案:

答案 0 :(得分:0)

理想情况下,您应该做的是为您关注的元素分配id值。该算法必须使两个元素不能得到相同的id,但可以预测id值的赋值,以便两个相同结构的DOM树中相同位置的两个元素将得到相同id。它可以是一种平庸的东西,就像在文档顺序中对所有button个元素进行编号一样。 id是您用来唯一标识button

的内容

如果你不能提前知道你关心的元素,那么你必须使用另一种方法。我为我的一个应用程序做了类似的事情。我所做的是创建一个路径,其中路径的每一步都是其父节点子节点中DOM节点的索引。此路径可用于唯一标识元素。在您的情况下,作为第一个参考点的根可以是body元素。路径看起来像这样/1/4/1/2(向后读)指的是body的孩子1的孩子4的孩子1的孩子2。 (索引从0开始。)如果您有一些用途,可以创建一个与XPath兼容的格式的路径。例如,/ul[2]/li[5]/ul[2]/li[3]。 (提醒:XPath索引是基于1的。)在我的项目中,我不需要XPath兼容性(在我的项目中也不会有任何好处)。

有一个主要警告:两侧的DOM树必须具有相同的结构。

例如。如果在一边,你有:

<body>
  <ul>
    <li>foo</li>
    <li>bar</li>
  </ul>
<body>

然后你应该在另一边有相同的,因为如果有人点击最后一个li并且你需要识别另一边的元素,那么如果DOM树代表你就会有问题这样:

<body>
  <p>foo</p>
<body>

如何确保树木具有相同的结构完全取决于您的具体应用。

我使用id值描述的第一种方法更能容忍结构上的差异。如果您只关心button元素,并且在两侧都有button元素出现在“Checkout”,“Empty Cart”,“Remove Item”的顺序中,并且它们执行相同的功能在双方,那么他们在各自的DOM树中拥有什么祖先并不重要。但是,button元素的顺序和数量仍然很重要。