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 шт):
Во-первых, похоже, что вы не заметили эту строчку при обычном просмотре, но она всё-таки там есть - проверьте ещё раз. Эта строка просто работает только при отсутствии 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]