此错误消息...
Permission denied to access property. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Property_access_denied?utm_source=mozilla&utm_medium=firefox-console-errors&utm_campaign=default
...暗示脚本/程序试图访问您无权访问的对象。这很可能是从您违反了同源策略<iframe>
的不同域加载的元素。
同源政策
同源策略是一种关键的安全机制,它限制从一个源加载的文档或脚本如何与另一个源的资源进行交互。它有助于隔离潜在的恶意文档,减少可能的攻击媒介。
起源
如果两个 URL 的协议、端口(如果指定)和主机相同,则两个 URL 具有相同的来源。您可能会看到这被称为“方案/主机/端口元组”,或者只是“元组”。(“元组”是一组项目,它们共同构成一个整体——双/三/四/五/等的通用形式。)
一个例子
下表给出了与 URL 的来源比较示例http://store.company.com/dir/page.html
:
URL Outcome Reason
http://store.company.com/dir2/other.html Success Only the path differs
http://store.company.com/dir/inner/another.html Success Only the path differs
https://store.company.com/page.html Failure Different protocol
http://store.company.com:81/dir/page.html Failure Different port (http:// is port 80 by default)
http://news.company.com/dir/page.html Failure Different host
您还可以找到比较复杂的 [origin definition for file: URLs]。
继承的起源
从具有about:blank
或javascript:
URL 的页面执行的脚本会继承包含该 URL 的文档的来源,因为这些类型的 URL 不包含有关源服务器的信息。
例如,about:blank
通常用作新的空弹出窗口的 URL,父脚本将内容写入其中(例如通过Window.open()
机制)。如果此弹出窗口还包含 JavaScript,则该脚本将继承与创建它的脚本相同的来源。
data:
: URL 获得一个新的、空的、安全的上下文。
改变原点
一个页面可能会改变它自己的来源,但有一些限制。脚本可以将 的值设置document.domain
为其当前域或其当前域的超域。如果设置为当前域的超域,则较短的超域用于同源检查。
例如,假设文档 at 中的脚本http://store.company.com/dir/other.html
执行以下操作:
document.domain = "company.com";
之后,页面可以通过同源检查http://company.com/dir/page.html
(假设http://company.com/dir/page.html
将其document.domain
设置company.com
为表示它希望允许)。但是,company.com
不能设置为,因为那不是 的超级域。document.domain
othercompany.com
company.com
端口号由浏览器单独检查。任何对 的调用document.domain
,包括document.domain = document.domain
,都会导致端口号被 覆盖null
。因此,仅设置在第一个是无法与人company.com:8080
交谈的。它必须在两者中设置,因此它们的端口号都是空的。company.com
document.domain = "company.com"
注意:当使用document.domain
允许子域安全访问其父域时,您需要document.domain
在父域和子域中设置相同的值。即使这样做只是将父域设置回其原始值,这也是必要的。不这样做可能会导致权限错误。
解决方案
切换帧时需要诱导WebDriverWait如下:
Java示例代码:
new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("iframe_id")));
Python示例代码:
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"iframe_id")))
奥特罗
一些相关的讨论: