错误:由于使用Selenium的相同/跨源策略,访问属性“x”被拒绝权限?

问题描述 投票:0回答:1

我想访问一个脚本的内容,该脚本位于另一个我可以轻松识别的HTML元素中。我试图通过获取父母然后寻找一个孩子来找到该元素,但我无法做到这一点。

所以我试图在firefox中使用控制台并使用该元素来读取内容并且我无法做到。它看起来像这样:example

当我尝试对该元素执行任何操作时,我得到以下页面的链接并出现错误:

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

是否无法访问该对象以进行硒自动测试?

perl selenium cors same-origin-policy cross-origin-read-blocking
1个回答
1
投票

此错误消息...

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>的不同域加载的same-origin policy元素。


同源政策

Same-origin policy是一种关键的安全机制,它限制从一个origin加载的文档或脚本如何与来自另一个源的资源进行交互。它有助于隔离潜在的恶意文档,减少可能的攻击媒介。


起源

如果protocolport(如果指定)和host两者都相同,则两个URL具有相同的原点。您可能会将此引用称为“scheme / host / port tuple”,或仅仅是“元组”。 (“元组”是一组共同构成整体的项目 - 双/三/四/五元组的通用形式。)


一个例子

下表给出了与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

您还可以找到[文件:URL的原始定义],其中比较更复杂。


继承的起源

从具有about:blankjavascript: URL的页面执行的脚本会继承包含该URL的文档的来源,因为这些类型的URL不包含有关源服务器的信息。

例如,about:blank通常用作新的空弹出窗口的URL,父脚本在其中写入内容(例如,通过Window.open()机制)。如果此弹出窗口还包含JavaScript,则该脚本将继承与创建它的脚本相同的源。

data::URL获得一个新的,空的安全上下文。


改变起源

页面可能会改变自己的起源,但有一些限制。脚本可以将document.domain的值设置为其当前域或其当前域的超域。如果设置为当前域的超级域,则较短的超级域用于同源检查。

例如,假设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.comdocument.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")))

其他

几个相关的讨论:

© www.soinside.com 2019 - 2024. All rights reserved.