from datetime import datetime from allure import step from assertpy import assert_that from playwright.sync_api import expect from src.ui_elements.base_ui_element import BaseUIElement previous_month_link = "//*[@class='DayPicker-NavButton DayPicker-NavButton--prev']" future_month_link = "//*[@class='DayPicker-NavButton DayPicker-NavButton--next']" current_month = "(//*[@class='DayPicker-Caption'])[2]" day_with_num = "(//*[contains(@class, 'DayPicker-Day')][text()='{}'])[2]" predefined_period = "//*[text()='{}']" class DateRangeUIElement(BaseUIElement): @step('Select {month_year} from day picker') def select_days_month_year(self, month_year): self._element.click() month_displayed = "" for i in list(range(0, 300)): self.page.locator(previous_month_link).dispatch_event('click') month_displayed = self.page.locator(current_month).text_content() if month_displayed == month_year: break assert_that(month_displayed).is_equal_to(month_year) self.page.locator(day_with_num.format(1)).dispatch_event('click') self.page.locator(day_with_num.format(28)).dispatch_event('click') @step('Select from {date1} to {date2} range day picker') def select_two_dates(self, date1, date2): self._element.click() date_obj1 = datetime.strptime(date1, "%Y-%m-%d") date_obj2 = datetime.strptime(date2, "%Y-%m-%d") month_year1 = f"""{date_obj1.strftime("%B")} {date_obj1.strftime("%Y")}""" month_year2 = f"""{date_obj2.strftime("%B")} {date_obj2.strftime("%Y")}""" date_formatted1 = date_obj1.strftime("%a %b %d %Y") date_formatted2 = date_obj2.strftime("%a %b %d %Y") month_displayed = "" for i in list(range(0, 300)): self.page.locator(previous_month_link).dispatch_event('click') month_displayed = self.page.locator(current_month).text_content() if month_displayed == month_year1: break assert_that(month_displayed).is_equal_to(month_year1) self.page.locator(f"//*[@aria-label='{date_formatted1}']").dispatch_event('click') if month_year1 != month_year2: for i in list(range(0, 300)): self.page.locator(future_month_link).dispatch_event('click') month_displayed = self.page.locator(current_month).text_content() if month_displayed == month_year2: break assert_that(month_displayed).is_equal_to(month_year2) self.page.locator(f"//*[@aria-label='{date_formatted2}']").dispatch_event('click') @step('Select {period} from day picker') def select_predefined_period(self, period): self._element.click() self.page.locator(predefined_period.format(period)).dispatch_event('click') expect(self.page.locator(predefined_period.format(period))).to_be_hidden()