import logging import time from datetime import datetime, timedelta import allure from assertpy import assert_that from selenium.webdriver import ActionChains from ui_automation_framework.core import TestStatus from ui_automation_framework.utils import logger as cl from app.api_client import ApiClient from app.src.pages.track_page import TrackPage class TikTokTrackDetails(TrackPage): log = cl.Logger(logging.DEBUG) def __init__(self, driver): super().__init__(driver) self.driver = driver self.api_client = ApiClient() self.trackPage = TrackPage(self.driver) self.ts = TestStatus(self.driver) @allure.step("TP - Tiktok TD - get values - UI") def get_track_details_values_ui(self): tiktok_td_sel = "//*[contains(@id, 'track-details-tiktok') and not(contains(@id, 'title')) and not(contains(@id, 'tab'))]" self.wait_for_element_visible(tiktok_td_sel, "xpath") time.sleep(3) self.scroll_to_track_details() tiktok_values_el = self.get_elements(tiktok_td_sel, "xpath") tiktok_values = [self.get_text(element=t).strip().replace(",", "").replace("%", "") for t in tiktok_values_el] hover_elements = [tiktok_values_el[1], tiktok_values_el[3], tiktok_values_el[5], tiktok_values_el[7]] tooltips = [] for el in hover_elements: ActionChains(self.driver).move_to_element(to_element=el).perform() tooltip = self.get_text(self.hint_locator, "xpath").replace("\n", " ").replace(",", "") tooltips.append(tooltip) dates = self.get_elements("//*[contains(@id, 'track-details-tiktok-trend-title') and not(contains(@id, '7-days'))]", "xpath") dates = [str(datetime.strptime(self.get_text(element=d).split(",")[0], self.trackPage.get_date_format_from_locale()).date()) for d in dates] assert_that(dates[0]).is_equal_to(dates[1]) in_period_views = tiktok_values[10].upper() if any(ext in ["K", "M", "B"] for ext in in_period_views): ActionChains(self.driver).move_to_element(to_element=tiktok_values_el[10]).perform() in_period_views = self.get_text("(//*[contains(@id, 'tooltip')])[last()]", "xpath").replace(",", "") tiktok_values = { "day_creations": int(tiktok_values[0]), "date_creations": dates[0], "day_creations_perc": int(tiktok_values[1]), "7days_creations": int(tiktok_values[2]), "7days_creations_perc": int(tiktok_values[3]), "day_views": int(tiktok_values[4]), "date_views": dates[1], "day_views_perc": int(tiktok_values[5]), "7days_views": int(tiktok_values[6]), "7days_views_perc": int(tiktok_values[7]), "in_period_creations": int(tiktok_values[8]), "in_period_creations_avg": int(tiktok_values[9]), "in_period_views": int(in_period_views), "in_period_views_avg": int(tiktok_values[11]), "tooltips": tooltips, } self.log.info(f"tiktok td values ui: {tiktok_values}") return tiktok_values @allure.step("TP - Tiktok TD - get values - API") def get_track_details_values_api(self, isrc, markets, types=["pgc", "ugc"]): start = self.get_calendar_start_date() end = self.get_calendar_end_date() tiktok_api_resp = self.api_client.get_tiktok_tracks_analytics(isrc=isrc, start=start, end=end, markets=markets) day_cr = sum(tiktok_api_resp["breakdowns"]["content_type_country"][t][m]["creations"][-1] for t in types for m in markets) day_cr_prev = sum(tiktok_api_resp["breakdowns"]["content_type_country"][t][m]["creations"][-2] for t in types for m in markets) day_creations_perc = abs(self.apply_rounding_percentage((day_cr - day_cr_prev) / day_cr_prev * 100)) day_views = sum(tiktok_api_resp["breakdowns"]["content_type_country"][t][m]["video_views"][-1] for t in types for m in markets) day_views_prev = sum(tiktok_api_resp["breakdowns"]["content_type_country"][t][m]["video_views"][-2] for t in types for m in markets) day_views_perc = abs(self.apply_rounding_percentage((day_views - day_views_prev) / day_views_prev * 100)) day7_cr = sum(sum(tiktok_api_resp["breakdowns"]["content_type_country"][t][m]["creations"][-7:]) for t in types for m in markets) day7_cr_prev = sum(sum(tiktok_api_resp["breakdowns"]["content_type_country"][t][m]["creations"][-14:-7]) for t in types for m in markets) day7_creations_perc = abs(self.apply_rounding_percentage((day7_cr - day7_cr_prev) / day7_cr_prev * 100)) day7_views = sum(sum(tiktok_api_resp["breakdowns"]["content_type_country"][t][m]["video_views"][-7:]) for t in types for m in markets) day7_views_prev = sum(sum(tiktok_api_resp["breakdowns"]["content_type_country"][t][m]["video_views"][-14:-7]) for t in types for m in markets) day7_views_perc = abs(self.apply_rounding_percentage((day7_views - day7_views_prev) / day7_views_prev * 100)) in_period_creations = sum(sum(tiktok_api_resp["breakdowns"]["content_type_country"][t][m]["creations"]) for t in types for m in markets) in_period_creations_avg = self.apply_rounding_percentage(in_period_creations / int(tiktok_api_resp["days_count"])) in_period_views = sum(sum(tiktok_api_resp["breakdowns"]["content_type_country"][t][m]["video_views"]) for t in types for m in markets) in_period_views_avg = self.apply_rounding_percentage(in_period_views / int(tiktok_api_resp["days_count"])) df = self.trackPage.get_date_format_from_locale() date1 = (datetime.strptime(tiktok_api_resp["max_date"], "%Y-%m-%d")).strftime(df) date2 = (datetime.strptime(date1, df) - timedelta(days=1)).strftime(df) date3 = (datetime.strptime(date1, df) - timedelta(days=6)).strftime(df) date4 = (datetime.strptime(date1, df) - timedelta(days=7)).strftime(df) date5 = (datetime.strptime(date1, df) - timedelta(days=13)).strftime(df) if self.less_more(day_cr, day_cr_prev)[0] == 0: tooltip1 = f"No change in creations for {date1} to {date2}" else: tooltip1 = f"{self.less_more(day_cr, day_cr_prev)[0]} creations {self.less_more(day_cr, day_cr_prev)[1]} on {date1} than {date2}" tooltip2 = f"{self.less_more(day7_cr, day7_cr_prev)[0]} creations {self.less_more(day7_cr, day7_cr_prev)[1]} on {date3}–{date1} than {date5}–{date4}" if self.less_more(day_views, day_views_prev)[0] == 0: tooltip3 = f"No change in views for {date1} to {date2}" else: tooltip3 = f"{self.less_more(day_views, day_views_prev)[0]} views {self.less_more(day_views, day_views_prev)[1]} on {date1} than {date2}" tooltip4 = f"{self.less_more(day7_views, day7_views_prev)[0]} views {self.less_more(day7_views, day7_views_prev)[1]} on {date3}–{date1} than {date5}–{date4}" tiktok_values_api = { "day_creations": day_cr, "date_creations": tiktok_api_resp["max_date"], "day_creations_perc": day_creations_perc, "day_views": day_views, "day_views_perc": day_views_perc, "7days_creations": day7_cr, "7days_creations_perc": day7_creations_perc, "7days_views": day7_views, "7days_views_perc": day7_views_perc, "in_period_creations": in_period_creations, "in_period_creations_avg": in_period_creations_avg, "in_period_views": in_period_views, "in_period_views_avg": in_period_views_avg, "tooltips": [tooltip1, tooltip2, tooltip3, tooltip4], } self.log.info(f"tiktok td values api: {tiktok_values_api}") return tiktok_values_api @allure.step("TP - Tiktok TD - get less more and value") def less_more(self, last, prev): diff = last - prev if diff > 0: word = "more" elif diff < 0: word = "less" else: word = "equal" return abs(diff), word