Рубрики
Без рубрики

Автоматизация браузера с помощью Docker и Python

Несколько недель назад я работал над новым отчетом игры клиента. Платформа, которая предоставляет кампу … Теги с Python, Selenium, Docker.

Несколько недель назад я работал над новым отчетом игры клиента. Платформа, предоставляющая сообщения о кампании, не имеет публичных API для создания отчетов о кампании по запросу с любым видом ключа разработчика для доступа.

Но можно запросить такие отчеты, используя их приборную панель. Я знаю, что это немного странно полагаться на UI для загрузки таких отчетов Но это был единственный способ получить доступ к ценным данным клиента.

Давайте определим требования к этой идее:

  • Должен быть автономным сценарием Python для легкого выполнения и интеграции с существующими библиотеками ETL
  • не должно требовать дополнительного программного обеспечения на сервере, кроме пакета Docker (это довольно гибко)

Сейчас мы готовы попробовать и построить что-то бегаемое. В этом сообщении будет использоваться конкретные библиотеки для получения доступа к процессу докена из-за конкретной версии установленного пакета в CentOS (в моем примере).

Мои требования. Atxt:

docker==2.1.0
splinter==0.7.7
timeout-decorator==0.3.3

Splinter Хорошая библиотека завершает драйверы браузера при автоматизации чего-либо на страницах.

Давайте определим класс для бега Google Chrome Контейнер, позже мы будем использовать, прежде чем получить доступ к странице через Splinter библиотека.

class _ChromeContainer:
    '''
    _ChromeContainer should handle run of chrome docker container
    on background.

    Requires to have docker service on machine to pull images
    and run images.
    '''
    def __init__(self):
        self.__image_name = "selenium/standalone-chrome:3.10.0"
        self.__client = docker.from_env()

    def run(self):
        '''
        Startup docker container with chromedriver, waiting for running state
        '''
        client = self.__client

        self.container = client.containers.run(self.__image_name,
                                               detach=True,
                                               ports={'4444/tcp': None})

        @timeout_decorator.timeout(120)
        def waiting_up(client: docker.client.DockerClient, container):
            while True:
                container.reload()
                if container.status == "running":
                    break
                time.sleep(1)

        waiting_up(client, self.container)

    def quit(self):
        '''
        kills and deletes named container
        '''
        self.container.kill()

    @property
    def public_port(self):
        container = self.__chrome_container.container
        return container.attrs["NetworkSettings"]["Ports"]["4444/tcp"][0]["HostPort"]

Теперь мы готовы использовать Splinter и AHD _ChromeContainer автоматизировать вашу задачу.

import timeout_decorator
import docker


from splinter import Browser


class Worker:
    def __init__(self):
        self.__chrome_container = _ChromeContainer()

    def process(self):
        self.__chrome_container.run()

        self.__web_client = Browser('remote',
                                    url="http://127.0.0.1:{}/wd/hub".format(self.__chrome_container.public_port),
                                    browser='chrome')

        # Example for login request:
        try:
            self.__login()
        finally:
            self.__web_client.quit()
            self.__chrome_container.quit()

    def __login(self):
        self.__web_client.visit("http://www.example.com/login")
        self.__web_client.fill('developer_session[email]', 'EXAMPLE_USERNAME')
        self.__web_client.fill('developer_session[password]', 'EXAMPLE_PASSWORD')
        button = self.__web_client.find_by_id('developer_session_submit')
        button.click()

Это пример, и это возможно продлить подобные шаги, такие как __Login В вашем Рабочий класс.

Спасибо за чтение!:)

Оригинал: “https://dev.to/oivoodoo/browser-automation-using-docker-and-python-2j2o”