未捕获http://localhost:8080&;quot;异常:在页面中列出IFRAME时,阻止具有源DOMException的框架访问跨域框架
我正在尝试列出页面中所有iframe
的名称,以便可以通过Selenium访问它们。
问题是iframe
的名称每次都会更改,因此我需要遍历所有这些名称。
我收到:
未捕获DOMException:阻止源为"http://localhost:8080"的帧访问跨源帧。
尝试使用以下命令循环它们时出错:
for (var f = 0; f < window.frames.length; f++) { console.log(window.frames[f].name) }
是否有其他方式获取
iframe
的名称?解决方案
此错误消息.
Uncaught DOMException: Blocked a frame with origin "http://localhost:8080" from accessing a cross-origin frame.
.表示WebDriver实例阻止访问跨域框架。
同源策略
Same-origin policy:同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源交互。它是用于隔离潜在恶意文档的关键安全机制。
跨域资源共享(CORS)
Cross-Origin Resource Sharing (CORS):跨域资源共享(CORS)是一种机制,它使用额外的HTTP标头告诉浏览器客户端允许在一个源(域)运行的AUT(被测应用程序)拥有从另一个源(域)的服务器访问选定资源的权限。当Web应用程序请求的资源的来源(
domain
、protocol
和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
时,您的脚本/程序试图使用JavaScript访问不同来源的<iframe>
,这将是一个巨大的安全缺陷,如果您能够做到这一点的话。如上所述,同源策略浏览器挡路脚本尝试访问不同来源的<iframe>
。如果两个网页的协议、端口(如果指定了一个)和主机相同,则这两个网页具有相同的来源。您有时会看到这称为
"scheme/host/port tuple"
(其中"元组"是一组共同组成整体的三个组件)。如果要访问所需的帧,协议、域、主机名和端口可能必须与您的相同域相同。解决方案
AUT可能包含许多帧/IFRAMES,其中一些可能仅在某些JavaScript/Ajax完成之后才会加载,其中一些可能将样式属性设置为display:None;或visiblity作为隐藏。当然,不需要与所有人进行交互。因此,识别
切换到<iframe>
的属性并相应地进行切换将是一种更好的方法。您可以通过:<iframe>
Frame Name
Frame ID
Frame Index
WebElement
根据最佳实践当您打算切换到框架诱导WebDriverWaitFORframeToBeAvailableAndSwitchToIt时,请按照下面的参考。
此处您可以在Uncaught DOMException
找到相关讨论
引用
部分参考:
- 的详细分析
在本讨论中,您将找到有关SecurityError: Blocked a frame with origin from accessing a cross-origin frame
- 上的不同方法
在本讨论中,您将发现Is it possible to switch to an element in a frame without using driver.switchTo().frame("frameName") in Selenium Webdriver Java?
- 的不同方法
在本讨论的
A Better Approach to Switch Frames
部分中,您将发现How can I select a html element no matter what frame it is in in selenium?
相关文章