【问题标题】:Access Dom constructed with iframes使用 iframe 构建的访问 Dom
【发布时间】:2014-07-08 14:13:56
【问题描述】:

有经济日历的页面。

场景:

  1. 我正在浏览器中加载页面。例如:http://www.dukascopy.com/swiss/english/marketwatch/calendars/eccalendar/
  2. 看穿它。如果有我感兴趣的数据,我点击按钮并保存所有加载了 iframe 数据的 html 以进行解析。

问题是这个页面上的必要数据是用 iframe 加载的。我在这里读到 chrome 拒绝使用 js-injects 访问 iframe。但是我可以通过右键菜单中的“检查元素”轻松访问必要的表格。是否可以在没有 js-injects 的情况下访问它?就像自动“检查 DOM 元素”或内部 HTML 一样?

我在 pyside(python qt webkit 接口)中这样解决了这个问题:

def print_content():
    res = web.page().mainFrame().childFrames()
    for i in res:
        s = i.documentElement().toOuterXml()
        print(s)

但现在我想通过 chrome(chromium) 扩展来实现。现代铬(铬)有类似的功能吗? 例如:

chrome.web.page().mainFrame().childFrames() etc...

更新:

尝试推荐。更正清单并添加到内容脚本:

chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
    var res = document.querySelectorAll("iframe");
    var len = res.length;
    for (var i = 0; i < len; i++) {
       //alert(myStringArray[i]);
       console.log(res[i].contentDocument);
       //Do something
    }
    //console.log(res);

收到此错误: 事件处理程序中的错误(未知):错误:阻止了来源为“dukascopy.com”的帧;从访问跨域框架。在 chrome-extension://bgoddjjeokncninlaacmjamgkohmcecb/content.js:19:23 在 Extensions::messaging:323:11 在 Function.target.(匿名函数) (extensions::SafeBuiltins:19:14) 在 Event.dispatchToListener (extensions ::event_bindings:386:22) 在 Event.dispatch_ (extensions::event_bindings:371:27) 在 Event.dispatch (extensions::event_bindings:392:17) 在 dispatchOnDisconnect

【问题讨论】:

  • 您需要与 iframe 内的 DOM 元素交互还是只解析数据?如果您只需要读取 iframe 中的数据,则无需注入帧。你的python代码可以很容易地用JS替换,例如:var res = document.querySelectorAll("iframe");
  • 尝试在 content_script 中使用并将结果刷新到 js 控制台。它向我显示了一些文件,并且这个“contentDocument: [Exception: DOMException]”OutterHTML 也不包括 iframe 的构建表。所以内容不可访问?还是我在某个地方弄错了?
  • 还记录了这个:事件处理程序中的错误(未知):错误:阻止了具有源“dukascopy.com”的帧访问跨源帧。在 chrome-extension://bgoddjjeokncninlaacmjamgkohmcecb/content.js:19:23 在 Extensions::messaging:323:11 在 Function.target.(匿名函数) (extensions::SafeBuiltins:19:14) 在 Event.dispatchToListener (extensions ::event_bindings:386:22) 在 Event.dispatch_ (extensions::event_bindings:371:27) 在 Event.dispatch (extensions::event_bindings:392:17) 在 dispatchOnDisconnect (extensions::messaging:283:27)跨度>
  • 好的,所以这里这种做法的问题是iframe和父页面的域不同,所以我的做法在这种情况下是行不通的。这种方法适用于与父页面具有相同域和协议的 iframe(即,可以读取 iframe 内容而无需注入)

标签: javascript html google-chrome iframe google-chrome-extension


【解决方案1】:

您需要将内容脚本注入内部框架才能访问它。这是完全可能的,只是外部文档的脚本无法访问 iframe 内容。

This question 介绍了在基于清单的注入情况下如何执行此操作。

对于程序化注入,您可以在InjectDetails object 中传递all_frames: truechrome.tabs.executeScript

【讨论】:

  • 我将这个添加到清单和这个错误日志中,正如我在上一个问题中描述的那样
  • 该错误表明您正在尝试从外部页面访问内部iframe。这行不通。您需要将脚本注入内部框架并使用其内容。
  • 根据您的链接,该字符串仅在内部 html 中执行命令。 if (parent === top) { // 在这里你可以把你的代码只在 iframe 中运行 console.log(res[i].contentDocument);} 但它会导致同样的错误
  • 附注iframe 和父页面的域不同。你的建议是否适合这种情况?
  • 是的。您的内容脚本设置/权限应包括内部框架的域。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 2016-03-21
  • 2012-12-29
  • 1970-01-01
  • 2011-02-06
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多