Я не думаю, что было бы хорошей идеей тратить слишком много времени на общее решение c, когда решение для страницы c легко, когда оно выполнено хорошо. Если вы уверены, что все страницы, которые вы хотите использовать, используют формат DD / MM / YYYY и все поля имеют номера c, тогда вы можете попробовать что-то вроде этого:
def fill_date(input_holder_div, data):
fields = input_holder_div.find_elements_by_xpath('./input[@type="text"]')
for i in range(3):
fields[-i-1].clear()
fields[-i-1].send_keys(data[-i-1])
my_date = [11, 11, 1980]
# fill_date(driver.find_element_by_xpath('//*[@f-class="EntryRow"]'), my_date)
# fill_date(driver.find_element_by_xpath('//*[@class="rhsForm"]'), my_date)
Вызов функции с правильный родитель и данные, и работа сделана. Часть -i-1
требуется для заполнения только 3 последних полей ввода и игнорирования скрытого поля ввода, если такой элемент присутствует. Но есть побочные эффекты.
Что если на странице нет родительского элемента, который содержит только эти 3 поля ввода текста. Что если вы столкнетесь со страницей с форматом даты ГГГГ / ММ / ДД или месяцами, выбранными по имени ...
Если вы хотите выполнить очень похожий или одинаковый рабочий процесс в двух разных макетах, тогда вам, вероятно, стоит проверить подход объекта страницы . Концепция заключается в том, что вы определяете в классе, как делать вещи на странице, а затем просто вызываете методы, и они делают то, что хотели.
Пример:
class BasePage:
def __init__(self, driver):
self.driver = driver
@staticmethod
def _fill(input_element, data):
input_element.clear()
input_element.send_keys(data)
class FirstPage(BasePage):
def fill_day(self, data):
field = self.driver.find_element_by_xpath('//*[@class="split-date-day"]')
self._fill(field, data)
class SecondPage(BasePage):
def fill_day(self, data):
field = self.driver.find_element_by_xpath('//*[@id="Entry.Customer.C1.BirthDate"]/input')
self._fill(field, data)
У вас есть Классы FirstPage и SecondPage, которые знают, как делать вещи, например, как заполнять поле ввода дня. Если вы завершите эти два класса (и добавите методы fill_month
и fill_year
), вы сможете обрабатывать заполнение дат одним и тем же логикой c:
def fill_date(page, data):
page.fill_day(data[0])
page.fill_month(data[1])
page.fill_year(data[2])
first_page = FirstPage(driver)
second_page = SecondPage(driver)
if first_page_is_loaded:
fill_date(first_page, my_data)
else:
fill_date(second_page, my_data)
Если рабочий процесс страниц очень похож все, что вам нужно сделать, это использовать правильный объект страницы. Вы можете справиться с незначительными различиями, переместив некоторые логи c в объект страницы и используя тот же поток в основной логи c.