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

标签 c# dotnetbrowser

我需要编写函数来获取窗口中真实的顶部和左侧元素。 在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 作为没有 id 或名称的 IElement,只有子 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;
        }

关于c# - 如何使用 DotNetBrowser 将父 iframe 作为 IElement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65666853/

相关文章:

c# - 等待最后的方法调用

c# - 如何将多个选定的 Datagrid 值传递到 asp.net 中的另一个页面?

c# - 序列化类型对象时检测到循环引用...如何解决?

c# - 获取日期期间查询内的最大版本

c# - DotNetBrowser DOMNode调试

DotNetBrowser:有没有办法使用浏览器扩展?

c# - DotNetBrowser 中的 Silverlight 支持

c# - 如何在所有 Azure 可用实例上分派(dispatch) Hangfire 作业?