【问题标题】:How to write XPath for the text present outside the tags?如何为标签外的文本编写 XPath?
【发布时间】:2018-01-30 08:05:10
【问题描述】:
<div class="accordion_browse">
  <a target="_blank" href="https://www.silverpages.sg/tools/e-care-locator" 
   aria-expanded="false" aria-controls="collapseExample">
    <span class="browse_img">
        <img src="/sites/assets/assets/directory/icons/eldercare.png"/>
    </span>
    Eldercare Services
    <i class="indicator fa fa-chevron-right pull-right" aria-hidden="true"/>
  </a>
</div>

注意:所需文字为“Eldercare Services”

代码:

string Eldercare = driver.FindElement(By.XPath("//a[contains(.,'Eldercare Services')")).Text; 
Console.WriteLine(Eldercare + " found");
Assert.IsTrue(Eldercare.Contains("Elder"), Eldercare + " not found"); 

【问题讨论】:

  • 这是用于使用 Selenium 的测试还是网络爬虫应用程序?您还可以提供一个链接到您从中获取此 HTML 的网站。
  • 是的,“Selenium 自动化”需要它。
  • 展示你是如何解决问题的
  • string Eldercare = driver.FindElement(By.XPath("//a[contains(.,'Eldercare Services')")).Text; Console.WriteLine(Eldercare + "找到"); Assert.IsTrue(Eldercare.Contains("Elder"), Eldercare + " not found");
  • 您能否描述您的问题以及您希望脚本执行的具体操作不是很清楚?请注意,在您的 XPath 中没有右方括号

标签: c# xpath


【解决方案1】:

使用文本节点text()检索文本节点

XPath:"/body/div/text()"

这将检索/body/div 的所有子文本节点。

"/body/div/text()[1]" 将检索/body/div 中的第一个文本节点

XPath 补充阅读: https://www.w3schools.com/xml/xpath_examples.asp

【讨论】:

    【解决方案2】:

    给定的 xpath 看起来不错,但 By.XPath("//a[contains(.,'Eldercare Services')") 示例代码缺少右方括号:By.XPath("//a[contains(.,'Eldercare Services')]")

    通过此修复,xpath 将提供 a 元素

    <a target="_blank" href="https://www.silverpages.sg/tools/e:care:locator" aria:expanded="false" aria:controls="collapseExample">
    <span class="browse_img">
    	<img src="/sites/assets/assets/directory/icons/eldercare.png"/>
    </span>
    Eldercare Services longtext
    <i class="indicator fa fa:chevron:right pull:right" aria:hidden="true"/>
    </a>

    缺少的括号应该可以修复代码。

    如果 Selenium 可以处理文本元素,它可能是

    //a[contains(.,'Eldercare Services')]/text()
    

    results 将是一个包含 3 个字符串的字符串数组。中间一个有预期的字符串,因为在 span 之前和 i 元素之后可能会有两个空字符串。

    Text = 
    
    Text = 
        Eldercare Services longtext
    
    Text = 
    

    如果对文本使用第二个过滤器,它只会产生预期的字符串

    //a[contains(.,'Eldercare Services')]/text()[contains(.,'Elder')]

    【讨论】:

      猜你喜欢
      • 2016-06-30
      • 2019-06-16
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2017-01-04
      • 1970-01-01
      相关资源
      最近更新 更多