Это сообщение об ошибке ...
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
Пара связанных обсуждений: