Статья об основах Selenium, пример программы на C# c подробным описанием

0DA0D38A9A1

Новый пользователь
Дней с нами
836
Розыгрыши
0
Сообщения
1
Репутация
0
Реакции
0
Здравствуйте, давайте для начала узнаем, что же такое Selenium, обратимся за определением к хабру: "Selenium – это проект, в рамках которого разрабатывается серия программных продуктов с открытым исходным кодом (open source): Selenium WebDriver, Selenium RC, Selenium Server, Selenium Grid, Selenium IDE"

В данной статье мы рассмотрим именно работу с Selenium WebDriver. Selenium WebDriver – это программная библиотека для управления браузерами, проще говоря, для простых смертных - это средство автоматизации браузера, необходимое тестерам, но мы ведь не тестеры, верно? Зачем нам тогда может пригодиться Selenium? Ответ прост - с помощью него мы можем полностью эмулировать человека, а значит писать брутфорсы, чекеры и тому подобное не разбираясь с защитой сайта, ведь нам не потребуется работа с запросами, звучит как сказка, верно? Но даже тут имеются подводные камни, давайте рассмотрим плюсы и минусы селениума
Плюсы:
  • - невероятная простота использования
  • - лёгкость поддержки софта
  • - нет необходимости выстраивать цепочку запросов
  • - возможность наглядно наблюдать за тем, что делает ваш софт
  • - поддержка кучи языков и платформ (Java, C#, PHP, Ruby, Perl, Python, JavaScript, Objective-C, Haskell, R, Windows, Linux, Mac, Android, iOS, Google Chrome, Internet Explorer, Firefox, Safari, Opera, Microsoft Edge, HtmlUnitDriver)
  • - наличие подробной документации(https://www.selenium.dev/documentation/webdriver/)
  • - возможность полной имитации действий пользователя
Минусы:
  • - жрёт кучу ресурсов
  • - гораздо медленнее запросов
  • - гугл научился с этим бороться (но не полностью :))
  • - наличие прямой зависимости версии браузера от версии драйвера

Больше плюсом и минусов я выделить не смог, давайте перейдём к наглядной реализации и демонстрации возможностей Selenium на языке C# (не бросайте читать статью если используете другой ЯП, ведь логика реализации на всех языках одинакова, а методы схожи)
Для демонстрации буду использовать .NET 6.0 и Google Chrome 97.0.4692.71
Первым делом создадим проект и добавим туда через Nuget библиотеку Selenium.WebDriver
JwwxCjk.png
После этого нам необходимо добавить драйвер нужного нам браузера, в моём случае гугл хром. Переходим по ссылке https://chromedriver.chromium.org/ и качаем нужную нам версию хром драйвера (она должна соответствовать вашей версии гугл хрома) и перекидываем exe драйвера в папку с нашим проектом, который на данном этапе должен выглядеть так:
5ezPnBk.png
Наконец перейдём к коду
В начале нам необходимо подключить некоторые пространства имён
C#:
using OpenQA.Selenium; // пространство имён
using OpenQA.Selenium.Chrome; // пространство имён
Теперь создадим экземпляр настроек хрома перед запуском

Код:
ChromeOptions options = new ChromeOptions(); // экземпляр хром опций
options.PageLoadStrategy = PageLoadStrategy.Normal; // ожидаем нормальной загрузки страниц
обратившись к объекту option мы можем установить любые аргументы запуска хрома, например сделать хром скрытым
Код:
options.AddArgument("--headless");
С полным списком аргументов можно ознакомиться тут: https://peter.sh/experiments/chromium-command-line-switches/#reduce-security-for-testing
Кроме аргументом запуска через option мы можем задавать множество других настроек, все они описаны в документации Selenium.WebDriver
Теперь нам необходимо создать объект самого драйвера передать туда настройки(если таковых не имеется оставить скобочки пустыми)
Код:
IWebDriver chrome = new OpenQA.Selenium.Chrome.ChromeDriver(options); // создаём и инициализируем объект драйвера
Отлично, теперь нам нужно установить неявное ожидание появления элемента на странице. Зачем это нужно? Дело в том, что наш скрипт работает быстрее чем сайт и поиск элемента на не прогруженной странице выдаст нам ошибку о том, что такого элемента не существует, а используя неявное ожидание мы решаем эту проблему (подробнее о неявном и явном ожидании написано в документации)

Код:
chrome.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10); // устанавливаем неявлное ожидание в 10 секунд
Теперь у нас всё готово к описанию списка действий, который должен выполнить наш драйвер. В качестве примера я напишу простенький брут Яндекса.
Для начала отправим наш драйвер на страницу авторизации
Код:
chrome.Navigate().GoToUrl("https://passport.yandex.ru/"); // направляем наш браузер по ссылке
Теперь нам необходимо ввести логин и тыкнуть по кнопочке
Sm43nUB.png
Сделать это можно благодаря поиску элементов в html, а обратиться к элемент мы можем с помощью: id, cssselector, linktext, tagname, xpath. Я предпочитаю использовать XPath, выглядит он примерно так: //input[contains(@type,'text')] Искать его вы можете либо ручками, либо с помощью специальных расширений, я использую вот это расширение для FireFox
sqcmZ7q.png

Объясню как пользоваться этим расширением:
1. Ищем нужный нам элемент на сайте
2. Кликаем правой кнопки мыши
3. Кликаем сюда
4iaK9e9.png

4. Выбираем подходящий нам икспасник и кликаем на него
A5aSaQz.png

5. Копируем из открывшегося окошка

TzfX1iY.png
Вернёмся к коду, с помощью XPath мы обращаемся к элементу и задаём ему значение, либо кликаем на него

Код:
chrome.FindElement(By.XPath("//input[contains(@type,'text')]")).SendKeys("t3stselen"); // ищем поле по XPath и устанавливаем ему значение
chrome.FindElement(By.XPath("//button[@data-t='button:action:passp:sign-in'][contains(.,'Войти')]")).Click(); // ищем кнопку "вход" и кликаем по ней
chrome.FindElement(By.XPath("//input[contains(@data-t,'field:input-passwd')]")).SendKeys("t3stselent3stselen"); // ищем поле по XPath и устанавливаем ему значение
chrome.FindElement(By.XPath("//button[@data-t='button:action:passp:sign-in'][contains(.,'Войти')]")).Click(); // ищем кнопку "вход" и кликаем по ней
Мы прошли авторизацию и теперь необходимо узнать сделали это удачно, или же нет
C#:
Thread.Sleep(1000); // спим 1 секунду

if (chrome.Title == "Яндекс ID") // проверяем заголовк и делаем вывод о валидности
    Console.WriteLine("валид");
else
    Console.WriteLine("невалид");
Сделали это через проверку заголовка страницы

Ну... Как бы всё, вся логика брутфорса реализована, осталось сделать обёртку и бежать продавать наш мега-приватный брутфорс :)
C#:
using OpenQA.Selenium; // простарнство имён

using OpenQA.Selenium.Chrome; // пространство имён

ChromeOptions options = new ChromeOptions(); // экзезмляр хром опций
options.PageLoadStrategy = PageLoadStrategy.Normal; // ожидаем нормальной загрузки страниц
IWebDriver chrome = new OpenQA.Selenium.Chrome.ChromeDriver(options); // создаём и инициализируем объект драйвера
chrome.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10); // устанавливаем неявлное ожидание в 10 секунд

chrome.Navigate().GoToUrl("https://passport.yandex.ru/"); // направляем наш браузер по ссылке

chrome.FindElement(By.XPath("//input[contains(@type,'text')]")).SendKeys("t3stselen"); // ищем поле по XPath и устанавливаем ему значение
chrome.FindElement(By.XPath("//button[@data-t='button:action:passp:sign-in'][contains(.,'Войти')]")).Click(); // ищем кнопку "вход" и кликаем по ней
chrome.FindElement(By.XPath("//input[contains(@data-t,'field:input-passwd')]")).SendKeys("t3stselent3stselen"); // ищем поле по XPath и устанавливаем ему значение
chrome.FindElement(By.XPath("//button[@data-t='button:action:passp:sign-in'][contains(.,'Войти')]")).Click(); // ищем кнопку "вход" и кликаем по ней

Thread.Sleep(1000); // спим 1 секунду

if (chrome.Title == "Яндекс ID") // проверяем заголовк и делаем вывод о валидности
    Console.WriteLine("валид");
else
    Console.WriteLine("невалид");

А если серьёзно, то если вы реально решитесь писать брутфорс/авторегер/накрутку на селениум, готовьтесь к долгой и геморной оптимизацией, ведь по дефолту это решение жрёт неимоверное количество ресурсов вашего ПК. Оптимизировать можно, например, через вышеупомянутые option
В данной статье описаны лишь самые необходимые функции Selenium.WebDriver, если вы хотите изучить его подробнее, то рекомендую ознакомить с:
- документацией: https://www.selenium.dev/documentation/webdriver/)
- интересной статьёй, где описано большинство функционала
https://wiki.dmdevelopment.ru/wiki/Download/Books/development/selenium-webdriver.pdf
 
Есть пару скриптов на джаве, но по скоросте работы не быстрее баса, вот только написать на басе в разы проще. Но конкретно в моем случии селениум выполняет меньше 20% работы от общего кода, поэтому было оправдано писать на нем.