Работа с Selenium в Jupyter Notebook, запущенном в Docker

Инструкция по настройке и проверке работы Selenium в Jupyter Notebook, запускаемом в Docker контейнере в Window 7.

Настройка и запуск

  • Добавить в используемый Dockerfile c python строки:
pip install selenium
pip install webdriver-manager

Для тестового запуска подойдет Dockerfile:

FROM jupyter/base-notebook

RUN pip install jupytext
RUN pip install selenium webdriver-manager
  • В docker-compose.yaml добавить сервис с Selenium:
  browser:
    image: selenium/standalone-chrome
    ports:
      - "4444:4444"

Для проверки работоспособности можно воспользоваться приведенным docker-compose.yaml (дополнительно содержится инструкции по отображению папки содержащей проект и папки с настроенной конфигурацией  Jupyter Notebook для поддержки сохранения в git):

version: "3"

services:
  python-server:
    build: ./python
    ports:
      - "8888:8888"
    volumes:
      - /PATH_TO_YOU_CODE_FOLDER_FROM_SHARE_DIR://home/jovyan/work
      - /PATH_TO_YOU_CONFIG_FOLDER_FROM_SHARE_DIR://home/jovyan/.jupyter
      
  browser:
    image: selenium/standalone-chrome
    ports:
      - "4444:4444"
  • Для запуска выполнить:
docker-compose up -d

Пример кода, открывающего страницу в Selenium

Для проверки достаточно кода:

from selenium import webdriver

pDriver = webdriver.Remote( "http://browser:4444/wd/hub", options=webdriver.ChromeOptions()  )

sSourceUrl = "http://google.com"
pDriver.get( sSourceUrl )

Важно: в sSourceUrl должен быть указан протокол (в примере http), без него код работать не будет.

Данный кода приведен для версии 4.2.*, возможно в более ранних или поздних версиях потребуются изменения. Узнать версию можно выполнив:

import selenium    
help (selenium)
версия Selenium

Как узнать что делает код

  • Определить адрес, по которому доступен контейнер:
docker-machine ip
  • Набрать в браузере:
IP:4444

Откроется окно:

общий вид Selenium
  • Перейти в раздел «Sessions», и выбрать интересующую «Сессию» из доступных:
выбор сессии в Selenium
  • В открывшемся окне, ввести в качестве пароля «secret»:
ввод пароля для доступа к сессии в Selenium
  • После этого можно наблюдать за тем что происходит:
открываемая страница в Selenium

Как избавиться от необходимости постоянного ввода пароля при просмотре сессии

Для этого в переменные окружения контейнера с Selenium потребуется добавить строку:

VNC_NO_PASSWORD: 1

Пример файла в котором отключен ввод пароля:

version: "3"

services:
  python-server:
    build: ./python
    ports:
      - "8888:8888"
    volumes:
      - /PATH_TO_YOU_CODE_FOLDER_FROM_SHARE_DIR://home/jovyan/work
      - /PATH_TO_YOU_CONFIG_FOLDER_FROM_SHARE_DIR://home/jovyan/.jupyter
      
  browser:
    image: selenium/standalone-chrome
    ports:
      - "4444:4444"
    environment:
      VNC_NO_PASSWORD: 1

Что еще понадобится для автоматизации

  • Для выбора элементов на странице потребуется: составлять выражения XPath
  • Для устранения опечаток в выражениях XPath может пригодиться отладка