Uncaught DOMException: заблокирован фрейм с источником "http://localhost:8080" от доступа к фрейму с несколькими источниками при отображении фреймов на странице - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь перечислить имена всех iframe s на странице, чтобы я мог получить к ним доступ через Selenium.

Проблема в том, что имя iframe меняется каждый раз, поэтому мне нужно просмотреть все из них.

Я получаю:

Uncaught DOMException: заблокирован фрейм с источником "http://localhost:8080" от доступа к фрейму перекрестного происхождения.

ошибка, когда я пытаюсь зациклить их, используя:

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

Есть ли способ получить имя iframe по-другому?

Ответы [ 4 ]

0 голосов
/ 08 ноября 2018

Грязный раствор:

для окон:

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

для Mac:

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

Таким образом, вы открываете хром и позволяете ему игнорировать веб-безопасность.

0 голосов
/ 04 июля 2018

Вы можете попробовать что-то вроде этого: (Не уверен насчет JavaScript)

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

итерируйте этот список, чтобы получить атрибут.

for (var f = 0; f < iframeElems.length; f++) {
    console.log(iframeElems.getAttribute("attribute name"))
}
0 голосов
/ 04 июля 2018

Это сообщение об ошибке ...

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

... означает, что WebDriver экземпляр заблокировал доступ к фрейму перекрестного источника.


Политика того же происхождения

Политика одного и того же источника : Политика одного и того же источника ограничивает взаимодействие документа или сценария, загруженного из одного источника, с ресурсом из другого источника. Это критический механизм безопасности для изоляции потенциально вредоносных документов.


Обмен ресурсами между источниками (CORS)

Обмен ресурсами между источниками (CORS) : Обмен ресурсами между источниками (CORS) - это механизм, использующий дополнительные заголовки HTTP для передачи Клиент браузера , чтобы разрешить AUT (тестируемое приложение) , работающему в одном источнике (домене), иметь разрешение на доступ к выбранным ресурсам с сервера в другом источнике. Веб-приложение отправляет перекрестный HTTP-запрос , когда оно запрашивает ресурс, источник которого (domain, protocol и port) отличается от своего собственного источника.


Пример происхождения

Вот пример сравнения происхождения с 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 может содержать множество кадров / iframes , и некоторые из них могут быть загружены только после определенных JavaScript / Ajax завершен, поскольку некоторые из них могут иметь атрибут style , установленный как display: none; или visiblity как hidden, Конечно, не потребуется взаимодействовать со всеми из них. Таким образом, будет лучше определить атрибуты <iframe> и соответственно переключаться. Вы можете переключиться на <iframe> через:

  • Frame Name
  • Frame ID
  • Frame Index
  • WebElement

Согласно рекомендациям , когда вы намереваетесь переключиться на фрейм, вызовите WebDriverWait для frameToBeAvailableAndSwitchToIt как по ссылкам ниже.

Здесь вы можете найти соответствующее обсуждение по Uncaught DOMException


Ссылки

Некоторые ссылки:

0 голосов
/ 04 июля 2018

Вы можете использовать selenium для получения тегов iframe, таких как:

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

Затем зациклите эти элементы и получите атрибут name :

iframe.getAttribute('name')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...