【问题标题】:xPath working for only one of multiple div tags found at the same levelxPath 仅适用于在同一级别找到的多个 div 标记之一
【发布时间】:2020-05-02 21:33:24
【问题描述】:

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

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

...之后我可以输入: chapterElement.Text查找内文。

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

       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 中!

如果这有帮助,我会说

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

对应:

<div class="chapter chapter chapter_visible" data-chapterno="0" data-chapterid="5e8798266cee070006f5a3d1" style="display: block;">
    <h1>some text</h1>
    <div class="chapter__content"><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></div>
</div>

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

<div class="chapter chapter" data-chapterno="1" data-chapterid="5e8798436cee070006f5a3d2">
    <h1>some text</h1>
    <div class="chapter__content"><p>some text</p>
<p><strong>some text</strong></p>
<p>some text.</p>
<p>some text</p>
<p>some text</p></div>
</div>

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

【问题讨论】:

    标签: c# selenium selenium-webdriver xpath selenium-chromedriver


    【解决方案1】:
    IWebElement chapterElement = webDriver.FindElement(By.XPath("//div[@class='chapter chapter']"));
    

    你可以试试这个吗?

    如果你想要get_attribute

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

    【讨论】:

    • 我有一个想法,这可能与页面上未显示的元素有关吗?也许 .Text 只是返回显示的文本,我如何返回内部 html?现在检查这个假设..(尝试 element.GetAttribute("innerHTML");)
    • 好吧,这确实有效,问题是 .Text 不适合隐藏的元素,我应该尝试使用 .GetAttribute("innerHTML") 并且您的相对 xpath 也很棒。谢谢!如果您可以在此建议中进行编辑以使用 .GetAttribute 而不是 .Text 我会标记您的答案。
    • 能否请您反馈一下代码是否正常工作?
    • 对不起,我刚刚接受了你的回答。这很好用!谢谢。
    猜你喜欢
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2020-01-14
    • 2011-09-19
    相关资源
    最近更新 更多