@VitaliyKoryakov, вариант предложенный @vmaximv – это действительное решение задачи. По сути, такой сценарий можно запускать каждый день или час и собирать статистику по поездам.
Возьмите формат лог-файла, предложенного @vmaximv как “стандарт”.
В этой теме, мы много чего насоветовали, и боюсь, могли запутать вас кучей советов. Сейчас же, я хочу дать еще одну рекомендацию, при этом, расставив приоритеты для всего списка.
Рекомендации, в порядке убывания важности:
- Вынести тестовый код в методы шагов (функциональная декомпозиция)
- Добавить хэш locators
- Оптимизировать локаторы
Вынести тестовый код в методы шагов (функциональная декомпозиция)
Это очень простой подход, применяя который, вы можете превратить тесты из сценария в бот-стиле:
Click, Wait, SendKeys, Click, Click…
В язык бизнес-действий. Т.е. ваши тесты будут написаны на языке предметной области, DSL.
В таком стиле, тест выглядит как:
select_departure_city(“Киев”)
select_arival_city(“Москва”)
search_trains()
trains_list = get_trains_list()
for (train in trains_list)
{
train_data = get_train_data(train)
log(train_data)
}
в таком случае, вам будут не нужны комментарии по типу:
#choose station from Kyiv
давайте разберем этот пример
#choose station from Kyiv
WebDriverWait(driver, 10).until(lambda d: d.find_element_by_name("station_from"))
source_from = driver.find_element_by_name("station_from")
source_from.send_keys(u"Київ")
WebDriverWait(driver, 20).until(lambda d: d.find_element_by_xpath("//*[@id='stations_from']/div[1]"))
kyiv = driver.find_element_by_xpath("//*[@id='stations_from']/div[1]")
kyiv.click()
#choose station to Moscow
WebDriverWait(driver, 10).until(lambda d: d.find_element_by_name("station_till"))
source_to = driver.find_element_by_name("station_till")
source_to.send_keys(u"Москва")
WebDriverWait(driver, 20).until(lambda d: d.find_element_by_xpath("//*[@id='stations_till']/div[5]"))
moscow = driver.find_element_by_xpath("//*[@id='stations_till']/div[5]")
moscow.click()
Первое: берем комментарии, и создаем методы с тем же именем. Город выносим как параметр:
def choose_station_from(CITY)
WebDriverWait(driver, 10).until(lambda d: d.find_element_by_name("station_from"))
source_from = driver.find_element_by_name("station_from")
source_from.send_keys( CITY )
WebDriverWait(driver, 20).until(lambda d: d.find_element_by_xpath("//*[@id='stations_from']/div[1]"))
first_item = driver.find_element_by_xpath("//*[@id='stations_from']/div[1]")
first_item.click()
def choose_station_to(CITY)
# реализация, аналогична первому. просто выносим City как параметр
таким образом, просто разбивая простыню теста на логические блоки – отдельные методы/процедуры/функции – вы делаете тест более читабельным.
Добавить хэш locators
Этот подход описан в комментариях выше. Просто вынесите все локаторы в отдельные переменные, либо в хэш locators. Таким образом, вы сможете переиспользовать уже известные локаторы, используя переменные (или ключи хэша), вместо того, чтобы их копи-пастить.
Может быть сейчас, это не настолько важно, когда есть всего один сценарий.
Но, когда появится больше сценариев – то это будет очень важным.
Оптимизировать локаторы
В данный момент, все работает. Поэтому, поставил этому пункту самый низкий приоритет. Найти минимальный и стабильный локатор – это все таки искусство, и тут требуется практика. Выше, я оставил ссылку на шпаргалку с XPath/CSS локаторами.
Вы можете попробовать и XPath и CSS, а может и ID.
Эта задача самая размытая. И тут важно непосредственно стабильность локатора.
Может быть, у вас уже в первоначальном варианте были стабильные локаторы.
Я не знаю – это покажет время (и будущие изменения).
Обычно, длинные локаторы и локаторы содержащие индексы (например div[5]; div[1] – это нормально) – ломаются чаще всего. Но, это всего-лишь статистика, и неизвестно, насколько это правда для текущей задачи.