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]")); |
...之后我可以输入:
另外一个是另一个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> |
和
对应于以下内容(与第一个位于同一级别):
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"); |