Мне интересно, как опытные пользователи Webdrivera, решают проблему дублирования кода ввода данных в поля. У нас есть web проект, в котором есть много формочек ввода текста ( ФИО, номер документов и т.д.), при этом на каждое поле нужно кликнуть, очистить и вставить текст в юникоде + по необходимости нажать enter. Для того что бы не писать каждый раз для каждого элемента input:
name = driver.find_element_by_xpath('name')
name.click()
name.clear()
name.send_keys(u'Иван')
мы в утилитах написали функцию:
def set_text(el, text, enter=None):
try:
el.click()
el.clear()
if text:
el.send_keys(text.decode('utf-8'))
if enter:
el.send_keys(Keys.ENTER)
return text
Но наверняка уже есть, что-то готовое для этого случая, как решаете такую проблему вы?
Если что пишем python + selenium + pytest + allure, но думаем добавить еще и webium
Ну питоновских примеров не приведу, т.к. я на джаве специализируюсь. Ссылка выше от @rmerkushin должна помочь.
Не знаю, как в питоне, но в джаве множественное наследование невозможно (если не учитывать читы дефолтных методов интерфейсов).
Как правило, существует набор экшенов, общих для всех пейджей: вы можете что-то кликнуть / заселектить, ввести / прочитать текст откуда-либо и т.п. Все эти действия применимы ко многим элементам, независимо от их типа. Почему бы тогда их не вынести в некую базовую пейджу, чтобы каждый раз не изобретать велосипеды из однотипных методов, избежать дублирования кода и т.п.? Плюс ко всему, таким образом вы сможете добиться разделения доменной логики от технической составляющей. В идеале, пейджи не должны ничего знать о драйвере. Все, что вам нужно, - передать локатор методу базовой пейджи, все остальное будет выполнено драйвером “за кадром”.
Нет. Тут без множественного наследования. Создаете класс BasePage, в котором вы прописываете общие какие то методы для работы со страницей. Потом вы создаете например класс GoogleMainPage который наследуете от BasePage. А уже в классе GoogleMainPage описываете методы которые непосредственно относятся к странице http://google.ru/, например для данного случая это что нибудь вроде search_info, first_link, search_results_count и т.п.
P.S.: Ну и BasePage никто не обязывает создавать, можете сразу описывать конкретную страницу, тут как вам больше нравится\хочется
Да, собственно как-то так и планировал поступить, про вторую BasePage я говорю так как хотелось бы использовать webium, а там уже есть BasePage… что бы не делать так BasePage(webium) -> BasePageMy -> GoolgePage. Хочу параллельно написать базовую страницу и наследоваться от множества, хотя наверное так и не правильно делать.