Автоматизация Задач Часть 1
Usman_labСалам.
Каждую повседневную и много-повторяющуюся задачу, можно автоматизировать. Я хочу показать как автоматизировать задачи, связанные с браузером. Для этого вам понадобиться ПК или ноутбук.
Поехали.
Установка языка программирования Python.
Перейдите на python.org и скачайте установщик.


При установке нажать на две галочки снизу. А затем на Install Now. Разрешаем установку

Теперь перейдите на сайт sublimetext.com
И нажмите скачать, установите програмку

Установка программки легкая, как обычно просто установите.
Как только будет завершена установка
Перезагрузите ПК или ноут.
Готово!
Нажмите комбинацию клавиш (хоткей, горячие клавиши, одновременно) Win + R


Откроется диалоговое окно

И напишите CMD
У вас откроется черное окно (консоль/терминал)
Затем напишите команду :
pip install selenium

Нажмите Enter
Дождитесь установки, если все отлично у вас НЕ будет красной подсветки.
Затем можете закрывать консоль
У вас должен быть установлен браузер Chrome
Соответственно нам нужен еще chrome Driver
Скачать отсюда (официальный источник) - https://googlechromelabs.github.io/chrome-for-testing/
И нажать на Stable

У вас скачается ZIP архив пока не трогаем, сначала создайте папку с названием Project где удобно. Там-же создайте файл с названием и расширением таким main.py
А затем распакуйте ZIP в папку Project
Но чуть подредактируйте, должно выглядеть так:

На размеры не смотрите, они у вас будут другие.
Перейдите в файл main.py
Откройте его с помощью программки Sublime Text
Скопируйте то, что ниже, и вставьте в main.py
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException import os

Еще чуть ниже скопируйте и вставьте это:
service = Service(executable_path='./chromedriver.exe')
options = webdriver.ChromeOptions()
options.add_argument("--disable-infobars")
options.add_argument("--start-maximized")
options.add_argument("--disable-extensions")
options.add_argument('--log-level=3')
options.add_argument('--deny-permission-prompts')
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option('useAutomationExtension', False)
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('prefs', {"download.default_directory": f"{os.getcwd()}\\", "download.prompt_for_download": False, "download.directory_upgrade": True, "plugins.always_open_pdf_externally": True})
driver = webdriver.Chrome(service=service, options=options)
Пока что, сохраняем эти изменения, с помощью (хоткея/горячих клавиш) Ctrl + S
Изучаем функции, о том как перейти на сайт, нажать клавиши и кнопки, заполнить поля и так далее. И пока что не трогаем код
Первый метод который вам очень понадобиться:
driver.get("ссылка")
Это обращение к браузеру, чтоб он открыл ссылку.
Например:
driver.get("https://google.com")
Второй метод
Найти элемент и нажать по нему:
driver.find_element(By.CSS_SELECTOR, 'input[type="search"]').click()
После того как мы перешли на google.com мы говорим браузеру нажать на поле поиска, и задал адрес куда нажать. Но как я узнал этот адрес?
Разбираем:
Открываем код сайта (клавиша F12)

Выделяю поисковое поле, смотрю из чего он состоит.
Это стандартный тег input с:
айди-шником/id = "input"
классом/class = "truncate"
типом/type = "search"
и т.д.
Мне удобнее взять CSS селектором, а именно, нам нужен input с type (типом) = "search".
Так и написал в примере выше, и еще раз продублирую снизу:
By.CSS_SELECTOR, 'input[type="search"]'
Существуют и другие способы задать путь к элементу, но об этом во второй части, будет. (следите за каналом)
Третий метод
Давайте попробуем теперь туда (в поисковую строку/поле) написать наше поисковое слово/слова. Для этого нам сначала необходимо засунуть предыдущий скрипт в переменную и уже отдельно нажать.
Проще сказать, заполнить поле.
Было:
driver.find_element(By.CSS_SELECTOR, 'input[type="search"]').click()
Тут как видим, мы нашли элемент и сразу кликнули .click()
Стало:
element = driver.find_element(By.CSS_SELECTOR, 'input[type="search"]')
element.click()
# Это добавим
element.send_keys("Слово, которое ищем в гугле")
Здесь, просто взяли элемент в переменную element а на второй строчке, обратились к элементу и нажали его, а дальше я послал некое поисковое слово/слова, и автоматом нажалось Enter. После чего, Гугл мне успешно начал поиск.
На этом все, нам НЕ надо нажимать Enter, так как send_keys делает это за нас в большинстве случаев.
Четвертый метод
Такой же driver.find_element() НО:
с окончанием s
То есть, вот так -> driver.find_elements()
Отличается он только тем, что ищет сразу несколько элементов.
Затем мы можем их брать по отдельности, и работать с каждым.
Например, возьмем все теги a с сайта:
elements = driver.find_elements(By.CSS_SELECTOR, 'a')
Этот метод ищет все теги a и возвращает их в объект elements
Мы можем взять каждую ссылку, из всех найденных тегов a
Вот так:
linkS = list() # Создаем объект список, куда будем записывать ссылки
for link in elements: # Берем каждый элемент
linkS.append(link.get_attribute('href')) # И вытаскиваем ссылку из каждого, записывая в список linkS
Теперь все ссылки в обычном формате, собраны в список, дальше работаем с ними как хотим.
Пятый метод
Да, можно импортировать стандартную либу time для реализация ожидания загрузки веб-страницы, чтоб только после загрузки страницы, с ней работать.
НО
Во первых, явное указание времени ожидания, а мы знаем что веб-страницы загружаются либо быстро, либо долго. Поэтому если мы укажем явно, что программка будет ждать 5 секунд, то страница может не успеть загрузиться, в итоге будет ошибка, или наоборот, будет потрачено время на ожидание, в то время как страница уже давно загрузилась.
Во вторых, в selenium есть свой метод для ожидания когда, страница загрузиться, и затем будут выполнены действия.
Вот он:
wait = WebDriverWait(driver, 300) wait.until(EC.visibility_of_element_located())
Он блокирует дальнейшее исполнение кода, до тех пор, пока элемент не станет видимым, т.е. страница загружена.
Внутри скобок visibility_of_element_located() помещаем элемент со скобками.
Например:
wait = WebDriverWait(driver, 300) wait.until(EC.visibility_of_element_located(By.CSS_SELECTOR, 'input[type="search"]'))
Объясняю:
Мы создали объект WebDriverWait засунув туда наш driver с которым работаем и вторым параметром указали дефолтное значение (для новичков, не важно для чего). Затем у этого объекта вызываем метод until , дословно теперь переводиться как, "ждать до тех пор пока", дальше у нас visibility_of_element_located "пока элемент не станет видимым", затем в скобках скобки с указанием пути к этому элементу.
Супер-подробно 👍
Я рассказал базовые методы selenium, и показал это на примере языка программирования Python.
Во второй части, я хочу описать все это, более подробно, а также разобрать на каком-нибудь конкретном примере.