【问题标题】:How to get the QWebFrame for an iframe/frame QWebElement?如何获取 iframe/frame QWebElement 的 QWebFrame?
【发布时间】:2015-05-08 05:20:54
【问题描述】:

我有一个使用 QtWebkit 的简单 Qt GUI 应用程序。我正在加载带有大量嵌套 IFRAME 标记的复杂页面。我想遍历完整的 DOM 树(就像 Chrome 浏览器在调试面板中所做的那样),包括 iframe 的内容。

我的代码是:

QWebElement doc = ui->webView->page()->mainFrame()->documentElement();
QWebElement iframe = doc.findFirst("iframe[id=someid]");
QWebFrame *webFrame = ....? // how to get the QWebFrame for an iframe/frame QWebElement?

注意: 我可以遍历所有帧(包括嵌套):

void MainWindow::renderFramesTree(QWebFrame *frame, int indent)
{
    QString s;
    s.fill(' ', indent * 4);
    ui->textLog->appendPlainText(s + " " + frame->frameName());
    foreach (QWebFrame *child, frame->childFrames())
        renderFramesTree(child, indent + 1);
}

但我的问题与此无关。我需要获取 iframe-QWebElement 对应的 QWebFrame*。

谢谢!

【问题讨论】:

    标签: qt iframe qtwebkit


    【解决方案1】:

    每个 QWebFrame 都有QList<QWebFrame *> QWebFrame::childFrames () const 方法。每帧也有QString QWebFrame::frameName () const。将两者结合起来可能会让你找到你需要的东西。

    QWebFrame * frameImLookingFor = NULL;
    foreach(QWebFrame * frame, ui->webView->page()->mainFrame()->childFrames())
    {
        if (frame->frameName() == QLatin1String("appFrame"))
        {
            frameImLookingFor = frame;
            break;
        }
    }
    
    if (frameImLookingFor)
    {
        // do what you need
    }
    

    【讨论】:

    • 是的,这是一个很好的解决方案,但前提是您知道
    • 我为此使用了 3 个因素:名称或 id、几何和源 URL。您可以比较框架和 web 元素中的几何图形、框架中的 src 属性和 URL。但即便如此,在极少数情况下,我无法将帧树与 iframe 节点匹配,但非常罕见
    【解决方案2】:
    • 在当前帧上运行选择器
    • 如果它返回的东西很好,我们发现我们的 webframe 在当前帧上,我们调用这个元素 X :
      • 现在使用选择器“iframe,frame”从当前页面获取所有框架元素
      • 循环遍历所有这些元素并尝试将它们与 X 框架匹配 这样您就可以在文档中找到 X 框架的准确 INDEX
      • 最后,您现在可以使用该 INDEX 专注于子框架
    • 否则这意味着在此框架中找不到选择器
      • 循环遍历所有子框架并为每个子框架重复整个过程

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2015-02-06
      相关资源
      最近更新 更多