Как установить chromedriver на windows



Скачай курс
в приложении
Перейти в приложение
Открыть мобильную версию сайта
© 2013 — 2023. Stepik
Наши условия использования и конфиденциальности

Public user contributions licensed under cc-wiki license with attribution required
Установка драйвера chromedriver для Chrome Selenium

Для запуска тестов Selenium в Google Chrome, помимо самого браузера Chrome, должен быть установлен ChromeDriver. Установить ChromeDriver очень просто, так как он находится в свободном доступе в Интернете. Загрузите архив в зависимости от операционной системы, разархивируйте его и поместите исполняемый файл chromedriver в нужную директорию.
Какую версию chromedriver установить?
Мы должны установить именно ту версия которая была бы совместима с установленным Google Chrome на нашем ПК или VDS. В случае, если версии не совпадают, то мы получим данную ошибку:
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 81
Введите в адресную строку Google Chrome данный путь:
chrome : / / settings / help
У вас появится вот такое окно:

Рисунок 1 — Узнаем версию браузера Google Chrome
Скачать ChromeDriver для Linux, Windows и Mac
На данный момент актуальная версия драйвера 81.0.40 хотя у меня установлен более старый Google Chrome и последняя версия мне не подойдет. Как видно на рисунке выше, мне нужна версия 79.0.39 у вас может быть другая версия, нужно её скачать.

Рисунок 2 — Официальный сайт Google для загрузки драйвера chromedriver
На момент прочтения этой статьи версия может быть другой. Всегда выбирайте более новую версию, чтобы не поймать старые баги которые уже давно исправили в новой версии. НО! Помните, что вам нужно обновить и свой браузер Google Chrome если вы хотите работать с новой версией ChromeDriver.
Установка ChromeDriver под Linux, Windows и Mac
- Заходим на сайт https://chromedriver.storage.googleapis.com/index.html?path=79.0.3945.36/ (Проверьте сайт с Рис. 2 на обновления, тут версия: 79.0.3945);
- Скачиваем архив под вашу операционную систему;
- Распаковываем файл и запоминаем где находится файл chromedriver или chromedriver.exe (Windows).

Рисунок 3 — Скаченный архив с ChromeDriver
Если у вас Linux дистрибутив или Mac, вам нужно дать файлу chromedriver нужные права на выполнения. Открываем терминал и вводим команды одна за другой.
Как установить Chrome в Windows без использования другого браузера
Большинство пользователей Windows предпочитает устанавливать свой любимый веб-браузер после покупки нового компьютера или переустановки Windows. Но не все знают, что можно установить браузер, не используя другой. Как это сделать?

1. Через менеджер пакетов Winget
Winget — это менеджер пакетов, который позволяет загружать или обновлять любое приложение, введя простую команду. Выполните следующие действия, чтобы использовать Winget для установки браузера.
- Нажмите Win+R и введите «cmd».
- В новом окне введите «winget», «install» и название программного обеспечения:
winget install Google.Chrome
2. С помощью справки Microsoft HTMLHelp
Если вы не хотите использовать менеджер пакетов, то можно попробовать Microsoft HTML Help — исполняемую программу, которая работает аналогично браузеру и есть в любой версии Windows.
- Просто нажмите Win+R и введите «cmd», либо наберите «cmd» в Поиске Windows, затем введите hh http://google.com.
- Откроется веб-страница Google, через которую можно загрузить веб-браузер. Нажмите «Еще» в левом верхнем углу и скачайте его.
3. Через команду cURL
cURL (client URL) позволяет загружать файлы напрямую из интернета с помощью PowerShell.
- Найдите PowerShell через поиск Windows и запустите от имени администратора.
- Введите команду cd Desktop, чтобы указать команде cURL сохранять файлы на рабочем столе.
- Введите следующую команду: curl -L «http://link.com» -o download.exe
Microsoft Store — способ для установки других браузеров
Раньше из Microsoft Store можно было загружать только приложения UWP, специально разработанные для этого магазина. Сейчас оттуда возможно скачивать большинство браузеров и другое ПО, хотя именно Google Chrome там все еще недоступен. Поэтому. если вам нужен другой браузер, можете воспользоваться поиском в фирменном магазине.
Статья [Selenium] Установка, запуск и реальное применение. Part Ⅰ
В статье я расскажу, как можно управлять браузером, используя фреймворк Selenium. Этот фреймворк позволяет имитировать реальный браузер, управление которым будет происходить с помощью кода. Также, Selenium подходит для тестирования Web-приложений, решения рутинных задач: извлечение информации (парсинг) и др. Фреймворк написан на языке Java и был опубликован в 2004-ом разработчиком Jason Huggins.
- Установке Selenium и так же веб-драйвера;
- Использовать веб-локатор;
- Написанию программы для взаимодействие с форумом Codeby.
| Chromium/Google Chrome | Windows/macOS/Linux | |
| Firefox | Windows/macOS/Linux | Mozilla |
| Microsoft Edge | Windows 10 | Microsoft |
| Internet Explorer | Windows | Selenium Project |
| Safari | macOS El Capitan и более новые | Apple |
| Opera | Windows/macOS/Linux | Opera |
Библиотека Selenium есть на следующих языках: Java, Python, Kotlin, JavaScript и т.п.
Установка Selenium
Итак, для установки Selenium воспользуемся командой:
pip install selenium
Доступно в
Ссылка скрыта от гостей
Это ещё не всё. Для Selenium нужны веб-драйвера, чтобы запускать нужный браузер при запуске.
Для браузера Chrome:
Chromedriver в Windows
Устанавливаем драйвер Chromdriver для Windows
Chromedriver — драйвер для запуска браузера Chrome.
Драйвер должен иметь ту версиею Chrome, которая у вас установлена. Чтобы узнать версию вашего браузера, перейдите в Настройки -> О браузере Chrome:
Отлично, мы узнали версию браузера. Значит, нам нужен драйвер с версией 106. Чтобы установить Chromedriver переходим на сайт —
Ссылка скрыта от гостей
На сайте вы увидите две версии Chrome 107: beta & stable. Это новая версия драйвера Chrome. Этот драйвер будет работать у вас только в том случае, если браузер имеет такую же версию. Для просмотра всех версий нажимаем на кнопку Downloads, как показано на скрине:
Скачиваем ChromeDriver 106:
Супер! Файл chromedriver.exe можно оставить в любом каталоге нашей системы. В дальнейшем нам придётся указывать путь.
Chromedriver в Linux
Устанавливаем драйвер Chromdriver в Linux
Здесь не так уж и сложно. Чтобы установить драйвер Chrome на Linux, переходим на сайт
Ссылка скрыта от гостей
, спускаемся ниже и выбираем версию, совместимой с вашей версией браузера Google Chrome.
Затем скачиваем архив chromedriver_linux64.zip , открываем терминал и вводим:
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/chromedriver
sudo chown root:root /usr/local/bin/chromedriver
sudo chmod +x /usr/local/bin/chromedriver
Для браузера Firefox:
Geckodriver в Windows
Устанавливаем драйвер Geckodriver в Windows
Geckodriver — драйвер для запуска Firefox. Установка чуть-чуть отличается.
Для скачивания geckodriver переходим на GitHub — тыц
Версия драйвера должна совместима с версией браузера Firefox.
В моём случаю я устанавливаю geckodriver-v0.32.0-win64.zip . После скачивания распакуйте архив и оставьте geckodriver.exe в любой директории системы. В дальнейшем нам придётся указывать путь.
Geckodriver в Linux
Устанавливаем драйвер Geckodriver в Linux
Скажу одно: в Linux по умолчанию установлен geckodriver для Firefox, даже не нужно указывать путь к нему.
Но. если он у вас по каким-то причинам не установлен, переходим и скачиваем архив для Linux.
Ссылка скрыта от гостей
Алгоритм работы
Алгоритм работы
На скриншоте показан алгоритм работы нашей будущей программы. После запуска Selenium ищет путь веб-драйвера и, при успехе, открывает сайт Codeby.net.
О веб-локаторах
На самом деле это очень важна тема, без них мы не сможем управлять страницей при помощи Selenium. Что же вообще такое веб-локаторы? Это простые элементы на HTML-странице, которые мы сможем выбирать и выполнять нужной действие. Например, нажатие кнопки: чтобы нажать на кнопку нам нужно выбрать элемент, а именно — веб-локатор, который Selenium сможет найти. Если локатор найден, то Selenium продолжает свою работу.
Пример нажатия кнопки сервисы Codeby
Чтобы Selenium смог нажать накнопку нам необходимо получить веб-локатор, для этого открываем Инструменты разработчика в браузере:
Выбрали, теперь нам нужно получить веб-локатор (XPATH) для HTML-тэга .
Что такое XPATH? Это веб-локатор, который можно применять в Selenium. Кроме XPATH существует и другие типы веб-локаторов: outerHtml, Element, Full Xpath и т.п
Переходим к кодингу.
- Указать путь к драйверу для запуска браузера
- Указать ссылку на сайт, который будет открывать Selenium
- Найти веб-локаторы кнопки Сервисы Codebyи кликнуть на неё, а затем нажать на Пентест.
- Бинго!
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service
Определяем библиотеки: time нужно для задержки, чтобы страница успела загрузиться. Selenium.by предназначен для нахождения и определения веб-локаторов.
На примере я буду использовать ООП, для меня он понятнее. Создаем класс под название ButtonCodeby .
class ButtonCodeby: pass
def __init__(self, executable_path: str): self.url = 'https://codeby.net' self.service = '//*[@id="top"]/div[1]/div/div[1]/div/a' self.pentest = '/html/body/div[5]/div/a[2]' self.browser = webdriver.Chrome(service=Service(executable_path=executable_path))
Для конструктора __init__ определяем атрибуты. В качестве параметра он принимает сам путь драйвера который нам придется указать в конце.
self.url — принимает ссылку на сайт, в нашем случае codeby
self.service — принимает веб-локатор XPATH, кнопка «Сервисы Codeby»
self.pentest — принимает веб-локатор XPATH, кнопка «Пентест»
self.browser — когда путь драйвера будет указан, всё это выполнится.
Создаём функцию [ go_codeby ]
def go_codeby(self): print(f'Переход на страницу ') self.browser.get(self.url)
Функция go_codeby — переходит на сайт Codeby с помощью browser.get.
Создаём функцию [ service_codeby ]
def service_codeby(self): self.browser.find_element(By.XPATH, self.service).click() time.sleep(0.5)
Функция service_codeby выполнят нажатие на кнопку Сервисы Codeby.
Создаём функцию [ pentest_codeby ]
def pentest_codeby(self): self.browser.find_element(By.XPATH, self.pentest).click() time.sleep(5) self.browser.quit()
Функция pentest_codeby — нажимает на кнопку Пентест, затем выходим с браузера.
И последний штрих
def start_click(self): self.go_codeby() self.service_codeby() self.pentest_codeby() btn_cod = ButtonCodeby('/сhromedriver/chromedriver.exe')
Функция start_click — выполняет все функции, которые мы написали выше. В конце мы создаем переменную btn_cod, которая необходима для запуска браузера с определенным путем драйвера.
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service class ButtonCodeby: def __init__(self, executable_path: str): self.url = 'https://codeby.net' self.service = '//*[@id="top"]/div[1]/div/div[1]/div/a' self.pentest = '/html/body/div[5]/div/a[2]' self.browser = webdriver.Chrome(service=Service(executable_path=executable_path)) def go_codeby(self): print(f'Переход на страницу ') self.browser.get(self.url) def service_codeby(self): self.browser.find_element(By.XPATH, self.service).click() time.sleep(0.5) def pentest_codeby(self): self.browser.find_element(By.XPATH, self.pentest).click() time.sleep(5) self.browser.quit() def start_click(self): self.go_codeby() self.service_codeby() self.pentest_codeby() btn_cod = ButtonCodeby('/chromedriver/chromedriver.exe')
интересное
Лекарство селениум, от боли суставы и многое другое.
Важные ссылки
Документация Selenium python3 —
Ссылка скрыта от гостей
Что такое вебдрайвера — тык
Нашли ошибку в коде или тексте? Сообщите!
Последнее редактирование: 20.11.2022
dream to perfection
Well-known member
Green Team
- Сообщения 59
- Реакции 35
Mark Klintov
Grey Team
23.07.2022 151 269 BIT 1
Идея хорошая для статьи, но очень мало. Хочется видеть больше примеров работы. Лично я не понял для чего нужен этот модуль, ведь открыть ссылку в браузере можно при помощи того же
Ссылка скрыта от гостей
. Могу помочь ссылкой на Habr, здесь ты сможешь черпать знания и принцип работы. Попробуй донести до читателя чем может помочь selenium на реальных примерах. Буду очень рад почитать разбор этого фреймворка)
dream to perfection
Green Team
11.06.2022 59 35 BIT 0
Идея хорошая для статьи, но очень мало. Хочется видеть больше примеров работы. Лично я не понял для чего нужен этот модуль, ведь открыть ссылку в браузере можно при помощи того же
Ссылка скрыта от гостей
. Могу помочь ссылкой на Habr, здесь ты сможешь черпать знания и принцип работы. Попробуй донести до читателя чем может помочь selenium на реальных примерах. Буду очень рад почитать разбор этого фреймворка)
Большое спасибо за такой ответ. Да, я понял что данная статья не очень подробная.
Ожидайте вторую часть!
Dzen
Codeby Games
Gold Team
16.04.2021 354 418 BIT 35
Большое спасибо за такой ответ. Да, я понял что данная статья не очень подробная.
Ожидайте вторую часть!
Думаю, лучше продолжить данную статью, нежели делать вторую часть. Дополняйте. Лучше одна ёмкая статья, чем много обрывистых заметок )
dream to perfection
Green Team
11.06.2022 59 35 BIT 0
Статья обновлена!
Johan Van
Green Team
13.06.2020 344 638 BIT 39
Привет, Codeby!
В статье я расскажу, как можно управлять браузером, используя фреймворк Selenium. Этот фреймворк позволяет имитировать реальный браузер, управление которым будет происходить с помощью кода. Также, Selenium подходит для тестирования Web-приложений, решения рутинных задач: извлечение информации (парсинг) и др. Фреймворк написан на языке Java и был опубликован в 2004-ом разработчиком Jason Huggins.
- Установке Selenium и так же веб-драйвера;
- Использовать веб-локатор;
- Написанию программы для взаимодействие с форумом Codeby.
| Chromium/Google Chrome | Windows/macOS/Linux | |
| Firefox | Windows/macOS/Linux | Mozilla |
| Microsoft Edge | Windows 10 | Microsoft |
| Internet Explorer | Windows | Selenium Project |
| Safari | macOS El Capitan и более новые | Apple |
| Opera | Windows/macOS/Linux | Opera |
Библиотека Selenium есть на следующих языках: Java, Python, Kotlin, JavaScript и т.п.
Установка Selenium
Итак, для установки Selenium воспользуемся командой:
pip install selenium
Доступно в
Ссылка скрыта от гостей
Это ещё не всё. Для Selenium нужны веб-драйвера, чтобы запускать нужный браузер при запуске.
Для браузера Chrome:
Chromedriver в Windows
Устанавливаем драйвер Chromdriver для Windows
Chromedriver — драйвер для запуска браузера Chrome.
Драйвер должен иметь ту версиею Chrome, которая у вас установлена. Чтобы узнать версию вашего браузера, перейдите в Настройки -> О браузере Chrome:
Отлично, мы узнали версию браузера. Значит, нам нужен драйвер с версией 106. Чтобы установить Chromedriver переходим на сайт —
Ссылка скрыта от гостей
На сайте вы увидите две версии Chrome 107: beta & stable. Это новая версия драйвера Chrome. Этот драйвер будет работать у вас только в том случае, если браузер имеет такую же версию. Для просмотра всех версий нажимаем на кнопку Downloads, как показано на скрине:
Скачиваем ChromeDriver 106:
Супер! Файл chromedriver.exe можно оставить в любом каталоге нашей системы. В дальнейшем нам придётся указывать путь.
Chromedriver в Linux
Устанавливаем драйвер Chromdriver в Linux
Здесь не так уж и сложно. Чтобы установить драйвер Chrome на Linux, переходим на сайт
Ссылка скрыта от гостей
, спускаемся ниже и выбираем версию, совместимой с вашей версией браузера Google Chrome.
Затем скачиваем архив chromedriver_linux64.zip , открываем терминал и вводим:
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/chromedriver
sudo chown root:root /usr/local/bin/chromedriver
sudo chmod +x /usr/local/bin/chromedriver
Для браузера Firefox:
Geckodriver в Windows
Устанавливаем драйвер Geckodriver в Windows
Geckodriver — драйвер для запуска Firefox. Установка чуть-чуть отличается.
Для скачивания geckodriver переходим на GitHub — тыц
Версия драйвера должна совместима с версией браузера Firefox.
В моём случаю я устанавливаю geckodriver-v0.32.0-win64.zip . После скачивания распакуйте архив и оставьте geckodriver.exe в любой директории системы. В дальнейшем нам придётся указывать путь.
Geckodriver в Linux
Устанавливаем драйвер Geckodriver в Linux
Скажу одно: в Linux по умолчанию установлен geckodriver для Firefox, даже не нужно указывать путь к нему.
Но. если он у вас по каким-то причинам не установлен, переходим и скачиваем архив для Linux.
Ссылка скрыта от гостей
Алгоритм работы
Алгоритм работы
На скриншоте показан алгоритм работы нашей будущей программы. После запуска Selenium ищет путь веб-драйвера и, при успехе, открывает сайт Codeby.net.
О веб-локаторах
На самом деле это очень важна тема, без них мы не сможем управлять страницей при помощи Selenium. Что же вообще такое веб-локаторы? Это простые элементы на HTML-странице, которые мы сможем выбирать и выполнять нужной действие. Например, нажатие кнопки: чтобы нажать на кнопку нам нужно выбрать элемент, а именно — веб-локатор, который Selenium сможет найти. Если локатор найден, то Selenium продолжает свою работу.
Пример нажатия кнопки сервисы Codeby
Чтобы Selenium смог нажать накнопку нам необходимо получить веб-локатор, для этого открываем Инструменты разработчика в браузере:
Выбрали, теперь нам нужно получить веб-локатор (XPATH) для HTML-тэга .
Что такое XPATH? Это веб-локатор, который можно применять в Selenium. Кроме XPATH существует и другие типы веб-локаторов: outerHtml, Element, Full Xpath и т.п
Переходим к кодингу.
- Указать путь к драйверу для запуска браузера
- Указать ссылку на сайт, который будет открывать Selenium
- Найти веб-локаторы кнопки Сервисы Codebyи кликнуть на неё, а затем нажать на Пентест.
- Бинго!
import time from selenium import webdriver from selenium.webdriver.common.by import By
Определяем библиотеки: time нужно для задержки, чтобы страница успела загрузиться. Selenium.by предназначен для нахождения и определения веб-локаторов.
На примере я буду использовать ООП, для меня он понятнее. Создаем класс под название ButtonCodeby .
class ButtonCodeby: pass
def __init__(self, executable_path: str): self.url = 'https://codeby.net' self.service = '//*[@id="top"]/div[1]/div/div[1]/div/a' self.pentest = '/html/body/div[5]/div/a[2]' self.browser = webdriver.Chrome(executable_path=executable_path)
Для конструктора __init__ определяем атрибуты. В качестве параметра он принимает сам путь драйвера который нам придется указать в конце.
self.url — принимает ссылку на сайт, в нашем случае codeby
self.service — принимает веб-локатор XPATH, кнопка «Сервисы Codeby»
self.pentest — принимает веб-локатор XPATH, кнопка «Пентест»
self.browser — когда путь драйвера будет указан, всё это выполнится.
Создаём функцию [ go_codeby ]
def go_codeby(self): print(f'Переход на страницу ') self.browser.get(self.url)
Функция go_codeby — переходит на сайт Codeby с помощью browser.get.
Создаём функцию [ service_codeby ]
def service_codeby(self): self.browser.find_element(By.XPATH, self.service).click() time.sleep(0.5)
Функция service_codeby выполнят нажатие на кнопку Сервисы Codeby.
Создаём функцию [ pentest_codeby ]
def pentest_codeby(self): self.browser.find_element(By.XPATH, self.pentest).click() time.sleep(5) self.browser.quit()
Функция pentest_codeby — нажимает на кнопку Пентест, затем выходим с браузера.
И последний штрих
def start_click(self): self.go_codeby() self.service_codeby() self.pentest_codeby() btn_cod = ButtonCodeby(''/сhromedriver/chromedriver.exe'')
Функция start_click — выполняет все функции, которые мы написали выше. В конце мы создаем переменную btn_cod, которая необходима для запуска браузера с определенным путем драйвера.
import time from selenium import webdriver from selenium.webdriver.common.by import By class ButtonCodeby: def __init__(self, executable_path: str): self.url = 'https://codeby.net' self.service = '//*[@id="top"]/div[1]/div/div[1]/div/a' self.pentest = '/html/body/div[5]/div/a[2]' self.browser = webdriver.Chrome(executable_path=executable_path) def go_codeby(self): print(f'Переход на страницу ') self.browser.get(self.url) def service_codeby(self): self.browser.find_element(By.XPATH, self.service).click() time.sleep(0.5) def pentest_codeby(self): self.browser.find_element(By.XPATH, self.pentest).click() time.sleep(5) self.browser.quit() def start_click(self): self.go_codeby() self.service_codeby() self.pentest_codeby() btn_cod = ButtonCodeby('/chromedriver/chromedriver.exe')
интересное
Лекарство селениум, от боли суставы и многое другое.
Важные ссылки
Документация Selenium python3 —
Ссылка скрыта от гостей
Что такое вебдрайвера — тык
Нашли ошибку в коде или тексте? Сообщите!
Всем доброго времени суток. Хотелось бы сказать несколько слов по поводу кода, который приведен в статье. Я понимаю, что автор еще больший новичок, чем я, потому, это, скажем так, небольшое дружеское код-ревью.
Начнем с самого простого. Способ, с помощью которого указывается путь к драйверу, именно в том виде, что у автора в статье:
self.browser = webdriver.Chrome(executable_path=executable_path)
на данный момент является устаревшим. Об этом явно свидетельствует warning, который появляется каждый раз при запуске кода.
Для того, чтобы правильно указывать путь, в данный момент, необходимо импортировать модуль Service, в котором уже и указывается путь к браузеру и прочие необходимые параметры. Для того, чтобы импортировать его в код нужно прописать в блоке импорта дополнительную строку:
from selenium.webdriver.chrome.service import Service
А также заменить в коде строку, где создается объект драйвера. То есть, вот это:
self.browser = webdriver.Chrome(executable_path=executable_path)
нужно заменить вот на это:
self.browser = webdriver.Chrome(service=Service(executable_path=executable_path))
Таким образом, блок импорта и функция инициализации класса при этом будут выглядеть следующим образом:
Блок импорта и инициализации класса
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service class ButtonCodeby: def __init__(self, executable_path: str): self.url = 'https://codeby.net' self.service = '//*[@id="top"]/div[1]/div/div[1]/div/a' self.pentest = '/html/body/div[5]/div/a[2]' self.browser = webdriver.Chrome(service=Service(executable_path=executable_path))
Двигаемся дальше. Разделение кода на функции, в данном контексте, совершенно излишне. Так как, при разделении кода, каждая функция класса будет считаться его методом. А, следовательно, ее можно было бы выполнить отдельно от других функций без задействования других методов. Здесь же это не так. А, следовательно, указание функции под каждое отдельное действие излишне. Для примера, попробуем запустить функцию service_codeby(self). И мы сразу же ловим исключение, которое говорит о том, что элемент, по которому пытается произвести клик драйвер, не найден.
Равно как и запуск функции pentest_codeby(self) в отрыве от остальных не имеет смысла, ибо он так же вызовет исключение, в котором будет говориться, что искомый элемент не найден.
Более того, запуск pentest_codeby(self) в отрыве от функции service_codeby(self) будет бессмысленным. Дело в том, что меню, по которому пытается выполнить клик данный код, подгружается динамически. И, пока не будет выполнен клик по предыдущему элементу, драйвер никогда не найдет код, на который ссылается данная функция. Вот для примера класс, который нужно найти, чтобы выполнить клик на кнопку. Данный класс появился уже после того, как меню было раскрыто:
Попробуем поискать данный класс до того, как мы раскрыли меню:
Как видим, совпадений не найдено. А теперь раскроем меню и повторим поиск:
Так вот, следовательно, разделять код нажатия на выпадающее меню, а также нажатия на кнопку в этом меню на отдельные функции не имеет смысла, так как они не будут работать по отдельности. Более того, даже код перехода на страницу сайта, также следует объединить с кодом клика по меню и кнопке. Так как, выполнение отдельно перехода на сайт, может быть и имеет смысл, и будет выполнено. А вот уже клики по меню и кнопке, без перехода на сайт, явно нет. Таким образом, если уж не отрываться от класса, который представлен в коде, весь код перехода и кликов можно свести к одной функции. Значит, в итоге код будет выглядеть так:
Измененный код
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service class ButtonCodeby: def __init__(self, executable_path: str): self.url = 'https://codeby.net' self.service = '//*[@id="top"]/div[1]/div/div[1]/div/a' self.pentest = '/html/body/div[5]/div/a[2]' self.browser = webdriver.Chrome(service=Service(executable_path=executable_path)) def go_codeby(self): print(f'Переход на страницу ') self.browser.get(self.url) self.browser.find_element(By.XPATH, self.service).click() time.sleep(0.5) self.browser.find_element(By.XPATH, self.pentest).click() time.sleep(5) self.browser.quit()
Ну и запустить его можно будет с помощью такой вот конструкции:
Ну и немного еще про класс. Использование класса в данном случае можно, но является несколько бессмысленной тратой времени, хотя бы потому, что при парсинге может банально измениться код на странице. Следовательно, класс, который призван упростить создание своих экземпляров на его основе, просто не будет работать, так как в нем жестко прописаны элементы, которые необходимо найти. Но, это так, мелочи. Если автору хочется использовать класс — почему бы нет. Тем более, в данном случае все будет работать как с ним, так и без него.
На этом все. Такое вот, небольшое лирическое отступление.
Последнее редактирование: 17.11.2022
dream to perfection
Green Team
11.06.2022 59 35 BIT 0
Всем доброго времени суток. Хотелось бы сказать несколько слов по поводу кода, который приведен в статье. Я понимаю, что автор еще больший новичок, чем я, потому, это, скажем так, небольшое дружеское код-ревью.
Начнем с самого простого. Способ, с помощью которого указывается путь к драйверу, именно в том виде, что у автора в статье:
self.browser = webdriver.Chrome(executable_path=executable_path)
на данный момент является устаревшим. Об этом явно свидетельствует warning, который появляется каждый раз при запуске кода.
Для того, чтобы правильно указывать путь, в данный момент, необходимо импортировать модуль Service, в котором уже и указывается путь к браузеру и прочие необходимые параметры. Для того, чтобы импортировать его в код нужно прописать в блоке импорта дополнительную строку:
from selenium.webdriver.chrome.service import Service
А также заменить в коде строку, где создается объект драйвера. То есть, вот это:
self.browser = webdriver.Chrome(executable_path=executable_path)
нужно заменить вот на это:
self.browser = webdriver.Chrome(service=Service(executable_path=executable_path))
Таким образом, блок импорта и функция инициализации класса при этом будут выглядеть следующим образом:
Блок импорта и инициализации класса
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service class ButtonCodeby: def __init__(self, executable_path: str): self.url = 'https://codeby.net' self.service = '//*[@id="top"]/div[1]/div/div[1]/div/a' self.pentest = '/html/body/div[5]/div/a[2]' self.browser = webdriver.Chrome(service=Service(executable_path=executable_path))
Двигаемся дальше. Разделение кода на функции, в данном контексте, совершенно излишне. Так как, при разделении кода, каждая функция класса будет считаться его методом. А, следовательно, ее можно было бы выполнить отдельно от других функций без задействования других методов. Здесь же это не так. А, следовательно, указание функции под каждое отдельное действие излишне. Для примера, попробуем запустить функцию service_codeby(self). И мы сразу же ловим исключение, которое говорит о том, что элемент, по которому пытается произвести клик драйвер, не найден.
Равно как и запуск функции pentest_codeby(self) в отрыве от остальных не имеет смысла, ибо он так же вызовет исключение, в котором будет говориться, что искомый элемент не найден.
Более того, запуск pentest_codeby(self) в отрыве от функции service_codeby(self) будет бессмысленным. Дело в том, что меню, по которому пытается выполнить клик данный код, подгружается динамически. И, пока не будет выполнен клик по предыдущему элементу, драйвер никогда не найдет код, на который ссылается данная функция. Вот для примера класс, который нужно найти, чтобы выполнить клик на кнопку. Данный класс появился уже после того, как меню было раскрыто:
Попробуем поискать данный класс до того, как мы раскрыли меню:
Как видим, совпадений не найдено. А теперь раскроем меню и повторим поиск:
Так вот, следовательно, разделять код нажатия на выпадающее меню, а также нажатия на кнопку в этом меню на отдельные функции не имеет смысла, так как они не будут работать по отдельности. Более того, даже код перехода на страницу сайта, также следует объединить с кодом клика по меню и кнопке. Так как, выполнение отдельно перехода на сайт, может быть и имеет смысл, и будет выполнено. А вот уже клики по меню и кнопке, без перехода на сайт, явно нет. Таким образом, если уж не отрываться от класса, который представлен в коде, весь код перехода и кликов можно свести к одной функции. Значит, в итоге код будет выглядеть так:
Измененный код
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service class ButtonCodeby: def __init__(self, executable_path: str): self.url = 'https://codeby.net' self.service = '//*[@id="top"]/div[1]/div/div[1]/div/a' self.pentest = '/html/body/div[5]/div/a[2]' self.browser = webdriver.Chrome(service=Service(executable_path=executable_path)) def go_codeby(self): print(f'Переход на страницу ') self.browser.get(self.url) self.browser.find_element(By.XPATH, self.service).click() time.sleep(0.5) self.browser.find_element(By.XPATH, self.pentest).click() time.sleep(5) self.browser.quit()
Ну и запустить его можно будет с помощью такой вот конструкции:
Ну и немного еще про класс. Использование класса в данном случае можно, но является несколько бессмысленной тратой времени, хотя бы потому, что при парсинге может банально измениться код на странице. Следовательно, класс, который призван упростить создание своих экземпляров на его основе, просто не будет работать, так как в нем жестко прописаны элементы, которые необходимо найти. Но, это так, мелочи. Если автору хочется использовать класс — почему бы нет. Тем более, в данном случае все будет работать как с ним, так и без него.
На этом все. Такое вот, небольшое лирическое отступление.
Большое спасибо. По поводу Service недавно только узнал и занес сразу во-втором часте и указал что он давно устарел.
Про разделение кода вы совершенно правы, код будет слишком большим и лишним. Большое спасибо за код. понял свою ошибку и буду знать в дальнейшем.