• Перейти на CTF площадку Игры Кодебай

    Выполняйте задания по кибербезопасности в формате CTF и получайте бесценный опыт. Ознакомиться с подробным описанием можно тут.

Статья [Selenium] Установка, запуск и реальное применение. Part Ⅰ

16-06-A.jpg

Привет, Codeby!

В статье я расскажу, как можно управлять браузером, используя фреймворк Selenium. Этот фреймворк позволяет имитировать реальный браузер, управление которым будет происходить с помощью кода. Также, Selenium подходит для тестирования Web-приложений, решения рутинных задач: извлечение информации (парсинг) и др. Фреймворк написан на языке Java и был опубликован в 2004-ом разработчиком Jason Huggins.

Вы научитесь:
  • Установке Selenium и так же веб-драйвера;
  • Использовать веб-локатор;
  • Написанию программы для взаимодействие с форумом Codeby.

Рабочие браузеры

Chromium/Google ChromeWindows/macOS/LinuxGoogle
FirefoxWindows/macOS/LinuxMozilla
Microsoft EdgeWindows 10Microsoft
Internet ExplorerWindowsSelenium Project
SafarimacOS El Capitan и более новыеApple
OperaWindows/macOS/LinuxOpera

Библиотека Selenium есть на следующих языках: Java, Python, Kotlin, JavaScript и т.п.

Установка Selenium

Итак, для установки Selenium воспользуемся командой:
pip install selenium
Доступно в

Драйвер

Это ещё не всё. Для Selenium нужны веб-драйвера, чтобы запускать нужный браузер при запуске.

Для браузера Chrome:
Устанавливаем драйвер Chromdriver для Windows
Chromedriver - драйвер для запуска браузера Chrome.

Драйвер должен иметь ту версиею Chrome, которая у вас установлена. Чтобы узнать версию вашего браузера, перейдите в Настройки -> О браузере Chrome:

Download (3).png


Отлично, мы узнали версию браузера. Значит, нам нужен драйвер с версией 106. Чтобы установить Chromedriver переходим на сайт -

На сайте вы увидите две версии Chrome 107: beta & stable. Это новая версия драйвера Chrome. Этот драйвер будет работать у вас только в том случае, если браузер имеет такую же версию. Для просмотра всех версий нажимаем на кнопку Downloads, как показано на скрине:

Download (4).png


Скачиваем ChromeDriver 106:

Download (5).png


Супер! Файл chromedriver.exe можно оставить в любом каталоге нашей системы. В дальнейшем нам придётся указывать путь.
Устанавливаем драйвер 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 -
драйвер для запуска Firefox. Установка чуть-чуть отличается.

Для скачивания geckodriver переходим на GitHub - тыц
Версия драйвера должна совместима с версией браузера Firefox.

Download (6).png


В моём случаю я устанавливаю geckodriver-v0.32.0-win64.zip . После скачивания распакуйте архив и оставьте geckodriver.exe в любой директории системы. В дальнейшем нам придётся указывать путь.
Устанавливаем драйвер Geckodriver в Linux
Скажу одно: в Linux по умолчанию установлен geckodriver для Firefox, даже не нужно указывать путь к нему.
Но. если он у вас по каким-то причинам не установлен, переходим и скачиваем архив для Linux. .


Алгоритм работы

Untitled Workspace.png

На скриншоте показан алгоритм работы нашей будущей программы. После запуска Selenium ищет путь веб-драйвера и, при успехе, открывает сайт Codeby.net.

О веб-локаторах

На самом деле это очень важна тема, без них мы не сможем управлять страницей при помощи Selenium. Что же вообще такое веб-локаторы? Это простые элементы на HTML-странице, которые мы сможем выбирать и выполнять нужной действие. Например, нажатие кнопки: чтобы нажать на кнопку нам нужно выбрать элемент, а именно - веб-локатор, который Selenium сможет найти. Если локатор найден, то Selenium продолжает свою работу.

1667857341005.png


Чтобы Selenium смог нажать накнопку нам необходимо получить веб-локатор, для этого открываем Инструменты разработчика в браузере:

1667857536877.png


Выбрали, теперь нам нужно получить веб-локатор (XPATH) для HTML-тэга <а>.
Что такое XPATH? Это веб-локатор, который можно применять в Selenium. Кроме XPATH существует и другие типы веб-локаторов: outerHtml, Element, Full Xpath и т.п
Переходим к кодингу.

Пишем код

После успешной установки давайте напишем программу, которая будет автоматически открывать форум Codeby в веб-браузере.
Наша задача:
  1. Указать путь к драйверу для запуска браузера
  2. Указать ссылку на сайт, который будет открывать Selenium
  3. Найти веб-локаторы кнопки Сервисы Codeby и кликнуть на неё, а затем нажать на Пентест.
  4. Бинго!
Импортируем библиотеки

Python:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
Определяем библиотеки: time нужно для задержки, чтобы страница успела загрузиться. Selenium.by предназначен для нахождения и определения веб-локаторов.

Создаём класс

На примере я буду использовать ООП, для меня он понятнее. Создаем класс под название ButtonCodeby.
Python:
class ButtonCodeby:
    pass

Конструктор класса

Python:
    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 ]

Python:
 def go_codeby(self):
    print(f'Переход на страницу {self.url}')
    self.browser.get(self.url)
Функция go_codeby - переходит на сайт Codeby с помощью browser.get.

Создаём функцию [ service_codeby ]

Python:
 def service_codeby(self):
    self.browser.find_element(By.XPATH, self.service).click()
    time.sleep(0.5)
Функция service_codeby выполнят нажатие на кнопку Сервисы Codeby.

Создаём функцию [ pentest_codeby ]

Python:
 def pentest_codeby(self):
    self.browser.find_element(By.XPATH, self.pentest).click()
    time.sleep(5)
     self.browser.quit()
Функция pentest_codeby - нажимает на кнопку Пентест, затем выходим с браузера.

И последний штрих

Python:
 def start_click(self):
    self.go_codeby()
    self.service_codeby()
    self.pentest_codeby()
btn_cod = ButtonCodeby('/сhromedriver/chromedriver.exe')
Функция start_click - выполняет все функции, которые мы написали выше. В конце мы создаем переменную btn_cod, которая необходима для запуска браузера с определенным путем драйвера.

Полный код
Python:
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.url}')
    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')

Лекарство селениум, от боли суставы и многое другое.

579815_original.jpg
Важные ссылки
Документация Selenium python3 -
Что такое вебдрайвера - тык
Нашли ошибку в коде или тексте? Сообщите!
 
Последнее редактирование:

Mark Klintov

Grey Team
23.07.2022
88
164
Идея хорошая для статьи, но очень мало. Хочется видеть больше примеров работы. Лично я не понял для чего нужен этот модуль, ведь открыть ссылку в браузере можно при помощи того же . Могу помочь ссылкой на Habr, здесь ты сможешь черпать знания и принцип работы. Попробуй донести до читателя чем может помочь selenium на реальных примерах. Буду очень рад почитать разбор этого фреймворка)
 

dream to perfection

Green Team
11.06.2022
59
34
Идея хорошая для статьи, но очень мало. Хочется видеть больше примеров работы. Лично я не понял для чего нужен этот модуль, ведь открыть ссылку в браузере можно при помощи того же . Могу помочь ссылкой на Habr, здесь ты сможешь черпать знания и принцип работы. Попробуй донести до читателя чем может помочь selenium на реальных примерах. Буду очень рад почитать разбор этого фреймворка)
Большое спасибо за такой ответ. Да, я понял что данная статья не очень подробная.
Ожидайте вторую часть!
 
  • Нравится
Реакции: Maksim_K

Dzen

Green Team
16.04.2021
303
264
Большое спасибо за такой ответ. Да, я понял что данная статья не очень подробная.
Ожидайте вторую часть!
Думаю, лучше продолжить данную статью, нежели делать вторую часть. Дополняйте. Лучше одна ёмкая статья, чем много обрывистых заметок )
 
  • Нравится
Реакции: dream to perfection

Johan Van

Green Team
13.06.2020
264
438

Привет, Codeby!

В статье я расскажу, как можно управлять браузером, используя фреймворк Selenium. Этот фреймворк позволяет имитировать реальный браузер, управление которым будет происходить с помощью кода. Также, Selenium подходит для тестирования Web-приложений, решения рутинных задач: извлечение информации (парсинг) и др. Фреймворк написан на языке Java и был опубликован в 2004-ом разработчиком Jason Huggins.

Вы научитесь:
  • Установке Selenium и так же веб-драйвера;
  • Использовать веб-локатор;
  • Написанию программы для взаимодействие с форумом Codeby.

Рабочие браузеры

Chromium/Google ChromeWindows/macOS/LinuxGoogle
FirefoxWindows/macOS/LinuxMozilla
Microsoft EdgeWindows 10Microsoft
Internet ExplorerWindowsSelenium Project
SafarimacOS El Capitan и более новыеApple
OperaWindows/macOS/LinuxOpera

Библиотека Selenium есть на следующих языках: Java, Python, Kotlin, JavaScript и т.п.

Установка Selenium

Итак, для установки Selenium воспользуемся командой:
pip install selenium
Доступно в

Драйвер

Это ещё не всё. Для Selenium нужны веб-драйвера, чтобы запускать нужный браузер при запуске.

Для браузера Chrome:
Устанавливаем драйвер Chromdriver для Windows
Chromedriver - драйвер для запуска браузера Chrome.

Драйвер должен иметь ту версиею Chrome, которая у вас установлена. Чтобы узнать версию вашего браузера, перейдите в Настройки -> О браузере Chrome:

Посмотреть вложение 64147

Отлично, мы узнали версию браузера. Значит, нам нужен драйвер с версией 106. Чтобы установить Chromedriver переходим на сайт -

На сайте вы увидите две версии Chrome 107: beta & stable. Это новая версия драйвера Chrome. Этот драйвер будет работать у вас только в том случае, если браузер имеет такую же версию. Для просмотра всех версий нажимаем на кнопку Downloads, как показано на скрине:

Посмотреть вложение 64148

Скачиваем ChromeDriver 106:

Посмотреть вложение 64149

Супер! Файл chromedriver.exe можно оставить в любом каталоге нашей системы. В дальнейшем нам придётся указывать путь.
Устанавливаем драйвер 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 -
драйвер для запуска Firefox. Установка чуть-чуть отличается.

Для скачивания geckodriver переходим на GitHub - тыц
Версия драйвера должна совместима с версией браузера Firefox.

Посмотреть вложение 64150

В моём случаю я устанавливаю geckodriver-v0.32.0-win64.zip . После скачивания распакуйте архив и оставьте geckodriver.exe в любой директории системы. В дальнейшем нам придётся указывать путь.
Устанавливаем драйвер Geckodriver в Linux
Скажу одно: в Linux по умолчанию установлен geckodriver для Firefox, даже не нужно указывать путь к нему.
Но. если он у вас по каким-то причинам не установлен, переходим и скачиваем архив для Linux. .


Алгоритм работы


На скриншоте показан алгоритм работы нашей будущей программы. После запуска Selenium ищет путь веб-драйвера и, при успехе, открывает сайт Codeby.net.

О веб-локаторах

На самом деле это очень важна тема, без них мы не сможем управлять страницей при помощи Selenium. Что же вообще такое веб-локаторы? Это простые элементы на HTML-странице, которые мы сможем выбирать и выполнять нужной действие. Например, нажатие кнопки: чтобы нажать на кнопку нам нужно выбрать элемент, а именно - веб-локатор, который Selenium сможет найти. Если локатор найден, то Selenium продолжает свою работу.

Посмотреть вложение 64246

Чтобы Selenium смог нажать накнопку нам необходимо получить веб-локатор, для этого открываем Инструменты разработчика в браузере:

Посмотреть вложение 64247

Выбрали, теперь нам нужно получить веб-локатор (XPATH) для HTML-тэга <а>.
Что такое XPATH? Это веб-локатор, который можно применять в Selenium. Кроме XPATH существует и другие типы веб-локаторов: outerHtml, Element, Full Xpath и т.п
Переходим к кодингу.

Пишем код

После успешной установки давайте напишем программу, которая будет автоматически открывать форум Codeby в веб-браузере.
Наша задача:
  1. Указать путь к драйверу для запуска браузера
  2. Указать ссылку на сайт, который будет открывать Selenium
  3. Найти веб-локаторы кнопки Сервисы Codeby и кликнуть на неё, а затем нажать на Пентест.
  4. Бинго!
Импортируем библиотеки

Python:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
Определяем библиотеки: time нужно для задержки, чтобы страница успела загрузиться. Selenium.by предназначен для нахождения и определения веб-локаторов.

Создаём класс

На примере я буду использовать ООП, для меня он понятнее. Создаем класс под название ButtonCodeby.
Python:
class ButtonCodeby:
    pass

Конструктор класса

Python:
 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 ]

Python:
 def go_codeby(self):
    print(f'Переход на страницу {self.url}')
    self.browser.get(self.url)
Функция go_codeby - переходит на сайт Codeby с помощью browser.get.

Создаём функцию [ service_codeby ]

Python:
 def service_codeby(self):
    self.browser.find_element(By.XPATH, self.service).click()
    time.sleep(0.5)
Функция service_codeby выполнят нажатие на кнопку Сервисы Codeby.

Создаём функцию [ pentest_codeby ]

Python:
 def pentest_codeby(self):
    self.browser.find_element(By.XPATH, self.pentest).click()
    time.sleep(5)
     self.browser.quit()
Функция pentest_codeby - нажимает на кнопку Пентест, затем выходим с браузера.

И последний штрих

Python:
 def start_click(self):
    self.go_codeby()
    self.service_codeby()
    self.pentest_codeby()
btn_cod = ButtonCodeby(''/сhromedriver/chromedriver.exe'')
Функция start_click - выполняет все функции, которые мы написали выше. В конце мы создаем переменную btn_cod, которая необходима для запуска браузера с определенным путем драйвера.

Полный код
Python:
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.url}')
    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')

Лекарство селениум, от боли суставы и многое другое.

Посмотреть вложение 64154
Важные ссылки
Документация Selenium python3 -
Что такое вебдрайвера - тык
Нашли ошибку в коде или тексте? Сообщите!

Всем доброго времени суток. Хотелось бы сказать несколько слов по поводу кода, который приведен в статье. Я понимаю, что автор еще больший новичок, чем я, потому, это, скажем так, небольшое дружеское код-ревью.

Начнем с самого простого. Способ, с помощью которого указывается путь к драйверу, именно в том виде, что у автора в статье:

Python:
self.browser = webdriver.Chrome(executable_path=executable_path)

на данный момент является устаревшим. Об этом явно свидетельствует warning, который появляется каждый раз при запуске кода.

01.png


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

Python:
from selenium.webdriver.chrome.service import Service

А также заменить в коде строку, где создается объект драйвера. То есть, вот это:

Python:
self.browser = webdriver.Chrome(executable_path=executable_path)

нужно заменить вот на это:

Python:
self.browser = webdriver.Chrome(service=Service(executable_path=executable_path))

Таким образом, блок импорта и функция инициализации класса при этом будут выглядеть следующим образом:

Python:
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). И мы сразу же ловим исключение, которое говорит о том, что элемент, по которому пытается произвести клик драйвер, не найден.

02.png


Равно как и запуск функции pentest_codeby(self) в отрыве от остальных не имеет смысла, ибо он так же вызовет исключение, в котором будет говориться, что искомый элемент не найден.

03.png


Более того, запуск pentest_codeby(self) в отрыве от функции service_codeby(self) будет бессмысленным. Дело в том, что меню, по которому пытается выполнить клик данный код, подгружается динамически. И, пока не будет выполнен клик по предыдущему элементу, драйвер никогда не найдет код, на который ссылается данная функция. Вот для примера класс, который нужно найти, чтобы выполнить клик на кнопку. Данный класс появился уже после того, как меню было раскрыто:

05.png


Попробуем поискать данный класс до того, как мы раскрыли меню:

06.png


Как видим, совпадений не найдено. А теперь раскроем меню и повторим поиск:

07.png


Так вот, следовательно, разделять код нажатия на выпадающее меню, а также нажатия на кнопку в этом меню на отдельные функции не имеет смысла, так как они не будут работать по отдельности. Более того, даже код перехода на страницу сайта, также следует объединить с кодом клика по меню и кнопке. Так как, выполнение отдельно перехода на сайт, может быть и имеет смысл, и будет выполнено. А вот уже клики по меню и кнопке, без перехода на сайт, явно нет. Таким образом, если уж не отрываться от класса, который представлен в коде, весь код перехода и кликов можно свести к одной функции. Значит, в итоге код будет выглядеть так:

Python:
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.url}')
        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()

Ну и запустить его можно будет с помощью такой вот конструкции:

ButtonCodeby('chromedriver/chromedriver').go_codeby()

Ну и немного еще про класс. Использование класса в данном случае можно, но является несколько бессмысленной тратой времени, хотя бы потому, что при парсинге может банально измениться код на странице. Следовательно, класс, который призван упростить создание своих экземпляров на его основе, просто не будет работать, так как в нем жестко прописаны элементы, которые необходимо найти. Но, это так, мелочи. Если автору хочется использовать класс — почему бы нет. Тем более, в данном случае все будет работать как с ним, так и без него.

На этом все. Такое вот, небольшое лирическое отступление.
 
Последнее редактирование:

dream to perfection

Green Team
11.06.2022
59
34
Всем доброго времени суток. Хотелось бы сказать несколько слов по поводу кода, который приведен в статье. Я понимаю, что автор еще больший новичок, чем я, потому, это, скажем так, небольшое дружеское код-ревью.

Начнем с самого простого. Способ, с помощью которого указывается путь к драйверу, именно в том виде, что у автора в статье:

Python:
self.browser = webdriver.Chrome(executable_path=executable_path)

на данный момент является устаревшим. Об этом явно свидетельствует warning, который появляется каждый раз при запуске кода.

Посмотреть вложение 64436

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

Python:
from selenium.webdriver.chrome.service import Service

А также заменить в коде строку, где создается объект драйвера. То есть, вот это:

Python:
self.browser = webdriver.Chrome(executable_path=executable_path)

нужно заменить вот на это:

Python:
self.browser = webdriver.Chrome(service=Service(executable_path=executable_path))

Таким образом, блок импорта и функция инициализации класса при этом будут выглядеть следующим образом:

Python:
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). И мы сразу же ловим исключение, которое говорит о том, что элемент, по которому пытается произвести клик драйвер, не найден.

Посмотреть вложение 64437

Равно как и запуск функции pentest_codeby(self) в отрыве от остальных не имеет смысла, ибо он так же вызовет исключение, в котором будет говориться, что искомый элемент не найден.

Посмотреть вложение 64438

Более того, запуск pentest_codeby(self) в отрыве от функции service_codeby(self) будет бессмысленным. Дело в том, что меню, по которому пытается выполнить клик данный код, подгружается динамически. И, пока не будет выполнен клик по предыдущему элементу, драйвер никогда не найдет код, на который ссылается данная функция. Вот для примера класс, который нужно найти, чтобы выполнить клик на кнопку. Данный класс появился уже после того, как меню было раскрыто:

Посмотреть вложение 64439

Попробуем поискать данный класс до того, как мы раскрыли меню:

Посмотреть вложение 64440

Как видим, совпадений не найдено. А теперь раскроем меню и повторим поиск:

Посмотреть вложение 64441

Так вот, следовательно, разделять код нажатия на выпадающее меню, а также нажатия на кнопку в этом меню на отдельные функции не имеет смысла, так как они не будут работать по отдельности. Более того, даже код перехода на страницу сайта, также следует объединить с кодом клика по меню и кнопке. Так как, выполнение отдельно перехода на сайт, может быть и имеет смысл, и будет выполнено. А вот уже клики по меню и кнопке, без перехода на сайт, явно нет. Таким образом, если уж не отрываться от класса, который представлен в коде, весь код перехода и кликов можно свести к одной функции. Значит, в итоге код будет выглядеть так:

Python:
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.url}')
        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()

Ну и запустить его можно будет с помощью такой вот конструкции:

ButtonCodeby('chromedriver/chromedriver').go_codeby()

Ну и немного еще про класс. Использование класса в данном случае можно, но является несколько бессмысленной тратой времени, хотя бы потому, что при парсинге может банально измениться код на странице. Следовательно, класс, который призван упростить создание своих экземпляров на его основе, просто не будет работать, так как в нем жестко прописаны элементы, которые необходимо найти. Но, это так, мелочи. Если автору хочется использовать класс — почему бы нет. Тем более, в данном случае все будет работать как с ним, так и без него.

На этом все. Такое вот, небольшое лирическое отступление.
Большое спасибо. По поводу Service недавно только узнал и занес сразу во-втором часте и указал что он давно устарел.
Про разделение кода вы совершенно правы, код будет слишком большим и лишним. Большое спасибо за код. понял свою ошибку и буду знать в дальнейшем.
 
Мы в соцсетях: