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

IT技术 javascript selenium iframe same-origin-policy
2021-01-15 11:45:30

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

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

我正进入(状态:

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

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

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

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

4个回答

这个错误信息...

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

...暗示WebDriver实例被阻止访问跨域框架。


同源策略

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


跨域资源共享 (CORS)

跨域资源共享 (CORS):跨域资源共享 (CORS) 是一种机制,它使用额外的HTTP 标头告诉浏览器客户端在一个源(域)运行AUT(被测应用程序)有权访问从不同来源的服务器中选择的资源。一个Web应用程序进行跨域HTTP请求时,它要求具有不同的原点(资源domainprotocolport)比它自己的起源。


起源的例子

这是与 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可能包含众多/内部框架和其中一些可能只有在某些加载的JavaScript / Ajax的已完成,其中作为它们中的一些可以具有样式属性集为显示:无; 可见性hidden当然,不需要与所有人互动。因此,这将是一个更好的方式来确定的属性<iframe>,并相应地进行切换。您可以切换到<iframe>通过:

  • Frame Name
  • Frame ID
  • Frame Index
  • WebElement

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

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


参考

一些参考:

你可以试试这样的:(不确定 JavaScript)

var iframeElems = driver.findElements(webdriver.By.tagName("iframe"));

迭代此列表以获取属性。

for (var f = 0; f < iframeElems.length; f++) {
    console.log(iframeElems.getAttribute("attribute name"))
}

脏的解决办法:

对于窗户:

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

对于 Mac:

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

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

您可以使用以下selenium方式获取 iframe 标签:

var iframeElems = driver.findElements(webdriver.By.xpath("//iframe"));

然后在这些元素上循环并获取name属性:

iframe.getAttribute('name')