Ошибка: в доступе к свойству "x" отказано в доступе из-за политики такого же или перекрестного происхождения с использованием Selenium? - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу получить доступ к содержимому скрипта, который находится внутри другого элемента 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

Isнет доступа к этому объекту для автоматического тестирования с селеном?

1 Ответ

1 голос
/ 11 апреля 2019

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

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 - это критически важный механизм безопасности, который ограничивает взаимодействие документа или сценария, загруженного из одного origin , с ресурсом из другого источника. Это помогает изолировать потенциально вредоносные документы, уменьшая возможные направления атак.


начало

Два URL имеют одинаковое происхождение, если протокол , port (если указан) и host одинаковы для обоих. Вы можете увидеть это как «схема / хост / порт кортеж» или просто «кортеж». («Кортеж» - это набор элементов, которые вместе составляют единое целое - общая форма для двойного / тройного / четверного / пятого / и т. Д.)


Пример

В следующей таблице приведены примеры сравнения происхождения с 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], где сравнение более сложное.


Наследственное происхождение

Сценарии, выполненные со страниц с URL-адресом about:blank или javascript:, наследуют источник документа, содержащего этот 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.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")))
    

Outro

Пара связанных обсуждений:

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