如何使用 DotNetBrowser 将父 iframe 作为 IElement?

问题描述

我需要编写函数获取窗口中真实的顶部和左侧元素。 在 DotNetbrowser 中,我们可以获取坐标:

int Y = el.BoundingClientRect.Origin.Y;
int X = el.BoundingClientRect.Origin.X;

但是如果元素进入 iframe,它不会给出真正的坐标。

我写了一些获取真实坐标的方法

public int realY(IElement el)
        {
            IFrame f = el.Frame;
            if (f.IsMain)
            {
                return el.BoundingClientRect.Origin.Y;
            }
            else
            { 
                IElement fel = GetElementByAtrTag("iframe","name",f.Name);
                return el.BoundingClientRect.Origin.Y + fel.BoundingClientRect.Origin.Y;
            }
        }

但它不是通用的,因为 iframe 没有名字(我在这方法中使用的)或者可以是多个父 iframe。

我尝试采用其他方式,对我而言,可以将元素父 iframe 作为 IElement,而没有 id 或 name,只有子 IElement,例如:

public IElement FindIframe(IElement el)
        {
            if (el.Parent.NodeName != "IFRAME")
            {
                
                return FindIframe((IElement)el.Parent);
            }
            else return (IElement)el.Parent;
        }

这个方法在到达父 iframe 元素时失败,并且他有 NodeName - #document

我可以使用第一个父 iframe,所以:

IFrame parentElFrame = el.Frame;

但 IFrame 没有 BoundingClientRect。

DotNetbrowser 有 IFrameElement,该元素有 BoundingClientRect,但我无法将 IFrame 转换为 IFrameElement

我可以去哪里?

解决方法

并且我制作了用于返回内部元素的父 iframe 的方法:

public IElement FindIframe(IElement el)
        {
            string docframe = el.Frame.Document.DocumentElement.OuterHtml;
            IEnumerable<IElement> elements = ActiveTab.browser.MainFrame.Document.DocumentElement.GetElementsByTagName("iframe");
            foreach(IElement e in elements)
            {
                IFrameElement ef = (IFrameElement)e;
                
                if (ef.ContentDocument.DocumentElement.OuterHtml == docframe)
                {
                    return e;
                }
            }
            return null;
        }

在我可以制作为 iframe 内的元素获取真实坐标的方法之后:

public Point realPlace(IElement el)
        {
            Point p = new Point(0,0);
            p.X = el.BoundingClientRect.Origin.X;
            p.Y = el.BoundingClientRect.Origin.Y;
            if (!el.Frame.IsMain)
            {
                Point pin = realPlace((IElement)FindIframe(el));
                p.X += pin.X;
                p.Y += pin.Y;
                
            }
            return p;
        }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...