Python3 Selenium проблема с javascript на странице ip-камеры

У ip-камеры есть javascript функция snapshot:

<a href="#" target="_self" onclick="javaScript:snapshot('/axis-media/media.amp?videocodec=h264'); return false;"><img src="/pics/button_shot_27x27px.gif" width="27" height="27" border="0" title="Snapshot" alt="Snapshot"></a>

я пытаюсь сделать запрос с помощью Selenium:

from selenium import webdriver


driver = webdriver.Chrome()
driver.get('http://172.16.160.73/')
driver.execute_script("snapshot('/axis-media/media.amp?videocodec=h264');")

Но получаю ощибку что нет такого скрипта.

Я исследовал страницу открытую через selenium(driver) и обнаружил вот такие вот строки (в обычных браузерах этих строчек и этого кода нету):

<noscript>
Your browser has JavaScript turned off.<br>For the user interface to work, you must enable JavaScript in your browser and reload/refresh this page.
</noscript>

И последующий HTML-код отличный от обычного который я вижу в стандартном браузере. Пытался всячески "включить" javascript, но безуспешно. В открытой selenium`ом вкладке все как в обычном браузере (жмется открывается, скриншоты делаются, видеопоток идет). Подскажите это защита такая? или я что то не так делаю? Камера AXIS Q6032-E Network Camera


Ответы (1 шт):

Автор решения: Vladimir T

Во-первых, похоже, что вы не заметили эту строчку при обычном просмотре, но она всё-таки там есть - проверьте ещё раз. Эта строка просто работает только при отсутствии JS, но в коде страницы она есть всегда. Даже в stackoverflow вы можете её сейчас увидеть, если посмотрите код страницы (не inspect, а именно "код страницы").

Selenium по умолчанию поддерживает JS, и как раз, чтобы выключить его, нужны определённые манипуляции.

Надо помнить, что JS - язык асинхорнный по дизайну, и некоторые события происходят после определённого ожидания (иногда динамически подгружаются скрипты, некоторые функции требуют времени, срабатывают только после полной загрузки страницы, создают другие функции и т.д.), поэтому я бы вам советовал для начала использовать простое внешнее ожидание после загрузки страницы (перед выполнением js-кода):

sleep(10)

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

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

К примеру, если там работает jQuery, то можете использовать:

driver.execute_script("return jQuery.active == 0")

Подробнее по jQuery: https://stackoverflow.com/questions/51953967/using-selenium-wait-until-to-wait-some-query-finished-in-python

!!! UPD после комментариев - в вашем случае вам вообще нужен только скриншот (изображение), поэтому получайте его используя не javascript:snapshot, а родной API вашей камеры (используя обычный get):

http://axis-cgi/jpg/image.cgi?date=1&clock=1&camera=[CHANNEL]&resolution=[WIDTH]x[HEIGHT]

https://www.ispyconnect.com/man.aspx?n=Axis

→ Ссылка