Selenium RC 定位器 - 指的是后续元素?

发布于 2024-07-23 02:00:25 字数 211 浏览 3 评论 0原文

当页面中存在多个具有相同定位器的元素时,应如何引用下一个元素?

使用 Xpath 定位器可以添加数组符号,例如 xpath=(//span/div)[1] 但是使用简单的定位器呢?

例如,如果有 3 个由“link=Click Here”标识的链接,则仅附加 [3] 将不会获得第三个元素。

寻址元素数组的权威参考在哪里? 我找不到任何。

When there is more than a single element with the same locator in a page, how should the next elements be referenced?

Using Xpath locators it's possible to add array notation, e.g. xpath=(//span/div)[1]
But with simple locators?

For example, if there are 3 links identified by "link=Click Here", simply appending [3] won't get the 3rd element.

And where is the authoritative reference for addressing array of elements? I couldn't find any.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一抹苦笑 2024-07-30 02:00:25

Selenium 本身不处理定位器数组。 它只返回满足你的查询的第一个元素,所以如果你想这样做,你必须使用 xpath、dom 甚至更好的 css。

因此,对于链接示例,您应该使用:

selenium.click("css=a:contains('Click Here'):nth-child(3)")

Selenium doesn't handle arrays of locators by itself. It just returns the first element that meets your query, so if you want to do that, you have to use xpath, dom or even better, css.

So for the link example you should use:

selenium.click("css=a:contains('Click Here'):nth-child(3)")
随风而去 2024-07-30 02:00:25

Santi 是正确的,Selenium 返回与您指定的定位器匹配的第一个元素,并且您必须应用您使用的定位器类型的适当表达式。 不过,我认为在这里提供详细信息会很有用,因为在这种情况下,它们确实接近于“血腥细节”:

CSS

:nth-child 伪-类使用起来很棘手; 它有一些鲜为人知的微妙之处,甚至在 W3C 页面上也没有明确记录。 考虑这样一个列表:

<ul>
  <li class="bird">petrel</li>
  <li class="mammal">platypus</li>
  <li class="bird">albatross</li>
  <li class="bird">shearwater</li>
</ul>

然后选择器 css=li.bird:nth-child(3) 返回 albatross 元素,而不是 shearwater ! 这样做的原因是,它使用您的索引 (3) 进入作为第一个匹配元素的同级元素的列表 -未经过 .bird 类过滤! 一旦它拥有正确的元素(在本例中是第三个元素),它就会应用鸟类过滤器:如果手中的元素匹配,则返回它。 如果不匹配,则匹配失败。

现在考虑选择器 css=li.bird:nth-child(2)。 这从第二个元素——鸭嘴兽——开始,它发现它不是鸟,所以空空如也。 这表现为您的代码抛出“未找到”异常!

CSS :nth-of-type 伪类可能适合查找索引条目的典型思维模型,它在索引之前应用过滤器。 不幸的是,根据 的官方文档,Selenium 不支持这一点定位器

XPath

您的问题已经表明您知道如何在 XPath 中执行此操作。 使用方括号在表达式中的任意点添加数组引用。 例如,您可以使用如下内容: //*[@id='abc']/div[3]/p[2]/span 在第二段中查找跨度指定 id 下的第三个 div。

DOM

DOM 使用与 XPath 相同的方括号表示法除了,DOM 索引从 0 开始,而 XPath 索引从 1 开始:document.getElementsByTagName("div")[1] 返回第二个div,不是第一个div! DOM 还提供了替代语法:document.getElementsByTagName("div").item(0) 完全相同。 请注意,使用 getElementsByTagName 您总是必须使用索引,因为它返回一个节点集,而不是单个节点。

Santi is correct that Selenium returns the first element matching your specified locator and you have to apply the appropriate expression of the locator type you use. I thought it would be useful to give the details here, though, for in this case they do border on being "gory details":

CSS

The :nth-child pseudo-class is tricky to use; it has subtleties that are little-known and not clearly documented, even on the W3C pages. Consider a list such as this:

<ul>
  <li class="bird">petrel</li>
  <li class="mammal">platypus</li>
  <li class="bird">albatross</li>
  <li class="bird">shearwater</li>
</ul>

Then the selector css=li.bird:nth-child(3) returns the albatross element not the shearwater! The reason for this is that it uses your index (3) into the list of elements that are siblings of the first matching element--unfiltered by the .bird class! Once it has the correct element, in this example the third one, it then applies the bird class filter: if the element in hand matches, it returns it. If it does not, it fails to match.

Now consider the selector css=li.bird:nth-child(2). This starts with the second element--platypus--sees it is not a bird and comes up empty. This manifests as your code throwing a "not found" exception!

What might fit the typical mental model of finding an indexed entry is the CSS :nth-of-type pseudo-class which applies the filter before indexing. Unfortunately, this is not supported by Selenium, according to the official documentation on locators.

XPath

Your question already showed that you know how to do this in XPath. Add an array reference at any point in the expression with square brackets. You could, for example use something like this: //*[@id='abc']/div[3]/p[2]/span to find a span in the second paragraph under the 3rd div under the specified id.

DOM

DOM uses the same square bracket notation as XPath except that DOM indexes from zero while XPath indexes from 1: document.getElementsByTagName("div")[1] returns the second div, not the first div! DOM offers an alternate syntax as well: document.getElementsByTagName("div").item(0) is exactly equivalent. And note that with getElementsByTagName you always have to use an index since it returns a node set, not a single node.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文