C# WatiN:在查找文本时,如何获取对其包含元素的引用?

C# WatiN:在查找文本时,如何获取对其包含元素的引用?,c#,watin,C#,Watin,给定以下HTML页面: <html> <head> <title>WatiN Test</title> </head> <body> <div> <p>Hello World!</p> </div> </body> </html> 或者这个: var element = ie.Element(e => e.Text != null

给定以下HTML页面:

<html>
<head>
    <title>WatiN Test</title>
</head>
<body>
<div>
    <p>Hello World!</p>
</div>
</body>
</html>
或者这个:

var element = ie.Element(e => e.Text != null && e.Text.Contains("World"));
我返回
元素。这与
Element.Text
的WatiN文档一致,该文档声明:“获取此元素的innertext(以及此元素中包含的所有元素的innertext)”

由于页面中的所有文本都包含在
元素中,因此我总是将其取回,而不是直接的父元素


有没有办法只获取元素下的文本(而不是元素中包含的文本)

还有别的办法吗


非常感谢。

我想出了一些可行的办法,但有点老套而且效率很低

这基本上是基于最深的包含元素将具有最短的
InnerHtml
。也就是说,包含直接父元素的所有其他元素也将包含它的HTML,因此会更长

public static Element FindElementContaining(IElementsContainer ie, string text)
{
    Element matchingElement = null;

    foreach (Element element in ie.Elements)
    {
        if (element.Text == null) continue;

        if (!element.Text.ToLower().Contains(text.ToLower())) continue;

        // If the element found has more inner html than the one we've already matched, it can't be the immediate parent!
        if (matchingElement != null && element.InnerHtml.Length > matchingElement.InnerHtml.Length) continue;

        matchingElement = element;
    }

    return matchingElement;
}

下面的代码将在
中找到包含“World”文本的第一个元素。被归类为元素容器且具有子元素的元素将被忽略

var element = ie.ElementOfType<Body>(Find.First()).Element(e =>
{
    if (e.Text != null && e.Text.Contains("World"))
    {
        var container = e as IElementContainer;
        if (container == null || container.Elements.Count == 0)
            return true;
    }
    return false;
});
var element=ie.ElementOfType(Find.First()).element(e=>
{
如果(e.Text!=null&&e.Text.Contains(“世界”))
{
var容器=e作为IElementContainer;
if(container==null | | container.Elements.Count==0)
返回true;
}
返回false;
});

注意:您可能想知道为什么我编写了
ie.ElementOfType(Find.First()).Element
而不是
ie.Element
。这应该行得通,但不行。我想这是一只虫子。我在WatiN邮件列表上写了一篇关于它的帖子,当我收到答案时会更新这个答案。

你可以使用Find.BySelector

var element = ie.Element(Find.BySelector("p:contains('World')"));

很好的解决方案,谢谢!如果HTML被修改为
HelloWorld,我实际上需要它来工作

但我在问题中没有说明这一点,所以这个答案是正确的。我认为这是目前公认的答案是公平的是的,我后来想了想,但至少我认为这个答案是一个更大的开始;)
var element = ie.Element(Find.BySelector("p:contains('World')"));