Как запустить селениум для java
latest update of the page: 01-03-2023, 21:31 UTC
- статья «Что такое Selenium WebDriver?»
- Selenium Java Tutorial
- Selenium HeadQuarter
- Как заменить Selenium сервер на Selenoid.
- статья об интересном способе запуска тестов «на заднем плане»
Selenium для Perl
- Устанавливаем Java с https://www.java.com/en/download если ещё не установлена (текущую версию Java можно узнать командой в консоли java -version );
- Cкачиваем самую свежую версию Selenium Server с https://www.selenium.dev/downloads/ в разделе «Selenium Server«;
- Запускаем Selenium Server командой (поменяв имя файла на своё): java -jar selenium-server-standalone-2.44.0.jar Если же хотим использовать Chrome в качестве тестового браузера, то скачиваем свежий драйвер с https://sites.google.com/chromium.org/driver/ и кладём его в какую-нибудь папку, а Selenium Server запускаем командой: java -Dwebdriver.chrome.driver=[path-to-chromedriver] -jar [path-to-selenium_standalone_serv] Пример: java -Dwebdriver.chrome.driver=/home/progforce/Desktop/auto_testing/chromedriver -jar selenium-server-standalone-2.44.0.jar>
- Инструкция по использованию Perl для написания Selenium-тестов для WebDriver: https://metacpan.org/pod/Selenium::Remote::Driver sudo cpan >force install Selenium::Remote::Driver Установка всякой перлятины — вся последовательность указана тут: https://github.com/teodesian/Selenium-Remote-Driver: sudo apt-get install cpanminus sudo cpanm -v git://github.com/gempesaw/Selenium-Remote-Driver.git@cpan
- Не обязательно использовать standalone server, можно пользоваться встроенными для разных браузеров, например
use Selenium::Firefox; . my $driver = Selenium::Firefox->new; .
use Selenium::Chrome; . my $driver = Selenium::Chrome->new; .
Selenium для Python
- Selenium with Python
- Selenium для Python
- Установить установщик python-пакетов PIP: sudo apt-get install python-pip
- Установить библиотеку Selenium для Python при помощи PIP: sudo pip install selenium
- Для тестов под Firefox
- загрузить архив с geckodriver для вашей платформы, распаковать исполняемый файл и поместить его в PATH
- для проверки что всё работает выполнить простейший питоновский скрипт: from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() driver.get(«http://www.python.org») assert «Python» in driver.title elem = driver.find_element_by_name(«q») elem.send_keys(«pycon») elem.send_keys(Keys.RETURN) assert «No results found.» not in driver.page_source driver.close()
- Для тестов под Chrome:
- Устанавливаем Chrome или Chromium-browser
- Скачиваем свежий хромдрайвер с https://sites.google.com/chromium.org/driver/ и кладём его в какую-нибудь папку.
- Удостоверяемся, что скачанный файл «chromedriver» имеет права на чтение и запись и помечен как исполняемый
- В python-скрипте в заголовке надо заиспользовать следующие строки: import os
from selenium import webdriver
В теле функции заиспользовать webdriver Chrome: chromedriver = «»
os.environ[«webdriver.chrome.driver»] = chromedriver
driver = webdriver.Chrome(chromedriver)
Таким образом, простейший скрипт будет выглядеть, например, вот так: import os from selenium import webdriver from selenium.webdriver.common.keys import Keys chromedrvr = «/home/username/Downloads/chromedriver» os.environ[«webdriver.chrome.driver»] = chromedrvr driver = webdriver.Chrome(chromedrvr) driver.get(«http://www.python.org») assert «Python» in driver.title elem = driver.find_element_by_name(«q») elem.send_keys(«pycon») elem.send_keys(Keys.RETURN) assert «No results found.» not in driver.page_source driver.close()
Selenium для Ruby
- gem install selenium-webdriver
- Наипримитивнейший скрипт автотеста на Ruby будет выглядеть так: require «selenium-webdriver» ### CROMHEDIRVER # This string is required if you want to use chromedriver executable placed in specific place # Dir.pwd takes current directory Selenium::WebDriver::Chrome::Service.executable_path = File.join(Dir.pwd, ‘chromedriver’) driver = Selenium::WebDriver.for :chrome, :switches => %w[—ignore-certificate-errors —disable-popup-blocking —disable-translate] ### FRIEFXO # use this if you want to run Firefox #driver = Selenium::WebDriver.for :firefox driver.navigate.to «http://google.com» element = driver.find_element(:name, ‘q’) element.send_keys «Hello WebDriver!» element.submit puts driver.title driver.get ‘http://the-internet.herokuapp.com/’ expect(driver.title).to eql ‘The Internet’ driver.quit
Как запустить Selenium+Java+Cucumber без ide
Здравствуйте имеются тесты написанные на java + cucumber Структура следующая: https://i.stack.imgur.com/PyJpo.png Главный вопрос, как запустить это добро не из IDE, а скажем из консоли или вообще обернуть это все в jar файл Проблемы с которыми столкнулся это то что для создания jar нужен класс main, Вроде как существует некий java cucumber.api.cli.Main — но как этим пользоваться я пока не понял. В любом случае наверняка есть способ запустить это просто из командной строки. Расскажите пожалуйста как это сделать?
Отслеживать
3,606 4 4 золотых знака 21 21 серебряный знак 43 43 бронзовых знака
задан 30 июл 2019 в 15:31
25 3 3 бронзовых знака
Собери джарник и запускай его java -jar Только не забудь указать в pom.xml чтобы библиотеки так же собрались
2 авг 2019 в 7:53
jar требует main класс, а такового нет. Как быть?
2 авг 2019 в 20:58
а почему ты не хочешь использовать main?) у тебя maven не знает где точка входа в приложение
3 авг 2019 в 8:37
@Mark100F а как ты запускаешь свое приложение из ide?
3 авг 2019 в 12:20
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Создание исполняемого JAR файла с помощью Maven Задача Создать исполняемый JAR файл для запуска программы из командной строки
Решение Для создания исполняемого JAR файла необходимо указать главный класс (Main-Class) в файле манифеста (META-INF/manifest.mf). Указываемый класс является точкой входа приложения.
При использовании Maven это можно сделать посредством maven-jar-plugin. Для этого необходимо объявить данный плагин в pom.xml и в разделе конфигурации плагина указать главный класс
org.apache.maven.plugins maven-jar-plugin 2.4 ru.javacore.myapp.Main
Теперь при сборке проекта, в файле манифеста будет добавляться строка: Main-Class: ru.javacore.myapp.Main
Для запуска программы из командной строки будет достаточно указать имя JAR файла: java -jar myapp.jar
Чтобы объявить зависимые библиотеки у JAR файла необходимо указать заголовок Class-Path в файле манифеста. Для этого в плагине при настройке манифеста объявляется элемент addClasspath. Если зависимые библиотеки располагаются в отдельной папке, то эту папку следует указать в элементе classpathPrefix.
org.apache.maven.plugins maven-jar-plugin 2.4 true lib ru.javacore.myapp.Main
Пишем автотест с использованием Selenium Webdriver, Java 8 и паттерна Page Object
В этой статье рассматривается создание достаточного простого автотеста. Статья будет полезна начинающим автоматизаторам.
Материал изложен максимально доступно, однако, будет значительно проще понять о чем здесь идет речь, если Вы будете иметь хотя бы минимальные представления о языке Java: классы, методы, etc.
- установленная среда разработки Intellij IDEA (является самой популярной IDE, для большинства случаев достаточно бесплатной версии Community Edition);
- установленные Java (jdk/openjdk) и Maven, прописанные в системные окружения ОС;
- браузер Chrome и chromedriver — программа для передачи команд браузеру.
Создание проекта
Запустим Intellij IDEA, пройдем первые несколько пунктов, касающихся отправки статистики, импорта проектов, выбора цветовой схемы и т.д. — просто выберем параметры по умолчанию.
В появившемся в конце окне выберем пункт «Create New Project», а в нем тип проекта Maven. Окно будет иметь вид:

- Maven — это инструмент сборки Java проектов;
- Project SDK — версия Java, которая установлена на компьютере;
- Create from archetype — это возможность создавать проект с определенным архетипом (на данном этапе данный чекбокс отмечать не нужно).
Нажмем «Next». Откроется следующее окно:

Groupid и Artifactid — идентификаторы проекта в Maven. Существуют определенные правила заполнения этих пунктов:
- Groupid — название организации или подразделения занимающихся разработкой проекта. В этом пункте действует тоже правило как и в именовании пакетов Java: доменное имя организации записанное задом наперед. Если у Вас нет своего доменного имени, то можно использовать свой э-мейл, например com.email.email;
- Artifactid — название проекта;
- Version — версия проекта.
Нажмем «Finish»: IDE автоматически откроет файл pom.xml:

В нем уже появилась информация о проекте, внесенная на предыдущем шаге: Groupid, Artefiactid, Version. Pom.xml — это файл который описывает проект. Pom-файл хранит список всех библиотек (зависимостей), которые используются в проекте.
Для этого автотеста необходимо добавить две библиотеки: Selenium Java и Junit. Перейдем на центральный репозиторий Maven mvnrepository.com, вобьем в строку поиска Selenium Java и зайдем в раздел библиотеки:

Выберем нужную версию (в примере будет использована версия 3.14.0). Откроется страница:

Копируем содержимое блока «Maven» и вставим в файл pom.xml в блок
Таким образом библиотека будет включена в проект и ее можно будет использовать. Аналогично сделаем с библиотекой Junit (будем использовать версию 4.12).

Создание пакета и класса
Раскроем структуру проекта. Директория src содержит в себе две директории: «main» и «test». Для тестов используется, соответственно, директория «test». Откроем директорию «test», кликом правой клавиши мыши по директории «java» выберем пункт «New», а затем пункт «Package». В открывшемся диалоговом окне необходимо ввести название пакета. Имя базового пакета должно носить тоже имя, что и Groupid — «org.example».
Следующий шаг — создание класса Java, в котором пишется код автотеста. Кликом правой клавиши мыши по названию пакета выберем пункт «New», а затем пункт «Java Class».
В открывшемся диалоговом окне необходимо ввести имя Java класса, например, LoginTest (название класса в Java всегда должно начинаться с большой буквы). В IDE откроется окно тестового класса:

Настройка IDE
Прежде чем начать, необходимо настроить IDE. Кликом правой клавиши мыши по названию проекта выберем пункт «Open Module Settings». В открывшемся окне во вкладке «Sources» поле «Language level» по умолчанию имеет значение 5. Необходимо изменить значение поля на 8 (для использования всех возможностей, присутствующих в этой версии Java) и сохранить изменения:

Далее необходимо изменить версию компилятора Java: нажмем меню «File», а затем выберем пункт Settings.
В открывшемся перейдем «Build, Execution, Deployment» -> «Compiler» -> «Java Compiler». По умолчанию установлена версия 1.5. Изменим версию на 8 и сохраним изменения:

Test Suite
- Пользователь открывает страницу аутентификации;
- Пользователь производит ввод валидных логина и пароля;
- Пользователь удостоверяется в успешной аутентификации — об этом свидетельствует имя пользователя в верхнем правом углу окна;
- Пользователь осуществляет выход из аккаунта путем нажатия на имя пользователя в верхнем правом углу окна с последующим нажатием на кнопку «Выйти…».
Тест считается успешно пройденным в случае, когда пользователю удалось выполнить все вышеперечисленные пункты.
Для примера будет использоваться аккаунт Яндекс (учетная запись заранее создана вручную).
Первый метод
В классе LoginTest будет описана логика теста. Создадим в этом классе метод «setup()», в котором будут описаны предварительные настройки. Итак, для запуска браузера необходимо создать объект драйвера:
WebDriver driver = new ChromeDriver();
Перед созданием объекта WebDriver следует установить зависимость, определяющую путь к chomedriver (в ОС семейства Windows дополнительно необходимо указывать расширение .exe):
System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
Чтобы ход теста отображался в полностью открытом окне, необходимо сказать об этом драйверу:
driver.manage().window().maximaze();
Случается, что элементы на страницах доступны не сразу, и необходимо дождаться появления элемента. Для этого существуют ожидания. Они бывают двух видов: явные и неявные. В примере будет использовано неявное ожидание Implicitly Wait, которое задается вначале теста и будет работать при каждом вызове метода поиска элемента:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Таким образом, если элемент не найден, то драйвер будет ждать его появления в течении заданного времени (10 секунд) и шагом в 500 мс. Как только элемент будет найден, драйвер продолжит работу, однако, в противном случае тест упадем по истечению времени.
Для передачи драйверу адреса страницы используется команда:
driver.get("https://passport.yandex.ru/auth")
Выносим настройки
Для удобства вынесем название страницы в отдельный файл (а чуть позже и некоторые другие параметры).
Создадим в каталоге «test» еще один каталог с названием «resources», а в нем обычный файл «conf.properties», в который поместим переменную:
loginpage = https://passport.yandex.ru/auth
а также внесем сюда путь до драйвера
chromedriver = /usr/bin/chromedriver

В пакете «org.example» создадим еще один класс «ConfProperties», который будет читать записанные в файл «conf.properties» значения:

package org.example; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class ConfProperties < protected static FileInputStream fileInputStream; protected static Properties PROPERTIES; static < try < //указание пути до файла с настройками fileInputStream = new FileInputStream("src/test/resources/conf.properties"); PROPERTIES = new Properties(); PROPERTIES.load(fileInputStream); >catch (IOException e) < e.printStackTrace(); //обработка возможного исключения (нет файла и т.п.) >finally < if (fileInputStream != null) try < fileInputStream.close(); >catch (IOException e) < e.printStackTrace(); >> > /** * метод для возврата строки со значением из файла с настройками */ public static String getProperty(String key) < return PROPERTIES.getProperty(key); >>
Обзор первого метода

Метод «setup()» пометим аннотацией Junit «@BeforeClass», которая указывает на то, что метод будет выполняться один раз до выполнения всех тестов в классе. Тестовые методы в Junit помечаются аннотацией Test.
package org.example; import org.junit.BeforeClass; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import java.util.concurrent.TimeUnit; public class LoginTest < /** * осуществление первоначальной настройки */ @BeforeClass public static void setup() < //определение пути до драйвера и его настройка System.setProperty("webdriver.chrome.driver", ConfProperties.getProperty("chromedriver")); //создание экземпляра драйвера WebDriver driver = new ChromeDriver(); //окно разворачивается на полный экран driver.manage().window().maximize(); //задержка на выполнение теста = 10 сек. driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //получение ссылки на страницу входа из файла настроек driver.get(ConfProperties.getProperty("loginpage")); >>
Page Object
При использовании Page Object элементы страниц, а также методы непосредственного взаимодействия с ними, выносятся в отдельный класс.
Создадим в пакете «org.example» класс LoginPage, который будет содержать локацию элементов страницы логина и методы для взаимодействия с этими элементами.
Откроем страницу авторизации в сервисах Яндекс (https://passport.yandex.ru/auth) в браузере Chrome. Для определения локаторов элементов страницы, с которыми будет взаимодействовать автотест, воспользуемся инструментами разработчика. Кликом правой кнопки мыши вызовем меню «Просмотреть код». В появившейся панели нажмем на значок курсора (левый верхний угол панели разработчика) и наведем курсор на интересующий нас элемент — поле ввода логина.
В результате мы увидим этот элемент среди множества других. Теперь мы можем скопировать его локацию. Для этого кликаем правой кнопкой мыши по выделенному в панели разработчика элементу, выбираем меню «Copy» -> «Copy XPath».
//*[@id="root"]/div/div/div[2]/div/div/div[3]/div[2]/div/div/div[1]/form/div[1]/div[1]/label
Для локации элементов в Page Object используется аннотация @FindBy.
Напишем следующий код:
@FindBy(xpath = "//*[@id="root"]/div/div/div[2]/div/div/div[3]/div[2]/div/div/div[1]/form/div[1]/div[1]/label") private WebElement loginField;
Таким образом мы нашли элемент на страницу и назвали его loginField (элемент доступен только внутри класса LoginPage, т.к. является приватным).
Однако, такой длинный и страшный xpath использовать не рекомендуется (рекомендую к прочтению статью «Не так страшен xpath как его незнание». Если присмотреться, то можно увидеть, что поле ввода логина имеет уникальный id:

Воспользуемся этим и изменим поиск элемента по xpath:
@FindBy(xpath = "//*[contains(@id, 'passp-field-login')]")
Теперь вероятность того, что поле ввода пароля будет определено верно даже в случае изменения местоположения элемента на странице, возросла.
Аналогично изучим следующие элементы и получим их локаторы.
@FindBy(xpath = "//*[contains(text(), 'Войти')]") private WebElement loginBtn;
Поле ввода пароля:
@FindBy(xpath = "//*[contains(@id, 'passp-field-passwd')]") private WebElement passwdField;
А теперь напишем методы для взаимодействия с элементами.
Метод ввода логина:
public void inputLogin(String login)
Метод ввода пароля:
public void inputPasswd(String passwd)
Метод нажатия кнопки входа:
public void clickLoginBtn()
Для того, чтобы аннотация @FindBy заработала, необходимо использовать класс PageFactory. Для этого создадим конструктор и передадим ему в качестве параметра объект Webdriver:
public WebDriver driver; public LoginPage(WebDriver driver)

package org.example; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class LoginPage < /** * конструктор класса, занимающийся инициализацией полей класса */ public WebDriver driver; public LoginPage(WebDriver driver) < PageFactory.initElements(driver, this); this.driver = driver; >/** * определение локатора поля ввода логина */ @FindBy(xpath = "//*[contains(@id, 'passp-field-login')]") private WebElement loginField; /** * определение локатора кнопки входа в аккаунт */ @FindBy(xpath = "//*[contains(text(), 'Войти')]/..") private WebElement loginBtn; /** * определение локатора поля ввода пароля */ @FindBy(xpath = "//*[contains(@id, 'passp-field-passwd')]") private WebElement passwdField; /** * метод для ввода логина */ public void inputLogin(String login) < loginField.sendKeys(login); >/** * метод для ввода пароля */ public void inputPasswd(String passwd) < passwdField.sendKeys(passwd); >/** * метод для осуществления нажатия кнопки входа в аккаунт */ public void clickLoginBtn() < loginBtn.click(); >>
После авторизации мы попадаем на страницу пользователя. Т.к. это уже другая страница, в соответствии с идеологией Page Object нам понадобится отдельный класс для ее описания. Создадим класс ProfilePage, в котором определим локаторы для имени пользователя (как показателя успешного входа в учетную запись), а также кнопки выхода из аккаунта. Помимо этого, напишем методы, которые будут получать имя пользователя и нажимать на кнопку выхода.
Итого, страница будет иметь следующий вид:

package org.example; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class ProfilePage < /** * конструктор класса, занимающийся инициализацией полей класса */ public WebDriver driver; public ProfilePage(WebDriver driver) < PageFactory.initElements(driver, this); this.driver = driver; >/** * определение локатора меню пользователя */ @FindBy(xpath = "//*[contains(@class, 'account__name_hasAccentLetter')]") private WebElement userMenu; /** * определение локатора кнопки выхода из аккаунта */ @FindBy(xpath = "//*[contains(@class, 'menu-item_action_exit menu__item menu__item_type_link')]") private WebElement logoutBtn; /** * метод для получения имени пользователя из меню пользователя */ public String getUserName() < String userName = userMenu.getText(); return userName; >/** * метод для нажатия кнопки меню пользователя */ public void entryMenu() < userMenu.click(); >/** * метод для нажатия кнопки выхода из аккаунта */ public void userLogout() < logoutBtn.click(); >>
Интересный момент: в метод getUserName() пришлось добавить еще одно ожидание, т.к. страница «тяжелая» и загружалась довольно медленно. В итоге тест падал, потому что метод не мог получить имя пользователя. Метод getUserName() с ожиданием:
public String getUserName() < WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[contains(@class, 'account__name_hasAccentLetter')]"))); String userName = userMenu.getText(); return userName; >
Вернемся к классу LoginTest и добавим в него созданные ранее классы-страницы путем объявления статических переменных с соответствующими именами:
public static LoginPage loginPage; public static ProfilePage profilePage;
Сюда же вынесем переменную для драйвера
public static WebDriver driver;
В аннотации @BeforeClass создаем экземпляры классов созданных ранее страниц и присвоим ссылки на них. Создание экземпляра происходит с помощью оператора new. В качестве параметра указываем созданный перед этим объект driver, который передается конструкторам класса, созданным ранее:
loginPage = new LoginPage(driver); profilePage = new ProfilePage(driver);
А создание экземпляра драйвера приведем к следующему виду (т.к. он объявлен в качестве переменной):
driver = new ChromeDriver();
Тест
Теперь можно перейти непосредственно к написанию логики теста. Создадим метод loginTest() и пометим его соответствующей аннотацией:
@Test public void loginTest() < //значение login/password берутся из файла настроек по аналогии с chromedriver //и loginpage //вводим логин loginPage.inputLogin(ConfProperties.getProperty("login")); //нажимаем кнопку входа loginPage.clickLoginBtn(); //вводим пароль loginPage.inputPasswd(ConfProperties.getProperty("password")); //нажимаем кнопку входа loginPage.clickLoginBtn(); //получаем отображаемый логин String user = profilePage.getUserName(); //и сравниваем его с логином из файла настроек Assert.assertEquals(ConfProperties.getProperty("login"), user); >
Осталось лишь корректно все завершить. Создадим финальный метод и пометим его аннотацией @AfterClass (методы помеченные этой аннотацией выполняются один раз, после завершения всех тестовых методов класса).
В этом методе осуществляется вход в меню пользователя и нажатие кнопки «Выйти», чтобы разлогиниться.
@AfterClass public static void tearDown()
Последняя строка нужна для закрытия окна браузера.
Обзор теста
package org.example; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import java.util.concurrent.TimeUnit; public class LoginTest < public static LoginPage loginPage; public static ProfilePage profilePage; public static WebDriver driver; /** * осуществление первоначальной настройки */ @BeforeClass public static void setup() < //определение пути до драйвера и его настройка System.setProperty("webdriver.chrome.driver", ConfProperties.getProperty("chromedriver")); //создание экземпляра драйвера driver = new ChromeDriver(); loginPage = new LoginPage(driver); profilePage = new ProfilePage(driver); //окно разворачивается на полный экран driver.manage().window().maximize(); //задержка на выполнение теста = 10 сек. driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //получение ссылки на страницу входа из файла настроек driver.get(ConfProperties.getProperty("loginpage")); >/** * тестовый метод для осуществления аутентификации */ @Test public void loginTest() < //получение доступа к методам класса LoginPage для взаимодействия с элементами страницы //значение login/password берутся из файла настроек по аналогии с chromedriver //и loginpage //вводим логин loginPage.inputLogin(ConfProperties.getProperty("login")); //нажимаем кнопку входа loginPage.clickLoginBtn(); //вводим пароль loginPage.inputPasswd(ConfProperties.getProperty("password")); //нажимаем кнопку входа loginPage.clickLoginBtn(); //получаем отображаемый логин String user = profilePage.getUserName(); //и сравниваем его с логином из файла настроек Assert.assertEquals(ConfProperties.getProperty("login"), user); >/** * осуществление выхода из аккаунта с последующим закрытием окна браузера */ @AfterClass public static void tearDown() < profilePage.entryMenu(); profilePage.userLogout(); driver.quit(); >>
Запуск автотеста
Для запуска автотестов в Intellij Idea имеется несколько способов:
- Alt+Shift+F10;
- Клик правой клавишей мышки по имени тестового класса, после чего в открывшемся меню выбрать Run;
В результате выполнения автотеста, в консоли Idea я вижу, что тестовый метод loginTest() пройден успешно:
Статья [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
- Реакции 34
Mark Klintov
Grey Team
23.07.2022 151 263
Идея хорошая для статьи, но очень мало. Хочется видеть больше примеров работы. Лично я не понял для чего нужен этот модуль, ведь открыть ссылку в браузере можно при помощи того же
Ссылка скрыта от гостей
. Могу помочь ссылкой на Habr, здесь ты сможешь черпать знания и принцип работы. Попробуй донести до читателя чем может помочь selenium на реальных примерах. Буду очень рад почитать разбор этого фреймворка)
dream to perfection
Green Team
11.06.2022 59 34
Идея хорошая для статьи, но очень мало. Хочется видеть больше примеров работы. Лично я не понял для чего нужен этот модуль, ведь открыть ссылку в браузере можно при помощи того же
Ссылка скрыта от гостей
. Могу помочь ссылкой на Habr, здесь ты сможешь черпать знания и принцип работы. Попробуй донести до читателя чем может помочь selenium на реальных примерах. Буду очень рад почитать разбор этого фреймворка)
Большое спасибо за такой ответ. Да, я понял что данная статья не очень подробная.
Ожидайте вторую часть!
Dzen
Codeby Games
Gold Team
16.04.2021 346 374
Большое спасибо за такой ответ. Да, я понял что данная статья не очень подробная.
Ожидайте вторую часть!
Думаю, лучше продолжить данную статью, нежели делать вторую часть. Дополняйте. Лучше одна ёмкая статья, чем много обрывистых заметок )
dream to perfection
Green Team
11.06.2022 59 34
Статья обновлена!
Johan Van
Green Team
13.06.2020 342 620
Привет, 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 34
Всем доброго времени суток. Хотелось бы сказать несколько слов по поводу кода, который приведен в статье. Я понимаю, что автор еще больший новичок, чем я, потому, это, скажем так, небольшое дружеское код-ревью.
Начнем с самого простого. Способ, с помощью которого указывается путь к драйверу, именно в том виде, что у автора в статье:
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 недавно только узнал и занес сразу во-втором часте и указал что он давно устарел.
Про разделение кода вы совершенно правы, код будет слишком большим и лишним. Большое спасибо за код. понял свою ошибку и буду знать в дальнейшем.
