Transcription
Добрый вечер. Давайте проверим связь, пока у нас 3 минутки есть до начала. Меня видно, слышно? Презентацию видно? Отлично, замечательно. Как настроение у вас? Какие-нибудь вопросы, может, есть, пока не начали? Там пару минуток есть, можно задать.
Мобильщикам пригодится вебинар или только порталу? Ну, если под порталом подразумеваете веб, то скорее только вебу. Мобилка она с апиумом чаще работает, чем с плейрайтом, но взаимодействие у них похоже. Правда, у апиума, наверное, больше похоже на селениумовское. Ну, в принципе, суть та же самая, что вы находите элементы, как-то с ним взаимодействуете. Просто могут немножко отличаться команды. Пожалуйста. Вот так. Библиотека немножко другая. Ну, можно будет посмотреть после занятия про апиум немножко, и станет попонятнее. Там, конечно, чуть сложнее с настройкой тестовых сред, особенно если вы хотите там прямо много мобильников, чтобы была тестовая ферма. Прямо это немножко сложнее, но, в принципе, можно.
Так-с. Ну что, 8:00 вечера, можем начинать. А, рад поприветствовать вас на открытом уроке "Первый автотест". Если кто был на предыдущем открытом уроке, двойное приветствие. На прошлом уроке мы смотрели, что такое Java. Если возникнут вопросы, можно будет в ВК найти открытый урок этот в нашей группе OT US. Вот. И посмотреть. Он был пару недель назад где-то по срокам. Можно будет поискать, если с Джавой будут вопросы.
А-а, сегодня будем говорить именно про Playwright, подразумевая, что Java немножечко знакомо, что мы не рассматривали на прошлом уроке. Я сегодня повторю дополнительно. Вот так, вроде все собрались, предлагаю начинать. Мы связь проверили, но если вдруг что-то не так, можно написать сейчас, что у меня там рабочая, не знаю, шумы какие-нибудь, ещё что-то. Я подумаю, что с этим можно будет сделать. Или картинка за заикается, зависает, или ещё что-нибудь. Если всё в порядке, то можно поставить плюсик и побежали дальше.
Так, ну, я так понимаю, что всё нормально. О'кей. Но если будет Ага. Всё нормально. Хорошо. Представлюсь. Меня зовут Антон. В IT-индустрии я уже с далёкого 2008 года. Начинал свой путь как хоникей. Э, кто не знаком с подобным термином, а это мальчик на побегушках. Я тогда ещё в школе учился и в этой же школе, собственно, обменивал компьютеры. Там Windows переустановить, монитор подключить, блок питания заменить, либо в сервис отвести компьютер. Вот.
А-а, занимался всяким разным: и фрилансом, и разработкой, и администрированием сетей, и видеонаблюдением. А-а, последнее время, где-то лет восемь уже, наверное, в тестировании в разных его видах, от ручного до автоматизированного. Аэ, основной язык Java, также дополнительный, там C#, PHP, JavaScript, Python иногда попадается. Вот. А здесь, в Оттусе, я являюсь руководителем курса базового по автоматизации тестирования на Джаве и буду рад вас видеть на курсе. Всех приглашаю, но об этом мы ещё поговорим чуть-чуть попозже.
А правила вебинара. Я попрошу вас активно участвовать, ставить плюсики в чат, реакции внизу можно ставить, каким-то образом дать мне понять, что вам понятен материал, особенно когда я спрашиваю, есть ли у вас вопросы и так далее. Второе, давайте не стесняться задавать вопросы. А сейчас, поскольку у нас это открытый урок, вопросы в чатик пишем. А на вебинарах мы обычно, я разрешаю включать микрофон и общаемся голосом, если есть такая возможность, если есть желание, потому что голосом решать гораздо удобнее все эти вопросы. Ну, сегодня формат такой, поэтому в чатике. Я вопросы из чата вижу. А-а, буду стараться на них отвечать. Пока ещё ни разу не пропустил ни один вопрос из чата, но если вдруг такое случится сегодня именно, и это будет моё первое, Ctrl C, Ctrl V, напоминаем, апаем. Вот. А не стесняемся. Почему не стесняемся задавать вопросы? Потому что вы пришли сюда за знаниями, я пришёл вам эти знания дать. У нас единая цель, и мы должны работать над этим вместе. Если вы не зададите вопрос, я не узнаю, что у вас этот вопрос есть, и я не смогу вам на него ответить, и вы уйдёте неудовлетворёнными, с неполным комплектом знаний и с недопониманием. Поэтому не стесняемся давать. Люди вокруг не подумают плохо, что вы задали какой-то вопрос, что вам что-то непонятно. Если будет слишком много вопросов каких-то офтопных, мы их вынесем просто на конец лекции. Хорошо.
Ещё а я буду периодически останавливаться, спрашивать, всё ли вам понятно. А в этот момент можно поставить плюсик в чатик, что всё понятно, всё хорошо, либо поставить вопросительный знак, что у вас есть вопрос. Я понимаю, что есть вопрос. Мы дожидаемся вопроса, я отвечаю на ваш вопрос, мы идём дальше, чтобы не было, что мы потом начинаем возвращаться, терять ход повествования, прерываться и прочее. Сначала присылаем в чат вопросительный знак. Я его вижу, я на него отвечаю, мы идём дальше. Договорились? Отлично. Всё супер, супер, отлично.
Сейчас я буду немножко рассказывать про US, а у вас есть возможность немножко рассказать о себе. Я буду понимать уровень аудитории, с какими знаниями вы пришли, насколько хорошо владеете материалом, тем или иным, там, Джавой, тестированием, неважно. Мы не про Playwright что-то говорим. Playwright, скорее всего, никто из вас не владеет. Ну, может, кто-то знает Selenium или что-нибудь ещё другое похожее. Вот. А-а, и, э, если есть какие-то определённые цели, с которыми вы пришли на занятия, тоже просьба их указать. Если вдруг я их не закладывал в сегодняшнюю лекцию, мы можем всегда немножко отойти от маршрута и их зацепить, если они где-то рядом по касательной и для них не нужно специально подготавливать целую базу. Хорошо.
Вот, пока вы пишите о себе, я расскажу о нас. Ous - это онлайн-школа с различными онлайн-курсами, как не сложно догадаться, да, у нас они для IT-специалистов, а от позиции Джуна до Лида есть по разным направлениям. Сейчас вы находитесь на открытом уроке направление тестирования, курс "Автоматизация тестирования на Джаве Basic". У нас есть Basic, у нас есть Pro, есть специализация, которая это всё дело объединяет. О, сильно. Михаил, супер. Вот. А, супер. Замечательно. Ручной тестировщик. QA web manual. Супер. Супер. Так, а-а, разрабатываются курсы специалистами, которые практикующие, а, и курсы постоянно обновляются. А у Оттуса есть образовательная лицензия. Что это для вас говорит? Это говорит для вас следующее. Вы можете сделать налоговый вычет за образование, там что-то в районе 13% в следующем году, но не более, чем уплаченный НДС за прошлый год. А это всё сложно. Если будет нужна консультация, наверное, можно либо в интернете спросить, либо в налоговой, либо, возможно, смогут, так сказать, у нас в отделе маркетинга они, по идее, должны обладать подобной информацией. Я сбросил, куда можно попробовать написать. Ну и вообще, если вопросы какие-то будут по курсу, в том числе, можно туда написать. Если они не знают, они передадут мне вопросы и обсудим. Вот.
А-а, ну, направления курса, я говорил, их много, да, это и программирование, и архитектура, и инфраструктура, и безопасность, дата science, идеи, и управление, и аналитика, анализ, и тестирование, собственно, где мы сегодня находимся. Ага. Так. Сейчас посмотрю. Давайте быстренько, кто представился. Разраб C++, C++, Java, needle QA, авто Java. Интересно узнавать что-то новое. Web manual QA. Ручной тестировщик без опыта. Автоматизатор Java + Selenium. А с маленьким опытом, но уже понимаю, что хочу в автоматизацию. Супер. Автоматизация - это вообще замечательно. Она открывает большое поле для экспериментов. Если вы считаете, что это такой путь к разработчику, это, наверное, не совсем правильно, хотя возможный путь, возможный сценарий. Если вы хотите заниматься разработкой, лучше идти заниматься разработкой. А через тестирование в разработку можно, но зачем? Вот это всё-таки разные немножко направления. И когда вырастете как тестировщик, вам не захочется падать в зарплате, падать в грейде и уходить в разработку. Вот. А, ну, автоматизация даёт, да, больше возможностей, больше рынок и всё такое. Хорошо. Первый автотест. Архитектор по тестированию, госкомпания. Угу. Супер. А, по-моему, так высоко у нас. Я не не не не не припомню ученика. Лиды были, а прямо архитекторы тестирования нет. Так. А, супер. Поехали дальше.
А мы предполагаем, что вы знакомы с Java, да, как я говорил, где-то на уровне того, что я показывал на прошлой лекции. Кто не присутствовал на прошлой лекции, вкратце скажу, мы там просто написали простенькое приложение, попробовали циклы, попробовали ввод с консоли, вывод в консоль и там посчитали какую-то формулу, по-моему, путь равен время на скорость. >> У. >> Вот. А мы ещё не говорили про сборщики, мы ещё не говорили про всё такое. Поэтому начнём мы со сборщика. Что такое сборщик? Я буду показывать на примере Maven. Есть альтернативы Maven. Это и если вы совсем по хардкору и IDE не для вас будете писать в блокноте, тогда есть ещё Ant. Вот. А сейчас два популярных, это Maven и Gradle. Я буду показывать на примере Maven. В Gradle похоже, но немножко по-другому. Что такое Maven? Да, это, как я сказал, сборщик. Что он делает? Он управляет зависимостями. То есть он подкачивает зависимости, а, которые необходимы. Это другие библиотеки, которые используются в нашей программе. Да, разработчики сейчас ничего не пишут с нуля. А есть какая-то библиотека, которая выполняет хотя бы часть функционала, которая нам нужна, и мы её будем использовать. А в нашем случае мы будем использовать библиотеку Playwright, мы будем использовать библиотеку JUnit. А я про них чуть позже потом порассказываю. Вот. То есть он это дело скачает, а он компилирует код. Ну, вызывает методы, которые компилируют код, да, внутри собой под капотом. Скомпилировать его можно и без Maven, да, там через чистую Java. Он может запускать тесты, он может упаковывать файлы в исполняемые, это JAR, WAR и так далее, артефакты. А он публиковать может в репозитории, а генерировать документацию различную. То есть это достаточно большой мощный инструмент, с которым можно работать. Мы его сегодня будем использовать только для управления нашими зависимостями, компиляции кода и запуска тестов. Упаковки в JARы и прочее нам пока не нужно. Аа пока не нужно. Вот глубоко туда не пойдём.
pom.xml - это главный конфигурационный файл нашего проекта. А здесь мы описываем всю информацию о нашем проекте, а именно а group ID, artifact ID, version. Что это такое? Group ID обычно это создатель. Там сегодня мы будем подключать Playwright. У него будет написано com.microsoft. Это его group ID. А artifact ID - это, собственно, артефакт, наша программа. В нашем случае это будет Playwright, да? И версия, ну, это версия. А мы можем управлять зависимостями, то есть подключать чужие проекты по group ID, artifact ID и версии. Мы можем использовать различные плагины для сборки, сборщики и прочее. Указывать родительские POMы, если у нас есть там сложная структура наследования, а репозиторий, откуда брать зависимости, свойства, профили, модули, а параметры различные тоже туда можно вносить и использовать. А мы попробуем опять-таки, а первые два-три, может быть, пункта. Нам два, в принципе, сегодня будет достаточно. Вот как выглядит обычный pom.xml, да? Это XML-файл. Кто не знаком с XML, это такой а способ разметки информации, а он состоит из нод. А нода состоит из значения ноды, допустим, это 4.0.0 в model version. А, и атрибутов - это вот первая строка XML NS и так далее. А мы всё копируем, пишем. В основном это у нас Dependencies, где мы указываем свои зависимости. Здесь указан как раз JUnit. А мы здесь можем описывать плагины различные сборки, генерации и прочего. Нам это пока не нужно. То есть мы будем использовать по минимуму пока опять-таки, но этого будет достаточно, чтобы запустить первый тест.
Вот репозитории Maven. А это то место, где лежат проекты, которые мы подключаем. Он бывает нескольких уровней: локальный. Он лежит у нас на компьютере. И когда мы первый раз скачиваем какой-то проект, ну, какую-то зависимость, которая нам нужна, она кладётся в локальный репозиторий и там лежит. Если нам она понадобится в другом проекте, он её опять качать не будет, он её заберёт из локального. А remote, и их бывает два: публичные и приватные. Публичные - это какие-то в интернете репозитории. Самые известные - это Maven Repository, про него там на следующем слайде. И удалённые приватные, допустим, внутри организации поднят свой репозиторий, например, на Nexus. Например, на Nexus. Вот. И там лежат проекты какие-то общие для всех команд, ваши проекты, команда и прочее, прочее, прочее, прочее. То есть это некий вот сборка всех этих а-э артефактов, программ, библиотек, которая вам нужна именно локально, только для вашей организации.
Так-с. А, ну, вот, да, самый публичный - это Maven Repository. Мы на него сегодня сходим. Я вам покажу, как он выглядит, как им пользоваться. Чаще всего вы будете использовать его либо начинать с него. Так, он пишет мне, что у меня плохая связь. Я не пропадал, коллеги. Всё нормально было. Всё, к супер, всё норм, замечательно. Хорошо. Так, а давайте на Maven Repository сходим, когда у нас будет практическая часть. Пока по теоретической части. Понятно ли вам, что такое Maven? Что он состоит из сборщика и конфигурационного файла pom.xml? И что в качестве что всей зависимости мы ищем в репозиториях, в частности, Maven Central. Отлично. Так, вижу минус. Давайте обсудим. Задайте вопрос. Может быть, у вас есть опыт в каких-то других языках программирования. Тоже можно майкнуть. Попробую, может, аналогию какую-нибудь привести. А, всё, всё хорошо, договорились. Всё, десинхронизация. Договорились. Всё, поехали тогда дальше.
Что нам будет нужно сегодня ещё? JUnit. Я говорил, что мы будем там использовать JUnit, мы будем использовать Playwright. Кто такой JUnit? Давайте в двух словах тоже познакомимся с ним. А это фреймворк для тестирования. А в первую очередь он разрабатывался как для unit-тестирования. А его используют разработчики, чтобы тестировать свой код. А мы его используем, чтобы запускать наши end-to-end тесты, интеграционные тесты. То есть это такой большой тестовый фреймворк. А вопрос, зачем он нам нужен? Мы же можем просто написать программу, которая будет делать то же самое без тестового фреймворка, да? Пробегает такая мысль или нужен, значит нужен. Никаких вопросов нет. Если есть, значит, молчат. А на самом деле, да, можно написать программу, сделать точку входа там, да, вот можно написать без использования JUnit. Можно писать, а программу, которая будет точкой входа запускать все наши тесты, а внутри делать проверки, возвращать в каком-то виде отчёт. Это будет даже работать. И я видел как минимум один проект, где так работало. Но вы не представляете, насколько сложно это потом поддерживать и обслуживать становится. А если мы хотим это сделать красиво, то уже проще использовать готовое и не пилить костыли, да. Поэтому используем тестовые фреймворки, не изобретаем велосипед и радуемся, что всё есть. Потому что если мы пишем это как программу тестовую, у нас есть функция main. Эта функция запускает какие-то классы. В этих классах происходит в конструкторе запуск тестов. А что-то ещё как-то это выводится, потом информация должна сагрегироваться, отправиться дальше, а, в какую-нибудь систему отчётов, да? А это сложно, это сложно поддерживать, это сложно обслуживать. Когда мы используем тестовый фреймворк, мы их кладём в определённую папочку test, наши тестовые классы, помечаем методы, которые нужно запускать на этапе тестирования, аннотацией @Test, и больше ничего не делаем. Там помимо аннотации @Test ещё много интересных аннотаций есть. Мы сейчас посмотрим на них. Но мы просто помещаем аннотации. Анотация - это слово через собачку, перед классом, либо перед методом, либо перед полем. Поле оно же свойство - это переменная класса. Вот. Аэ про классы мы особо много не говорили, но давайте так. Класс - это шаблон для объектов однотипных. А если что-то из современного там физического мира, да, классом может считаться автомобиль, классом может считаться человек, и у него есть какие-то свои поля одинаковые для всех, да, там количество рук, количество ног, имя, фамилия, отчество, возраст, что-нибудь ещё или там марка-модель, тип двигателя, объём двигателя, количество лошадиных сил и что-то ещё. А экземпляр класса - это конкретный представитель данного класса, да? То есть это автомобиль Toyota Corolla 2013 года выпуска с VIN-кодом таким-то, таким-то и так далее. Или это вот я или кто-то из вас как представители класса человек, да? Вот. А свойства класса - это его поля, переменные, а методы, это то, что данный класс может делать, данный объект может делать, да, там ходить, говорить, переставлять, танцевать, руками дёргать и так далее. Вот это всё методы, то есть это некие действия класса.
Что, собственно, делает тестовый фреймворк JUnit? В частности, помимо JUnit есть другие тестовые фреймворки. Такой главный конкурент - это TestNG. Вот я опять-таки буду показывать на примере JUnit как более массового, но помните, что есть другие сборщики, другие тестовые фреймворки. Это не единый путь, могут быть немножко другие. Вот позволяет помечать тесты как методы как тесты, да, чтобы их запускать автоматически. Запускает автоматически там он встраивается в жизненный цикл Maven, то есть мы mvn test нажимаем, ну, пишем в консоли, да, и у нас всё это запускается. За счёт этого мы можем запускать это из IDE, IntelliJ IDEA, как пример. Мы можем запускать это через mvn Gradle, как я привёл пример, да, мы можем это запускать через CI, проверяет ожидаемые результаты, а, делает отчёт. JUnit там в формате XML делает, можно его, а, потом подгрузить куда-нибудь и почитать. Вот сколько тестов прошло, упало. Поддерживает настройку окружения, то есть before, after auto, preconditions, postconditions, так называемые, то, что мы делаем перед тестом, предусловия, постсловия. Вот. А, то есть он всё это дело берёт на себя, вместо того, чтобы мы этим занимались сами. Какие версии JUnit есть, да? А тройка уже я её даже не застал, наверное, будем так говорить. Четвёрку застал, пятёрка работал, шестёркой чуть сложнее. Она вот совсем свеженькая, я её ещё не щупал, поэтому я буду показывать на примере пятёрки. Вот четвёрка уже на Legacy осталась. Legacy - это старые проекты, которые перешли в режим поддержки и вывода из эксплуатации. То есть то, что ещё живо, но то, что уже не особо развивают, а и так далее. Ну, иногда развивают, но это редко. Скорее всего, там либо какой-нибудь баг критично начинают править, либо ещё что-нибудь в этом духе. Вот Legacy - это в основном на поддержке.
По поводу аннотаций, да, я говорил, что это знак собачки и дальше какое-то слово. И вот это слово, собственно, говорит о том, что с этим методом, с этим свойством, с этим классом делать. А у нас есть замечательная аннотация @Test. Мы её будем сегодня использовать. Это, собственно, указание, что данный метод является тестовым. @BeforeEach, @AfterEach - это аннотации, которые показывают, что нужно то, что описано в следующем за этой аннотацией методе аа запускать перед каждым тестом либо после каждого теста. @BeforeAll, @AfterAll, соответственно, запускается один раз перед всеми тестами в классе и потом после всех тестов в классе. @DisplayName - это просто красивое имя для отчёта. @Disabled - это выключение теста. Параметризированные тесты поддерживаются. Можно запускать, когда у нас тест одинаковый, но входные данные несколько разные. Допустим, разные типы учётных записей или ещё что-нибудь в этом духе. А need вложенные классы с тестами. @Tag - это чтобы можно было запускать по тегу там только smoke, только regression, только ещё что-нибудь, только full regress и так далее. То есть вы теги можете настраивать так, как вам нужно. Там может быть тег чисто по задаче, тег regression, тег ещё какой-нибудь. Вы можете сами создавать сколько столько, сколько вам нужно. По аннотациям понятно. Мы будем сегодня использовать первые три. Зачем? А так всё это это читал, это помню. Так-с. Хорошо. По JUnit. Остались ли у вас вопросы? Понятно ли, что это за библиотека? Зачем она нам нужна? Отлично, отлично, отлично, отлично. Так, вопросительных знаков не вижу. Огонь. Поехали дальше.
Playwright, вторая библиотека, которую мы сегодня будем использовать. Кто-то уже там писал выше, что знаком с Selenium. Это альтернатива Selenium от Microsoft. А современный инструмент для автоматизации браузеров, да, end-to-end тесты, так называемые, разработан Microsoft, поддерживает, в принципе, все необходимые браузеры: Chromium, Firefox, WebKit из коробки. Может работать в headless и headed режимах. Это когда UI отрисовывается и не отрисовывается. У него встроены retry механизмы, встроены инструменты codegen, trace viewer, но это пока всё не особо нужно. Давайте просто хотя бы напишем первый тест и увидим, что там что-то происходит. Вот.
А-а, какие основные команды, да? Нам нужно всегда наш Playwright сначала запустить, потом в Playwright запустить браузер, а и, а, создать страницу, то есть открыть вкладку и в этой вкладке уже что-то делать, то есть переходить на какие-то страницы, щёлкать, кликать. Вот, собственно, основные команды, да? У нас есть класс Playwright. Вызываем, создаём переменную Playwright. Можете по-другому назвать. А класса Playwright, да? И через команду Playwright.create мы его, собственно, создаём. Потом здесь мы запускаем Chromium. Это Chrome, это Яндекс браузер, это у Mail, по-моему, тоже на Chrome узер это программа Яндекс. >> Хватит, извиняюсь. Вот page - это сама вкладка. Вот page.navigate - это для перехода. get в Selenium, да, кто работал. Просто ввести в адресную строку какой-то адрес сайта. Можно заскриншотить, если кому надо, и пойдём дальше.
Пере Так, есть ли функция автозаписи как LoadRunner? Это вы имеете в виду, чтобы настроить на брак, и он записывал, какие кнопочки вы тапаете в браузере? Честно говоря, не знаю, для Selenium что-то подобное было, но я такими вещами обычно не пользуюсь. Эти тесты потом поддерживать очень сложно. Он же ж не создаст архитектуру. То есть так для разовых каких-то проверок можно попробовать. А для сайтов со сложной вёрсткой? В смысле? Да. А-а, смотрите, а-а, первый вариант: попросить разработчиков добавлять локаторы. Это сложно. А, скорее всего, они будут плеваться. Допустим, там атрибут title какой-нибудь, да, data-testid или ещё что-нибудь в этом духе для автотеста. А второй вариант, а, чуть сложнее в продавливании бывает, но зато легче в использовании потом. Это попроситься к разработке а доступ в репозитории фронта и добавлять туда самостоятельно. Для этого необходимо некоторые определённые знания, как обычно, да, там немножко с фронтом быть знакомым, там с каким-нибудь JavaScript. Вот. Но зато на выходе вы получаете возможность добавлять тестовые идентификаторы на любой элемент в любое время, и они достаточно быстро такие вещи будут контривить и пропихивать это вперёд. Это лучше, чем пытаться record play. Есть ещё один вариант, это копирование XPath, CSS-селекторов из браузера, из самого, но тут проблема в том, что это не самый стабильный подход. Вот предложил. Все удовлетворены ответом или хочется обсудить ещё? О'кей, давайте обсудим попозже. Напомните, к концу лекции мы пообщаемся на эту тему. Хорошо. Вот огонь.
А тут мы обсуждали различные взаимодействия со страницей, да? Это перезагрузка, обновить, это назад, это вперёд перемещение. Это тоже позволяет делать Playwright. Не так часто нужно. Может, почему решили заменить Playwright на Selenium? А никто не решал заменить, просто конкурент. Конкуренты, признаюсь, способствуют развитию обоих продуктов. Кому-то нравится одно, кому-то другое. Я чаще с Selenium работаю, чем с Playwright. Я с Playwright, по-моему, работал один раз. И это было на JavaScript, и это было лет семь назад. То есть чаще я всё-таки Selenium вижу, особенно в Legacy каких-то проектах. Он чаще встречается пока, но со временем Playwright тоже придёт, будет чаще пользоваться. Вот поэтому это просто пути развития. Появляются новые библиотеки, новые конкуренты, рынок цветёт и развивается.
Также мы можем получить данные с страницы. Это URL, на котором мы находимся, title страницы, содержимое страницы. Ну, контент вы вряд ли захотите получать, а вот там title иногда нужно. А основные способы поиска элементов, да, мы чаще всего мы ищем по локаторам всё. А для этого мы указываем нашу страницу.locator метод и указываем локатор. Причём неважно, это XPath или это CSS-селектор. И сохраняем это всё в переменную с типом locator. И дальше с этой переменной мы уже можем работать. А именно, мы можем вводить текст. Он при этом предварительно очистит поле. Мы можем, а, вводить посимвольно, да, как будто бы прямо по клавиатуре человек стучит. Это как будто бы Ctrl+V нажали, а это прямо по клавиатуре стукнули каждый символ. Аа очищать поля текстовые, да, например, если нам нужно. Мы можем кликать по элементам, причём левой, правой кнопкой мыши, с какой-нибудь кнопкой зажатой, двойным щелчком. Это всё тоже можно делать. А причём в Selenium, допустим, только клик доступен. А всё остальное, либо это с использованием библиотеки Actions, либо это с использованием какого-нибудь JavaScript. То есть на прямки такого прямого взаимодействия нету. А чекбоксы, радиобатны, да, это вот эти вот галочки, точечки. Мы можем их check, uncheck, setChecked, да? То есть uncheck - это поставить чек, снять чек. Если у нас есть булево значение, которое нужно передать, то тогда setChecked используем. То есть это универсальный там по под капотом используется как раз setChecked. Скорее всего, мы можем получать данные из элемента. Это его текст видимый, это внутренний текст, это а различные value для инпутов, да, input type и так далее, input type password, а радиобатны там прочее, прочее, прочее. Аа можем получать данные по атрибуту, то есть атрибут, как в XML, да, то есть через пробел написано атрибут значение. А я как
Раз предлагал вот Алексею получить доступ к фронту, чтобы делать атрибут тит, да, тест ID, а можно получить значение таких атрибутов. В этих атрибутах у нас может быть такие самые знаменитые, известные. Это класс, это хрев, да, то есть это ссылка либо класс, который используется. Вот можно это дело тоже использовать в тесх, если есть такая потребность. Понятно базовый минимум, что может делать Playб. Так, я так понимаю, и плюсы, и минусы. Это что? Всё понятно. Давайте вопросительные знаки, если непонятны. Отлично, договорились.
Так, тогда теперь можно немножко откинуться на кресле, а-а, я немножко расскажу про сам курс, а потом перейдём к практической части и посмотрим, как это всё будет выглядеть в ADE. А, собственно, курс у нас - это автоматизация тестирования на Java. А-а, у нас в программе курса подготовка есть для разного уровня, да, подготовки специалистов. У нас есть модуль, посвящённый ручному тестированию, модуль, посвящённый Джаве. Аа, и только потом мы начинаем знакомиться, собственно, с тестовым фреймворком, с автотестами и всем остальным. У нас есть ещё отдельный по SQL модуль, я вспомню. Вот. Аа у нас на курсе основной фреймворк - это не основная библиотека для работы с веб-тестами - это селению. Вот. А-а, есть вторая ступень, да, которую я говорил, что, а, это прокурс, там уже более сложные сценарии, там изучают и Play WR, там изучают и API, там изучают BDD подход, там изучают тестирование апии, создание заглушек через код и много-много всего ещё интересного. Там посложнее, там поинтереснее. Если какие-то базовые понимания есть, возможно, стоит рассмотреть его. Если ручное тестирование, только знакомость с Жавой вообще без тестирования, возможно, есть смысл начать с первого курса. Вот. Ну и опять-таки, кому что нужнее. Если нужно фронт тестировать, то это в основном база. А под слоем лежит Play всё равно выполнит, например, клик. Под каким слоем? То есть элемент перекрыт другим элементом. Не, не должен. Я не проверял, но не должен. То есть он под модалку под какую-нибудь не залезет. А, ну селениум точно не лазит. Playрай не должен лазить, потому что они все эмулируют работу пользователя. Если элемент недоступен для клика, то он не будет кликнут. То есть теоретически можно как-нибудь через Java, через JS, через JavaScript туда прямо инъекцию сделать, про взаимодействовать, но это больше не про Play Wright. Ответил на ваш вопрос, Кирилл. Угу.
По преподавательскому составу. Кто ведёт на базе? Да, это я, это Павел, он будет вашим ментором, будет вести практики, некоторые темы его освещать. Он работает в ВК Тех. Сергей Мирошин, он в основном руководитель курса Прошки, иногда приходит к нам что-то почитать. Яна Телегина, она работает в МТСе, QАЛОМ. А тоже очень хорошие отзывы о занятиях с ней у студента, от студентов я получаю. Вот все преподаватели сильные, не ниже синьора, все рады делиться знаниями, поэтому вопросов тут обычно не возникает. Вот обучение проходит в живом формате вебинаров, то есть мы созваниваемся в раньше это был Zoom, сейчас это МТСН. Вот. И общаемся прямо в режиме реального времени, как мы сейчас с вами. Только у вас есть возможность включить микрофон, камеру, если захотите, и пошарить экран, задать вопросы по коду, в том числе. А нетворкинг. У нас есть группа в различных мессенджерах, где мы общаемся, создаём коммьюнити. Записи занятий остаются в личном кабинете на протяжении всего, всей доступности Отуса. проект, который вы выполните в конце курса. У нас есть проектный модуль, можно использовать как портфолио. По каждому занятию, занятию заданию вам оставляют фидбек преподаватели, кто проверял. Программа обновляется постоянно. Вот. А можно по QR-коду перейти посмотреть на программу курса. Следующий стартует в этом месяце в конце. И буду рад вас там видеть.
А, а теперь перейдём кла презентации. Я буду использовать, а, этот IDE Intel G ID, а вы можете использовать её же. А запись занятия будет загружена в ВК, аэ, можно будет потом повторить всё это дело. Я создаю проект просто с мабаном. И актуальна для меня версия Java. Я использую двадцать вторую, если кому интересно. Так, сейчас я перешарю экран. Завершить демонстрацию. Начать демонстрацию окна. Вот этот вот. Так. А вот новосозданный проект. Давайте я камеру отключу, чтобы не отвлекать вас. Вот у нас есть ново созданный проект. Давайте первый вопрос. А достаточно ли крупно видно? Всё ли читаемо? Всё ли хорошо? Можем ли мы продолжать? Отлично. По умолчанию у вновь созданного проекта открывается PXML. Как мы помним, это основной конфигурационный файл, где мы всё это дело видим. А, да, я вам не показал MAV репозитории. Давайте сначала туда сходим. А вот мы пришли к моменту, когда нам нужно сюда подключить зависимости. Да, у нас этот Git и это у нас Play WR. Давайте я остановлю демонстрацию, начну демонстрацию другого окна. Оп. Так-с. Видно, да? Это, собственно, центральный репозиторий Мана. Как мы тут ищем что-то? Мы заходим на основную страницу и дальше мы хотим найти playwe. А можем найти, если мы знаем, группа ID, артефакт ID по ним. Можем написать просто playght, но тогда у нас выскочит очень много различных, а библиотек, которые нам не особо нужны. Вот я просто вот com Microsoft Playwrite написал. Это наш груп ID. Теперь мы можем провалиться внутрь. посмотреть версии, выбрать какую-то версию, которая нам нравится, которую мы считаем актуальной. А дальше перейти на вкладку зависимостей. А, извиняюсь, не туда, вот здесь внизу спуститься. А, и здесь посмотреть, собственно, как это дело подключается в мане, град и где ещё мы там будем это дело подключать. Берём MAVН, вот это дело копируем, и я чуть-чуть попозже покажу, куда вставляем. А также ищем Git. Это понятно. Библиотек тут очень много. Если выйти на главную страницу, 65,6 млн библиотек. Я думаю, вы всегда сможете найти себе что-то, что вам будет нужно. Для каких-то популярных инструментов всё есть зачастую. Так-с. О'кей. А тогда возвращаемся в IDE. Вот у нас наш PXML. Мы здесь в каком-нибудь месте, обычно внизу создаём новую ноду. Вот он даже её подсказывает Dependentis, а во множественном числе. И сюда мы будем вставлять все библиотеки, которые нам нужно подключить. Я был немножечко подготовлен заранее, поэтому у меня эти библиотеки есть под рукой. А вот они. Вот они. Это, собственно, Playbrite и Gunit 5. После того, как мы подключили библиотеки, ну, тут мы можем увидеть группа ID, мы можем увидеть артефакт ID, мы можем увидеть версию также нашего проекта. Если у нас это будет выгружаться в какой-то локальный репозиторий по вот этим группой ID, артефакт, ID и версии, можно будет подключать как библиотеку к нашему проекту это дело в будущем. Аа так мы нажимаем вот сюда вот. Не знаю, видно вам эту кнопочку? Там синенькая буковка М в правом верхнем. Да, видно. Вот на эту кнопочку мы нажимаем. И в этот момент происходит подгрузка всех библиотек. Поскольку они у меня уже локально скачаны, у меня ничего не качалось. У вас в первый раз вот здесь вот внизу побежит загрузка данных библиотек из а центрального репозитория. Одного монитора всё-таки мало. Пойдём дальше. Аа, как я на прошлом занятии говорил, да, стандартная структура проекта - это папочка source. В ней есть папочка main, где пишется основная программа и папочка тест, где пишутся наши тесты. Вот в папочке тест мы создадим новый Java class и как-нибудь его назовём там, не знаю, first test. Извиняюсь, тут котик буянит на заднем фоне. Могут быть шума. Так-с. А вот он у нас, собственно, наш первый тест. Что нам нужно сделать? А, в первую очередь нам будет нужно, а, сделать следующее. Аа нам нужны следующие переменные, которые мы будем использовать. Это, собственно, сам Playwgriite, это браузер и это страница. В селениуме кто работал, это аналог нашего драйвера из селениума. А переменные обычно выставляют приватными, а вам не нужно делать их публичными. А про приватные и публичные - это уровень доступа перемен к переменным из других классов. Ставьте приватные, пока этого будет достаточно. А Playwrite, назовём её playght. Private браузер браузер и private page. Это, собственно, страница, с которым мы будем взаимодействовать. Вот класси всё. А это наши переменные. Теперь нам нужно сделать, что нам нужно включить браузер, а после теста не забудь его выключить. А помним, у нас есть аннотации before each, авто, и они сейчас нам подойдут как нельзя. Кстати, а давайте сделаем первый метод, который будет запускать браузер, а он публичный, он нам ничего не возвращает в void. Назовём его set up. Что мы здесь сделаем? Мы должны в первую очередь запустить Playwrite. То есть мы берём нашу переменную Playwght и кладём в неё запущенный Playwrite. Да, playwright. Дальше нам нужно подготовить наш браузер. Мы делаем браузер Playwrite. А выбираем браузер, который мы хотим использовать. Пусть это будет Chromium, и говорим launge. Сюда мы можем передать различные параметры. Аа давайте передадим, потому что в стандартной конфигурации нам будет не очень, наверное, удобно. New launch options точка. Поехали. А, set headless. Во-первых, выключим headlessрежим, потому что мы хотим видеть, что у нас происходит. Set headless false. И второе - это set slow mo. Не знаю, будет ли что-то видно. на 300 мисекунд, но может быть, но может быть. Вот. И тут можно также дальше продолжать его конфигурировать, если нам что-то нужно будет дополнительно сконфигурировать с браузером. Дальше мы получаем страницу из нашего браузера и кладём её в переменную страницу браузер. В принципе, вот это минимум наш базовый. А если наши тесты в данном классе работают с одной и той же страницей или ещё что-то, мы можем сразу открыть нужную нам страницу. page точка navigate и передать сюда строкой URL страница. Все тесты, которые я сегодня буду писать, будут на одной и той же странице. Вот на этой. Кто захочет дома попробовать попрактиковаться, пожалуйста, мне не жалко. Так, а, ну и можем дождаться полного открытия. Давайте тоже сделаем page точка wait for state. Wait for load state. И здесь давайте load state дом content loaded. То есть у нас загрузился полностью дом. картинки ещё могли не прогрузиться, но сам дом уже работает. Там стили могли не подгрузиться, то есть мы уже можем потихоньку взаимодействовать со страницей. Если уй страниц динамическими, ну тогда от базовой страницы идти. Или вы про то, что у вас есть там defр stage контур и эти урлы разные. Второе, да, я так понял. Это можно через параметризацию сделать. Это через параметризацию можно сделать в Джаве там. А когда вы запускаете Java проект MVN clean test - D URL и указываете URL там base URL, да, вот там у меня это US home, ну, допустим, будет это вот defstand, да, а есть ещё там stage. Cartous. Я вот эти пути меняю при запуске, и он будет в разные стенды бегать. Можно сделать разные окружения и дать им целый набор переменных, которые будут использоваться именно для этих окружений. А, то есть это можно сделать. Можно туда же в переменные запуска вынести аа браузер, на котором запускать. Это будет там Chrome Firefox ещё что-то. То есть такие вещи можно делать. Это не является проблемой. ответил на ваш вопрос, Алексей. Ага, хорошо.
Так, а, а после теста нам нужно не забыть закрыть браузер. Почему? Потому что сам по себе он не закроется. А если мы их не будем закрывать после себя, в какой-то момент времени нам придётся либо бежать ручками, всё это закрывать, либо придётся перезагружать компьютер, что тоже неудобно. Не забываем закрывать за собой всё это дело. Так, а давайте так. И Назовём метод и а проверяем, если неравен, ну, чтобы не словить null point exception, тогда page close page то закрываем страницу. открывали Playwite браузер страница закрываем в обратной последовательности ifурнал нал браузер close if play канал точка. Всё, у нас запустилась страница. У нас а страница браузер со страницы, да? И у нас закрылась страница, закрылся браузер, закрылся playwраge. Утечих памяти быть не должно. А с этим разобрались? Понятно, что здесь написано. Что? Так, вопросов вроде нет. Давайте попробуем первый первый тест какой-нибудь написать. Ставим аннотацию тест. Делаем публичный, ничего не возвращающий метод. А давайте прямо по-красивому, что ли. Shoot have f А. Correct title title. Значит, у нас есть стринговая переменная expected, и это некая константа. Я её просто сейчас скопирую. Вот она. У нас есть некий актуал, да? Это тоже строка string actual. И нам её нужно получить из браузера. Собственно, мы обращаемся к нашей странице page точка title. И теперь мы можем использовать библиотеку Gнита Assertions, assert equals. И а сначала мы передаём сюда ожидаемый результат expected, потом передаём актуальный результат act. Ну, если хотим, можем дать какое-то помечание для ошибки, ну, при возникновении ошибки какую-то строку. Ну, сейчас мы не хотим этого делать. Вот он, простой тест. А сейчас я его запущу, вы браузер не увидите, но он и появится буквально на долю секунды. Я потом пошарю весь экран. Будет мелковато, но потом посмотрим. Вот тут пока смотреть особо не начем. Вот так. У нас есть ожидаемый результат, что это тренажёр для оттачивания навыков по работе слениум. Актуал тренажёр для селениум, потому что я скопировал не ту строку, но замечательно, мы получили сообщение об ошибке. Теперь мы можем посмотреть его. Если у нас тут был бы месседж какой-то, то мы бы этот месседж тоже здесь увидели. Ну, например, что это за проверка, где она находится или что-нибудь в этом духе? какие-то дополнительные комментарии, которые помогут при разборе данной ошибки. Вот оно сообщение. Я его пока уберу. Мы можем теперь проверить. Это баг теста. Мы вставили сюда не те данные, это баг на сайте, там некорректно данные разработчик вёл. Ну и в зависимости от того, что мы хотим, где нашлась ошибка, мы то и предпринимаем. В нашем случае ошибка нашлась в тестах, и мы правят наши тесты. Обновление произошло на сайте. Мы запускаем его ещё раз. И у нас теперь должен быть зелёненьким тест. Всё, тест зелёненький. Логи мы пока не используем, их тут нету. Я тут пропустил буковку. Так, понятно ли, что здесь произошло в таком простеньком первом нашем тесте? Сейчас мы попробовали с вами получить данные со страницы. Ну, в данном случае это тайтл был просто ничего серьёзного, но мы его получили. Мы использовали библиотеку для получения сравнений результатов. Посмотрели, как выглядит ошибка, посмотрели, как выглядит удача. Есть ли у вас сейчас на этот счёт какие-то вопросы? Понятно ли, что здесь написано, или хочется что-то обсудить? Едем дальше. Вопросов нет. Понятно, понятно. Огонь.
Теперь давайте что-то чуть-чуть посложнее повзаимодействием со страницей. А если вы переходили на страницу, там есть большая оранжевая кнопка "Нажми меня". И когда вы её нажимаете, там увеличивается счётчик чуть ниже количество нажатий. Вот, давайте мы попробуем это дело сейчас с вами и протестировать. Мы создаём тестовый метод public void. Ай, butonчек, я назову его. А, бан чек. Что мы делаем в первую очередь? Нам нужно найти наши элементы на странице, с которыми мы будем взаимодействовать. Они имеют тип данных локатор. В селениуме это weбэлемент, если что. Аналог, да, мы даём имя, это butonk. А button мы его как-то сейчас найдём с вами. И локатор counter cun. Так, как мы ищем? Мы обращаемся к нашей странице. У неё есть метод локатор. Сюда мы передаём, собственно, наш локатор. Я буду использовать XP. Он у меня уже заготовленный. Там очень удобные локаторы, там всё с айдишниками. А с этим проблем у вас возникнуть не должно на именно на этой странице. На других чуть сложнее, но про локаторы это можно прямо отдельную лекцию посвятить, как их искать. Пока просто вот айдишник - это звёзд решёточка и дальше сам ID. Если у нас класс, то точечка и дальше сам класс. Ну, имя класса. Если несколько классов через пробел, а не через пробел, слитно. Через пробел - это когда к наследникам обращаемся. Вот. А, но именно на этой странице будете практиковаться, там нет, нет ничего сложного. Дальше у нас есть наши элементы. Что мы хотим дальше сделать? Давайте мы теперь а-а будем кликать по кнопке несколько раз и потом сравним с тем, что у нас на выходе получилось. Да, у нас есть цикл for счётчик. Мы его на прошлой лекции не особо касались, но он один из самых простых. А мы просто говорим, что у нас есть переменная и, которая начинает свой счёт от нуля. А продолжается пока i меньше пти, то есть это 0 1 2 3 4, то есть пять раз. И каждый раз мы будем и увеличивать на единичку. После чего мы должны обратиться к нашей кнопке и вызвать у неё метод клик. Аа, и потом мы хотим получить значение, да? То есть мы берём string, а actual и а получаем его из нашего каунтера. Counter точка а innerтекст. Давайте так сделаем. И, собственно, проверяем assertions. Assert equals 5 и actual. А там кнопка чеки- это чуть ниже. А, нажми меня. Там такая большая кнопка. Мы вот на неё кликаем сейчас. Понятно. Александр, я А спасибо, спасибо. Клик. Спасибо. Что-то это глаз замыливается к вечеру уже, извиняюсь. Бывает. Это был у меня как-то опыт. Я тогда писал какую-то программу, написал красивый большой метод. Я не мог понять, почему он не работает. Я его не вызвал. Я где-то час, наверное, сидел и искал, где он вызывается. Это было давно. Я был очень молодой. Я не мог нажать правой кнопкой мыши здесь find usage. Вот. Но я не мог, почему он не работает, понять, потому что он не вызывался. В итоге бывает. Так-с. Вот у нас, собственно, наш тестовый класс. Давайте теперь я пошарю весь экран. А перед этим ещё раз прочитайте сам тестовый класс. Если по нему вопросов нету, я сейчас пошарю весь экран, запущу и а вы посмотрите, как это выглядит локально с запуском, но будет мелковато, конечно. Если есть вопрос, прямо номер строки можно скидывать и обсудим. 1 2 3 4 5 дочитали или ещё дать немного времени? Так, пошли плюсики. Значит, времени не хватало. Ну давайте ещё пару-тройку плюсов и пойдём дальше. Что, всё понятно. И вот пара плюсов. Хорошо. Огонь.
Так, теперь я демонстрирую вам весь экран. Завершить демонстрацию, начать демонстрацию. Весь экран поделиться. Вот наглядный пример, что такое рекурсия. Очень мне нравятся такие штуки. Давайте. Оп, вот она, наша программа. Опять наш тест. Мы его запускаем и давайте посмотрим, как это будет выглядеть. Вот здесь сейчас появится браузер. Так, успели увидеть, как циферки росли, или помедленнее надо сделать? Давайте помедленнее сделаем. Давайте секунду между ними, между нажатиями сделаем. Мы где-то 5 секунд будем висеть. Вот сюда вот смотрите. успели отлично. Так-с. Хорошо. Давайте я вернусь обратно к коду. Мы его ещё раз посмотрим. И давайте, наверное, я вам покажу ещё один бонусный бонусную штуку. Давайте сделаем скриншот экрана и посмотрим ещё на скриншоте. А Playbright такое тоже умеет. Для этого мы обращаемся к нашей странице. У неё името скриншот. А дальше мы должны передать сюда опции нашего скриншота, new screenshot options и установить путь, где этот скриншот будет лежать. Set. И дальше pass get pass то get. И здесь указываем, куда я хочу, чтобы он создавался. Там папки проекта, папочка создал себе скрин. И дальше я не знаю, ну, пусть будет там по названию теста button check точка PNG. Ну, поскольку эта строка, сюда можно там ID прикрутить какой-нибудь, ещё что-нибудь, а, тайм, метку, дата, время, да, ещё что-то, что вам нужно. Ну, у нас пока хватит такого. Теперь я запущу ещё раз тест. уже вам браузер показывать не буду, там ничего не поменялось. И мы увидим, когда тест пройдёт, что у нас появился скриншот. Вот у нас появилась папочка скрин. И здесь появилась button check. И мы видим наш скриншот. Скриншоты удобно прикладывать к отчётам, чтобы было понятно, где, допустим, падение произошло. А ещё для этого можно через инъекцию джаваскрипта подсвечивать элементы, на которые нужно обратить внимание, там, на которые мы хотели кликнуть, которые мы хотели проверить или ещё что-нибудь в этом виде. Так-с. С этим понятно? Вопросы какие-то остались у вас? Отлично. Отлично.
Тактактакну давайте обсудим. Алексей, да, драйвер не нужен. А, да, я не указал. Может потребоваться единократно установить внутри папки. Если используете Ман, это можно сделать вот такой вот командой в терминале сами браузеры. Вот. Но вот в одном проекте я так делал, во втором проекте я не делал. Он уже подтянул из первого, скорее всего. Вот, возможно, один раз нужно будет вот это сделать. Он сам поставит браузер и будет всё работать. В Селениуме с драйверами, кстати, есть отличная библиотека вебрайверменеджер. А-а, с помощью неё удобно драйвера докачивать актуальные. Может ли веб-сервер отличить? Ну, обычно они через какое-то время, если у них настроена защита, они поймут, что что-то не так, и начнут копчу вбивать. То есть просто ходить по сайтам и сёрфить их через playра вряд ли получится. Ну, какие-то простые можно, может быть, у вас получится как-то это более тонко настроить с разными тайм-аутами, с рандомными, как будто это обычный пользователь и прочее. Код открытие терминала. Честно, сейчас не вспомню. Надо загуглить. Ну, Google вот такую команду предлагает для генерации. Можно её даже попробовать MCP model. Сейчас MCP и агент. Честно не знаю. Всё. Вот. Не, не, не знаю. Можно попробовать? Вы хотите к иишке подключаться через playрай и пытаться с ней взаимодействовать как-то таким образом? Скорее всего, на копчу попадёте. А этот начал банить. Скажите мне чат GPT аккаунты, которые такую, а, и агенту досо в интернет через Playwright. Честно, наверное, что-то есть, но я такого не видел. И нужен ли ему плейбрав для этого? Он, в принципе, наверное, нормально и с HTMLэлем будет взаимодействовать. Ему снять скриншот со страницы, понять, что это кнопка, нажать на неё или в в HTMле понять, что это кнопка и на неё тапнуть нужно. Я не пробовал. А, по идее, не должно возникнуть проблем. Единственное, что там могут быть различные айфреймы, и нужно будет посмотреть, как между айфреймом перемещаться. Для селениума это там driver switch 2 и iframe указываете, в который переключиться нужно. А для плейбрайта, ну, что-то аналогичное должно быть. Вот по поводу этого демонстрация экрана. Весь экран всё настолько, э, надёжно, насколько вы это напишете надёжно. вообще можно использовать. Используют селениумы Playwrite. Можно вот он код из этого. А, ну вот, собственно, то, что вы и хотели, чтобы этот повторял за вами действия. Ну, это будет использовать не очень удобно. И вон, видите, для main точки входа нужно будет немножечко переписать. Ну, вообще можно использовать, если надо. Запустил я его вот, собственно, вот этой вот команды, которую сбрасывал чат выше. Так, APBD AP можно использовать Шурне он нравится больше. Он попонятнее, попроще, наверное, будет. Как первый можно использовать сприн для BD можно использовать SPRН, если вы не особо хотите писать SQL-запросы. А либо можно использовать GTBC и код Gen записывается. Ну мы его запустили через MA, да, он будет на Джаве писаться. для других языков, скорее всего, будет на на родном, из-под которого вы запустили. То есть тут в команде, если посмотрите, MVN это как раз MAV exec, то есть запустить из мавена Java и пошло, пошло, пошло, пошло про этот про playghte. Какие есть требования по доступам или библиотекам для выполнения тестом? Зверский ИБ в контуре. Интернет запрещён, ничего тянуть нельзя. Так, спасибо большое, Севала. Так, Алексей, смотрите, по требованиям можно открыть MAV репозиторий и посмотреть, какие зависимости использует Playwe. А сейчас я вам покажу, где это. Да, это давайте, если кто-то уже сбегать планирует вдруг, можно я вас попрошу опрос пройти, копировать адрес ссылки. Пока общаемся. Это для меня в первую очередь я читаю, смотрю, чтобы потом улучшить проведение уроков, поэтому попрошу заполнить. Там нужна авторизация на сайте Отуса. Так, оп. Вот мы проваливаемся в библиотеку, которую используем. Здесь есть, а, dependencies. А, надо зайти в версию. Вот. Dependencies это какие используются данной библиотекой библиотеки. И таким образом можно раскручивать, пока вы не дойдёте до какого-то лимита. Но это с безопасниками всегда тяжело. Надо дать им ссылку, скорее всего, будет вот сюда вот на версию, которую вы хотите. Они это дело сами изучат. Обосновать, что это нужно для тонтестирования, повышения качества продукта и всего такое. И желательно ещё быть готовым пинать руководство, а руководству быть готовым пинать высшее руководство, чтобы дали добро. Вот. Но обычно там с селениумами, плейбрайтами проблем нету, как и с другими такими основными библиотеками, там GUIT и прочее. Но податься с eBay - это в энтерпрайзе обычное дело. Одни и те же действия для эмуляции работы с ПК и с мобильного. А, да, Playbright поддерживает эмуляцию мобильных версий. Тут будет зависеть от вашего сайта, насколько как у него реализована резиновая вёрстка. Если у него реализовано появление новых элементов на странице, то, возможно, тесты нужно будет немножко подправить, что при таком-то разрешении экрана нажми сюда, при таком-то нажми сюда. Вот. Но это можно унифицировать, но нужно будет смотреть, что могут появляться новые элементы какие-то исчезать. Ну, самый простой пример. Исчезает боковое левое меню, появляется гамбургер, вот этот вот из трёх полосочек, там, трёх точек для отображения другого меню, именно мобильного. Нужно просто это учитывать при написании тестов. Ну вот, допустим, пример. А сейчас мы не видим никаких гамбургеров. Вот оно меню сверху. Мы это дело уменьшаем, и у нас появляется гамбургер. И меню появляется, да? То есть перед тем, как взаимодействовать с меню, нужно сначала нажать сюда. И надо снять ширину экрана, понять, что оно появилось и так далее. Понятно, Алексей? То есть просто учитывать именно особенности вашего конкретного сайта. То есть для этого сайта разницы не будет. Он везде одинаково выглядит. Он просто в процентном соотношениях там тянется. Но более серьёзные сайты там начинаются там менюшки пропадающие, появляющиеся и так далее. Через и с использованием де-файлов с указанием урлов или Да, есть. Можно, но у нас следующая лекция будет посвящена как раз и в тестировании, поэтому можете приходить на следующую лекцию. Там я как раз сейчас буду приглашать туда, там будем как раз проиворить. Так, вот этот экран уберу, чтоб мелко не было. Следующая вот, да, и в автотестах. Поэтому, Алексей, это была как презентация следующего открытого урока. будет 23 марта. Приходите, записывайтесь, обсудим более детально. Такой ответ устроит. Отлично. Тогда поговорим про Иилей лекции. А-а, напомню, что курс стартует у нас тридцатого числа. Аэ, QR-код для записи на экране. Вопросы какие-то ещё есть у вас? Что-то хочется обсудить? Давайте так. Жду 5 секунд. Если вопросительного знако в чате не появляется, я начинаю прощаться. 1 2 3 4 пять. Хорошо, договорились. А-а, спасибо большое, что пришли. Надеюсь, вам понравилось. Насколько понравилось, ещё раз продублирую ссылочку на опросник. А в опроснике там, если ставите плохую оценку, пожалуйста, напишите, почему, что именно не понравилось. Потому что счастливы все одинаково, несчастлив каждый по-своему. Не для роста тоже нужен фидбэк. Аа надеюсь, увидимся с вами двадцать третьего числа, а потом ещё и тридцатого. Вот. А если появятся вопросы, можно обращаться на help собака. Если вопросов нет, можно их подготовить к двадцать третьему числу, когда будем про Ииговаривать. А всех жду. Всем спасибо. Хороше до конца недели, хороших выходных. Увидимся с вами двадцать третьего числа. Это у нас понедельник через неделю. Всё. Всем хорошего вечера. До свидания.