未捕获的 DOMException:阻止来源为“http://localhost:8080”的框架在页面中列出 iframe 时访问跨域框架

新手上路,请多包涵

我试图在页面中列出所有 iframe 的名称,以便我可以通过 Selenium 访问它们。

问题是 iframe 的名称每次都会更改,因此我需要遍历所有这些名称。

我正进入(状态:

未捕获的 DOMException:阻止了来源为“ http://localhost:8080 ”的框架访问跨域框架。

当我尝试使用以下方法遍历它们时出错:

 for (var f = 0; f < window.frames.length; f++) {
    console.log(window.frames[f].name)
}

有没有办法以不同的方式获取 iframe 的名称?

原文由 TwoShorts 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

这个错误信息…

 Uncaught DOMException: Blocked a frame with origin "http://localhost:8080" from accessing a cross-origin frame.

…意味着 WebDriver 实例 被阻止 访问跨源框架。


同源政策

同源策略:同源策略限制从一个源加载的文档或脚本如何与另一个源的资源交互。它是隔离潜在恶意文档的 _关键安全机制_。


跨源资源共享 (CORS)

Cross-Origin Resource Sharing (CORS) : Cross-Origin Resource Sharing (CORS) 是一种机制,它使用额外的 HTTP 标头来 告诉 浏览器客户端 让在一个源(域)运行的 _AUT(被测应用程序_)具有访问权限从不同来源的服务器中选择的资源。 Web 应用程序在请求具有不同来源( domainprotocol ,和 port )的资源时发出 _跨域HTTP请求_。 .


起源的例子

这是与 URL 的来源比较示例 http://store.company.com/dir/page.html

 URL                                                  Outcome    Reason
http://store.company.com/dir2/other.html             Success
http://store.company.com/dir/inner/another.html      Success
https://store.company.com/secure.html                Failure    Different protocol
http://store.company.com:81/dir/etc.html             Failure    Different port
http://news.company.com/dir/other.html               Failure    Different host


什么地方出了错

当您尝试循环遍历 frames 您的脚本/程序试图访问 <iframe> 使用 JavaScript 的不同来源,如果您实现了它,这将是一个巨大的 _安全漏洞_。如上所述, 同源策略 浏览器会阻止脚本尝试访问不同来源的 <iframe>

如果两个网页的 协议端口(如果已指定)和 主机 相同,则两个页面具有相同的来源。您会看到它有时被称为 "scheme/host/port tuple" (其中“元组”是一组三个组件,它们共同构成一个整体)。当您想要访问所需的帧时,也许 协议主机名端口 必须与您的同一域相同。

解决方案

AUT 可能包含许多 框架/ iframe ,其中一些可能仅在某些 JavaScript / Ajax 完成后加载,其中一些可能将 样式 属性设置为 display:none;隐藏 的 _可见性_。当然不需要与他们所有人互动。因此,识别 <iframe>属性 并进行相应切换将是更好的方法。您可以通过以下方式切换到 <iframe>

  • Frame Name
  • Frame ID
  • Frame Index
  • WebElement

根据 _最佳实践_,当您打算切换到框架时,根据以下参考为 frameToBeAvailableAndSwitchToIt 引入 WebDriverWait

在这里您可以找到关于 Uncaught DOMException 的相关讨论


参考

一些参考:

原文由 undetected Selenium 发布,翻译遵循 CC BY-SA 4.0 许可协议

肮脏的解决方案:

对于窗户:

 chrome.exe --user-data-dir="" --disable-web-security

对于苹果电脑:

 open -a Google\ Chrome --args --disable-web-security --user-data-dir=""

通过这种方式,您可以打开 chrome 并让它忽略网络安全。

原文由 Angia 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏