1

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

因此,我尝试仅使用 Firefox 中的控制台来获取它,并使用该元素来读取内容,但我无法做到。它看起来像这样: 例子

当我尝试对该元素执行任何操作时,我得到一个指向以下页面的链接和错误:

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

无法访问该对象以使用 selenium 进行自动测试?

4

1 回答 1

3

此错误消息...

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:blankjavascript: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.domainothercompany.comcompany.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")))
    

奥特罗

一些相关的讨论:

于 2019-04-11T09:18:11.377 回答