我试图在页面中列出所有 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 许可协议
这个错误信息…
…意味着 WebDriver 实例 被阻止 访问跨源框架。
同源政策
同源策略:同源策略限制从一个源加载的文档或脚本如何与另一个源的资源交互。它是隔离潜在恶意文档的 _关键安全机制_。
跨源资源共享 (CORS)
Cross-Origin Resource Sharing (CORS) : Cross-Origin Resource Sharing (CORS) 是一种机制,它使用额外的 HTTP 标头来 告诉 浏览器客户端 让在一个源(域)运行的 _AUT(被测应用程序_)具有访问权限从不同来源的服务器中选择的资源。 Web 应用程序在请求具有不同来源(
domain
,protocol
,和port
)的资源时发出 _跨域HTTP请求_。 .起源的例子
这是与 URL 的来源比较示例
http://store.company.com/dir/page.html
什么地方出了错
当您尝试循环遍历
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 的相关讨论
参考
一些参考:
在此讨论中,您将找到有关 SecurityError: Blocked a frame with origin from accessing a cross-origin frame 的详细分析
在本次讨论中,您会发现不同的方法 是否可以在不使用 Selenium Webdriver Java 中的 driver.switchTo().frame(“frameName”) 的情况下切换到框架中的元素?
在本次讨论的
A Better Approach to Switch Frames
部分,您将找到关于 如何选择 html 元素的不同方法,无论它在 selenium 中的哪个框架中?