Дублирование кода ввода данных в поля (Webdriver)

Мне интересно, как опытные пользователи 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

Такие же подходы. Пишу свой метод и там наварачиваю все что нужно,а потом переиспользую

Нормальный подход вполне.
Если не нравится писать собственные методы - переходите на Ruby + Capybara :wink:

Подобные вещи зашиваю внутри BasePage, которую наследуют все остальные пейджи. При этом, использую не WebElement, а By локаторы.

А можно пример? Интересно очень, но не представляю как это делается.

Если по поводу By, то вот пример для питона:

from selenium.webdriver.common.by import By

driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')

А если про base page, то почитайте что нибудь про PageObject, например хотя бы это

я правильно понимаю, что предлагается наследоваться от 2 страниц BasePageElement и BasePage ?
что то типо этого:

class login_page(BasePageElement, BasePage):

Что то типо этого?

Ну питоновских примеров не приведу, т.к. я на джаве специализируюсь. Ссылка выше от @rmerkushin должна помочь.

Не знаю, как в питоне, но в джаве множественное наследование невозможно (если не учитывать читы дефолтных методов интерфейсов).

Как правило, существует набор экшенов, общих для всех пейджей: вы можете что-то кликнуть / заселектить, ввести / прочитать текст откуда-либо и т.п. Все эти действия применимы ко многим элементам, независимо от их типа. Почему бы тогда их не вынести в некую базовую пейджу, чтобы каждый раз не изобретать велосипеды из однотипных методов, избежать дублирования кода и т.п.? Плюс ко всему, таким образом вы сможете добиться разделения доменной логики от технической составляющей. В идеале, пейджи не должны ничего знать о драйвере. Все, что вам нужно, - передать локатор методу базовой пейджи, все остальное будет выполнено драйвером “за кадром”.

Насколько я знаю в питоне множественные наследования возможны… Идея мне нравится… буду пробовать, спасибо.

Нет. Тут без множественного наследования. Создаете класс BasePage, в котором вы прописываете общие какие то методы для работы со страницей. Потом вы создаете например класс GoogleMainPage который наследуете от BasePage. А уже в классе GoogleMainPage описываете методы которые непосредственно относятся к странице http://google.ru/, например для данного случая это что нибудь вроде search_info, first_link, search_results_count и т.п.

P.S.: Ну и BasePage никто не обязывает создавать, можете сразу описывать конкретную страницу, тут как вам больше нравится\хочется :smile:

Да, собственно как-то так и планировал поступить, про вторую BasePage я говорю так как хотелось бы использовать webium, а там уже есть BasePage… что бы не делать так BasePage(webium) -> BasePageMy -> GoolgePage. Хочу параллельно написать базовую страницу и наследоваться от множества, хотя наверное так и не правильно делать.

Смотря чем вы хотите дополнить basepage от webium :smile: Если вы хотите изменить пару методов, то тут проще override сделать.

Пошел читать про override

Вот еще пример PageObject который можно поизучать если захочется немного “повелосипедить” :smile:

посмотрите в сторону подходов в HtmlElements от яндекс.

С Java все плохо =( боюсь не разберусь