【问题标题】:Get HTML element by position按位置获取 HTML 元素
【发布时间】:2016-08-05 07:50:49
【问题描述】:

我在 Delphi 中使用TWebBrowser。 我需要帮助才能按位置获取 HTML 元素。

我需要的元素在一个框架中。使用elementFromPoint()

Document.elementFromPoint(X, Y)

我得到的是框架本身,而不是里面的东西。

我试图用这个来获得它:

WebBrowser.OleObject.Document.Frames

但这在传输帧时给我一个访问错误。

【问题讨论】:

    标签: delphi delphi-7 twebbrowser


    【解决方案1】:

    使用Document.elementFromPoint() 是正确的方法。您没有考虑到的是 HTML 是在分层 DOM 树中解析的,elementFromPoint() 不是递归的。

    您要求浏览器的顶级文档在文档内的给定 X、Y 坐标处查找 直接子元素。在这种情况下,这是一个框架元素。

    框架是包含另一个文档的嵌入式窗口。您需要访问框架的 Document 并要求它在框架内的目标 X、Y 坐标处查找子元素。以此类推,直到你最终到达最底层的孩子。

    请注意,elementFromPoint() 采用 client 坐标,该坐标相对于您正在调用 elementFromPoint() 的 Document 的左上角。因此,当您想要搜索子框架的 Document 时,您需要先从目标 X,Y 坐标中减去框架自身的左上 X,Y 坐标(在其父 Document 内),然后再对框架的 Document 调用 elementFromPoint()

    【讨论】:

    • 如何访问框架? WebBrowser.OleObject.Document.Frames 这不起作用。访问错误。
    • 您已经可以从elementFromPoint() 访问框架,它返回实际的框架元素。你根本不需要使用Document.Frames
    • 如何从框架中获取元素? frame:=browser.elementFromPoint(x,y); ... element:=frame.elementFromPoint(frame_x, frame_y);
    • @Alexey 如果您阅读 MSDN 关于浏览器界面的文档,您就会知道如何做到这一点。根据 IE TWebBrowser 的包装版本,框架元素具有 ContentDocumentContentWindow.Document 属性,例如:element := frame.ContentDocument.elementFromPoint(...);element := frame.ContentWindow.Document.elementFromPoint(...);
    • 谢谢。我正在使用 DSEF3。它是通过JS实现的,很适合我。
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 2017-07-23
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多