关于 c#:xPath 仅适用于在同一级别找到的多个 div 标签之一

xPath working for only one of multiple div tags found at the same level

在 C# 中使用 Selenium webdriver 编写测试。我绝对无法理解为什么只有(相同级别)div 元素列表中的第一个可以用 xPath 识别。
我有这个 html,我检查了页面上的两个元素,两个不同的 div。通过运行这个简单的代码,我设法只复制了第一个元素的文本:

1
IWebElement chapterElement = webDriver.FindElement(By.XPath("/html/body/div[3]/main/div[2]/div[3]/article/div[1]"));

...之后我可以输入:
chapterElement.Text 找出内部文本。

另外一个是另一个div,和第一个在同一层级,就是我刚刚从HTML中复制的xPath(复制整个xPath):

1
       IWebElement chapterElement = webDriver.FindElement(By.XPath("/html/body/div[3]/main/div[2]/div[3]/article/div[2]"));

... 它不会失败,但它也不会复制文本,文本是 " (空字符串)。

这两个 div 之间的唯一区别是:

  • 路径中的最后一段:div[1] 与 div[2]。

  • 第二个 div 实际上是从页面中隐藏的(可能是因为它缺少类 "chapter_visible"),但确实完全显示在带有 Inspect 的 html 中!

如果这有帮助,我会说

1
"/html/body/div[3]/main/div[2]/div[3]/article/div[1]"

对应于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    some text
    <p>some text</p>
<p>some text</p>
<p>some text</p>

<ul>


<li>
some text
</li>


<li>
some text
</li>


<li>
some text.
</li>


</ul>


"/html/body/div[3]/main/div[2]/div[3]/article/div[2]"(第二个 xPath)
对应于以下内容(与第一个位于同一级别):

1
2
3
4
5
6
    some text
    <p>some text</p>
<p>some text</p>
<p>some text.</p>
<p>some text</p>
<p>some text</p>

这是我第一次玩xPath,有点失望,因为我只是复制了xPath,我什至没有手动编写它。它应该是快速和直接的,对吧?谢谢。


1
IWebElement chapterElement = webDriver.FindElement(By.XPath("//div[@class='chapter chapter']"));

你可以试试这个吗?

如果你想要get_attribute

1
IWebElement chapterElement = webDriver.FindElement(By.XPath("//div[@class='chapter chapter']")).GetAttribute("attribute_name");