【问题标题】:Finding an html element ID based on a text displayed根据显示的文本查找 html 元素 ID
【发布时间】:2009-12-09 18:50:25
【问题描述】:

给定以下 html:

<div id="f52_lblQuestionWording" title="" style="width:auto;height:auto; display: inline;  overflow: hidden;" >Home telephone</div>

我想使用“家庭电话”字符串自动获取容器 div 元素的 ID,有人知道我如何通过正则表达式做到这一点吗?

查找ID的字符串并不总是相同的,并且html是动态生成的,因此有时可能会略有不同。我正在使用 Selenium 对公司项目进行 UI 测试自动化。

谢谢。

【问题讨论】:

  • 你需要抓取具有指定字符串的DOM文本元素,然后抓取它的父元素。这可能会非常缓慢。这样做的具体目标是什么?有没有更好的方法来解决更大的问题?

标签: regex


【解决方案1】:

XPath 是从 XML 和 HTML 文档中检索值的最简单方法(前提是它们格式正确)。

你想要的表达式是这样的:

//div[text() = 'Home telephone']/@id

其内容为“查找所有文本值等于 '家庭电话' 的 div,并为匹配的所有内容返回 id 属性。”

根据您的语言,通常有几个可用的内置或第三方(免费)XPath 解释器。

使用正则表达式解析 HTML 是个坏主意,因为 HTML 不是常规语言。正则表达式甚至无法处理最简单的 HTML 边缘情况,因为正则表达式无法正确处理嵌套。 HTML 是一种固有的嵌套结构。

【讨论】:

  • 感谢您的回复。我正在使用 java 脚本编写一个在 Selenium 中使用的扩展,这似乎是做我正在寻找的最好的方法。
【解决方案2】:

在 C# 中,您会设置一个如下所示的正则表达式:

string elementText = "Home\\stelephone"; // you can change this as needed
Regex regex = new Regex(
  "id=\"(.*?)\"\\s+.*(?="+ elementText +")",
RegexOptions.IgnoreCase
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);

// Capture all Matches in the InputText
MatchCollection ms = regex.Matches(InputText);

InputText 将是您打开以供阅读的 html 文件。

【讨论】:

    【解决方案3】:

    我不确定您使用“家庭电话”字符串是什么意思,但这里有几种方法可以做到这一点:

    /id=(.*?)\s+.*(?=Home telephone)/  
    

    如果您的编程语言支持,where (?=) 构造是正向前瞻。

    另一种方法是简单地 grep 获取家庭电话,然后使用 awk 或 sed 获取 id 值

    【讨论】:

      猜你喜欢
      • 2012-01-25
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多