【问题标题】:Can't find element contains some text找不到包含某些文本的元素
【发布时间】:2018-02-27 01:54:27
【问题描述】:

页面有一点:

 <label>
   <input type="checkbox">

   </input>
"  some text"
</label>

我需要找到一个包含“一些文本”的元素。 如果我使用

WebElement().ByXPath("//div/label[contains(text(),'some text')]");

但这并没有给出结果。找不到元素。

但是!!如果我尝试使用

获取此类元素的属性(InnerHTML、GetText、innerText)
    WebElement.ByXPath("//div/label").GetAttribute("InnerHTML"/"innerText");
   WebElement.ByXPath("//div/label").Text; 

有正确的结果 (WebElement.ByXPath("//div/label").Text=="some text")!

对于这个 XPath 元素:

WebElement().ByXPath("//div/label[contains(@innerHtml,'some text')]");
WebElement().ByXPath("//div/label[contains(@innerText,'some text')]");

它也不起作用。

为什么会这样?为什么我无法通过页面上的唯一文本找到元素?

【问题讨论】:

标签: c# google-chrome selenium xpath selenium-webdriver


【解决方案1】:

您的 xpath 似乎是正确的,但如果不查看您的页面,我就无法判断。您的示例适用于此 stackoverflow 页面:

//p[contains(text(), 'Why is this possible?')]

我知道这是可行的,因为我使用 FireFox 的 FirePath 扩展对其进行了测试。尝试使用它来测试它:https://addons.mozilla.org/en-US/firefox/addon/firepath/

【讨论】:

    【解决方案2】:

    可能是由于在元素显示之前页面没有完全加载,在构建 selenium 测试时会出现不是错误的错误,只是浏览器和速度的不一致。您可以通过构建稳定的代码来为无法找到的项目做好准备。

    等待功能有帮助

    public IWebElement WaitForElement(By element)
        {
                return new WebDriverWait(this.browser,
                    TimeSpan.FromSeconds(10)).
                    Until(ExpectedConditions.
                    ElementIsVisible(element));
        }
    

    如果您认为有必要,您还可以允许您的程序刷新页面并在失败时再次尝试测试,这是双重检查的方法。

    对于我一直使用的 xpath,如果它们没有名称或 id

    By.Xpath("//*[contains(text(), 'Some Text')]");
    

    【讨论】:

    • 我尝试在我的 Visual Studio 中使用调试查找元素。我想等多久就等多久。但它也不起作用
    • 嗯,也许要确保您专注于正确的页面,它不是弹出窗口或什么的??坚决确保网址正确。如果您需要更多帮助,我将需要更多代码和 html。它只是带有一个未找到的元素异常?
    【解决方案3】:

    我不确定是什么导致了此问题,但我同意有时确实存在问题。我建议您尝试以下方法:

    //div//label[contains(node(),'some text')]
    

    或者,正如 redp 建议的那样,您可以使用 *,但请确保您正确指定父元素,以防您的页面有多个具有相同文本的标签:

    //div//*[contains(node(),'some text')]
    

    如果没记错的话,你也可以使用contains(.,'some text') insted of contains(node(),'some text)'。此外,请考虑在检查器工具中仔细检查您的元素,并注意查看 Properties 选项卡。而且,请记住,您可以在 Inspector 中使用搜索来找到您的元素,这将为您节省大量时间。

    如果这对你有帮助,请更新我。

    【讨论】:

      【解决方案4】:

      这应该有一个围绕“一些文本”的跨度标签。这只是糟糕的 html 标记。

      你也可以使用:

      //label/text()[last()]
      //label/text()[2]
      

      【讨论】:

        【解决方案5】:

        确实,html 不是很好的做法,但它存在并且人们必须处理它。我认为这里有帮助的是normalize-space()。在具有该 html 的页面上的 chrome 控制台中尝试此操作:

        $x(`//label[contains(normalize-space(), "some text")]`);
        

        我认为上面的代码分解成这样:

        1. 查找所有label 节点
        2. 对于每个节点
          1. 获取所有该节点及其后代节点内的text 节点
          2. 结合他们的文字
          3. 从每个文本节点的文本中删除多余的空格
          4. 如果我想要的确切字符串(“一些文本”)在其中,请将 label 添加到要返回的节点列表中。
        3. 返回包含该文本的所有节点的列表(如果没有匹配,则返回一个空列表)

        更复杂一点,如果我想找到具有“某些文本”的text 节点的 direct 父节点,我可以这样做:

        $x(`//label//text()[contains(normalize-space(), "some text")]/..`);
        

        不过,这有点棘手。对于每个包含给定字符串的text 节点,它都会获得直接父节点。它适用于此,因为“一些文本”都在一个 text 节点中。在其他情况下,它可能会绊倒某人。例如,看这个 html:

        <label>
          <span> text </span>
          some other text
        </label>
        

        作为一个人类,我可以阅读“text some other text”,所以看起来我应该能够找到“text some”的父级。如果我使用第一种方法查找带有“text some”的label,这段代码会发现label 就可以了:

        $x(`//label[contains(normalize-space(), "text some")]`);
        

        这是因为所有文本节点的组合中确实包含“text some”。不过,我不能使用第二种方法。例如,在该 html 上使用此代码只会给我一个空列表:

        $x(`//label//text()[contains(normalize-space(), "text some")]/..`);
        

        那是因为当 xpath 在每个单独的 text 节点中查找时,它们里面都没有“text some”。如果我想一想,“发短信”实际上并没有一个直接的父母。它有两个直系父母。 xpath 选择不给父母,而不是给他们两个。看起来很公平。

        我还没有找到对normalize-space() 的任何很好的解释,我也不知道为什么它结合了它所有后代节点的文本。至于为什么text() 不起作用,我在 2014 年找到了这个答案:

        text()child::text() 的缩写,它选择作为标签元素的直接子级的文本节点。 -- https://stackoverflow.com/a/26823289/14144258

        它可能仍然是正确的。

        另外,我知道这是一个老问题,但我在尝试对自己的代码进行故障排除时遇到了同样的问题,并且花了很长时间才找到解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-16
          • 2020-09-27
          • 2021-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-08
          • 2018-03-25
          相关资源
          最近更新 更多