Написание фреймворка, используя Selenium. C чего начать?

Всем привет! в Selenium я новичок, пишу на Java. Почитав суровую беспощадную теорию, я понял, что этим сыт не будешь и нужно попробовать потренится на каких-нибудь интересных задачах.
Не найдя ничего дельного в сети (может плохо искал и кто подскажет!=)), мне предложили написать простой базовый фреймворк для тестирования следующей модели веб странцы:

  • есть какой-то базовый объект типо WebPage и у него есть 3 состояния:
    1. LoginPage
    2. HomePage
    3. какой то NextPage
  • соответственно у страниц есть какой-то базовый атрибут WebElement
  • должна быть реализована функциональность логина, навигация между вкладками веб-страниц

Вобщем что то в таком духе=).
Теоретически все понятно, но из за неимения опыта, не знаю с какого угла подступиться, с чего начать, какие возможности библиотеки Selenium использовать?
Буду рад любым наводящим вопросам, подсказкам, ссылкам, критике и т.д.

Спасибо, большое!!!

Привет!
Начните с http://ru.selenide.org/ - прощё не придумаешь.

2 лайка

@heavy_lexer, я так понимаю, что ваша основанная задача сейчас, это изучить WebDriver?
Если это так, то скажу сразу – новички не пишут фреймворки с самого начала, а решают задачи, используя либо уже имеющиеся, либо API WebDriver.

Команда WebDriver говорит на главной странице, что использование этой библиотеки для тестов – это всего лишь один из многих вариантов использования, среди многих.
Если вы хотите решить интересную задачу, то вот вам пример:

###Преамбула
Сайт http://booking.uz.gov.ua/ru/ служит для резервирования Ж/Д билетов онлайн.
Укрзалізниця (УЗ) использует некоторые правила для формирования цен для покупки билетов.
Невооруженным глазом, можно заметить, что цена билета по одному и тому же направлению, на один и тот же поезд может различаться в будние дни, в пятницу и в выходные и праздничные дни.

###Дано:
Направление: Киев – Одесса (или любое другое)
###Задача:
Написать скрипт (сценарий), который бы запускался ежедневно (или ежечасно) и собирал статистику по стоимости билетов по указанному направлению.
Формат выходных данных: текстовый файл, таблица, с полями, разделенными символом TAB (\t)

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

5 лайков

поддержу мысль @dzhariy,

Не думайте сразу о фреймворке. Для изучения инструмента надо использовать конкретную задачу, которую надо решить тем способом каким сможете. Начать лучше с простой, решить её, а затем уже брать посложнее и тд.

Фреймворк сам собой начнет вырисовываться, когда вы увидите дублирование кода и захотите выделить общие переиспользуемые части в отдельные классы.

Так что изучите инструкции GitHub - SeleniumHQ/selenium-google-code-issue-archive: Archive, please see main selenium repo, берите конкретную задачу (для начала попроще) и вперед!

4 лайка

Я думаю многим интересно, пишите подробности )

Спасибо, что соориентировали, друзья! Буду стараться!

да да! интересно=)
Буду рад узнать подробности.

Подробностей не так много, но есть предложение.
Вы беретесь за реализацию этой задачи любым способом, которым вы владеете сейчас.
Я (и уверен, жители форума) – готов проверить решение, проверить работу и подсказать, куда копать дальше и что читать дальше в случае, если у вас возникнут проблемы.
А также, готов дать несколько рекомендаций по улучшению кода.

Мои условия:

  1. Все проекты со всеми исходниками в самом актуальном состоянии – находятся на github и только на github.
  2. Все по проекту обсуждаем только на форуме, публично. Никаких имейлов и ЛС.

Если условия задачи не понятны или не нравятся – это можно обсудить прямо сейчас.

Согласен, хотя не сталкивался с github, заодно и возможность такая появится.

1 лайк

Ну вот написал первую часть, самую простую. Открыл страницу с резервированием, нашел поезда по маршруту Киев-Москва. Дальше сложности - очень много зависимостей от наличия поездов, свободных мест и т д.
И вторая проблема - залить это все на github )))

С гитом нужно немного посидеть, чтоб разобраться, но на самом деле, там все достаточно просто потом идет.

  1. Вначале нужно создать репозиторий через веб интерфейс на github
  2. Потом выкачать его на локальную машину при помощи команды git clone https://repository_address_url
  3. Добавить или скопировать файлы проекта в склонированый репозиторий
  4. Чтобы добавить все файлы, можно использовать команду git add *
  5. Для того, чтобы сделать коммит в локальный репозиторий – git commit –am ”Commit Message Hello!”
  6. И последний этап – синхронизировать локальный репозиторий с github – git push origin master

Для обновления с сервера – git pull
Для просмотра изменений – git status

А еще есть Github Windows но, сам я эту штуку не использовал

2 лайка

Есть готовый тест на Python, его еще необходимо оптимизировать, но идея реализована.

https://github.com/VitaliyKoryakov/booking.uz.gov.ua/blob/master/test_checking_prices.py

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

d.find_element_by_xpath("*//div[@id='ts_chs_scheme'] //a[@class='upper free']"))

будет читается проще, если бы она выглядела на подобии:

d.find_element_by_xpath( locators["train.details.places.freeplace"] )

Кроме того, код будет более надежным, ведь теперь такой локатор можно будет переиспользовать в нескольких вызовах вебдрайвера, а если что-то сломается – то починить необходимо будет лишь в отдельном месте, а не искать и заменять все локаторы в теле теста.

Я рекомендую вынести все локаторы в хеш locators и поместить его (этот хеш) в начало файла кода. Либо, это еще лучше – в отдельный файл.

Вот пример:
Selenium WebDriver: Implementing PageObject in Python

Сейчас нет необходимости имплементировать Пейджобжект (хотя, если хотите, то можете попробовать это сделать). Посмотрите лишь на то, как автор работает с locators

2 лайка

Я бы в первую очередь заострил внимание на сами локаторы. В каждом втором локаторе magic numbers - это не есть гуд.

to_ukr = driver.find_element_by_xpath("//*[@id='langs']//li[1]/a")
kyiv = driver.find_element_by_xpath("//*[@id='stations_from']/div[1]")
moscow = driver.find_element_by_xpath("//*[@id='stations_till']/div[5]")
train_006 = driver.find_element_by_xpath("*//a[contains(text(),'006 К')]/../../td[@class='td6']/div[3]/button")

Где гарантия, что будет выбран необходимый(ое) язык/направление/тип места?

2 лайка

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

Да, видно что вы поработали над локаторами. Это хорошо.

Из замечаний:

Такой локатор, в принципе, выглядит нормально. Т.е. я сам иногда использую индекс [1] если мне нужен первый элемент.

//*[@id='langs']//li[1]/a

Но, есть небольшая проблема. А что если порядок языков поменяется?
Я бы в данном случае, искал по тексту text() или по a[@title]

//*[@id='stations_from']/div[1]
Звездочку я бы часто использовать не рекомендовал. По такому локатору непонятно что это был за тег с id=‘stations_from’.

//*[@id='stations_till']/div[5]
Это достаточно опасный локатор. Во первых, не ясно: почему пять?
Во-вторых, индекс может изменится, и то, что было пятым, вдруг станет 6-м или 4-м.

Конкретно вот этот кусок:#select 006 train
У вас завалится в тот день, когда поезда не будет, или когда на него продадут все билеты :smiley:
Но, не в этом суть.

Локатор вида:
*//a[contains(text(),'006 К')]/../../td[@class='td6']/div[3]/button
самый опасный. Во первых, присутсвуют хрупкие зависимости между дочерней и родительской веткой.
div[3] в середине (индекс) – обычно доставляет множество проблем. Особенно, когда этот индекс меняется.

Правило тут такое: чем длинее локатор – тем больше технический долг. Сложные и длинные локаторы обычно ломаются.

Что хорошего:
Вы все таки поработали над локаторами. Это видно. Но, нужна еще практика.

Совет:
Вебэлементы можно искать не только через веб-драйвер:

myelement = driver.find_element_by_xpath("*//div”);

Но и через веб-элемент:
anotherelement=myelement.find_element_by_xpath("*//a”);

такой подход, с поиском “от элемента” может значительно упростить xpath’ы

1 лайк

Только сейчас обратил внимание - что за странные конструкции у вас "*//a”? :slight_smile:

[quote=“dzhariy, post:17, topic:3596”]
Звездочку я бы часто использовать не рекомендовал. По такому локатору непонятно что это был за тег с id=‘stations_from’.
[/quote]Вынужден не согласиться - если мы ищем по id, какая разница что это - div, span, td или что-нибудь еще? Ведь это просто эквивалент By.id, в котором тоже нету тега.

1 лайк

А можно вопрос? Он скорее не очень прямо по теме, но все же.
А почему не используются css локаторы? В python же есть методы для работы с css? Мне всегда казалось, что css выглядит по приятнее и читается получше. И еще где-то я читал, что работает css быстрее(точно утверждать не буду, не проверял(кстати интересно было бы провести исследование) Есть у него пару вещей, которые с ним сделать сложно, но все эти недочеты легко исправляются кодом.
Я сам давненько уже тесты не писал на selenium, но раньше всегда только css юзал.
Кто нибудь может дать ответ?

давайте вопросы не по теме задавать в отдельной теме. Вопрос хороший, думаю стоит создать отдельный топик и связать его с текущим (путем нажатия “Ответить в новой теме”).

По поводу что лучше: CSS или XPath, я воздержусь от комментариев, а взамен оставлю ссылку на справочник, где можно сравнить реализацию через CSS и XPath:

Шпаргалка-справочник по локаторам Selenium WebDriver: CSS vs XPath vs DOM