class ArtistLocators: ENTITY_NAME = '//*[contains(@class, "name-container")]' ENTITY_METADATA = "//*[contains(@class, 'entity-meta__metadata__item__label') and text()='{}']/..//*[" \ "contains(@class, 'entity-meta__metadata__item__text')]/*" BTN_ADD_TO_CATEGORY = '//*[contains(@class, "entity-categories")]/button' ENTITY_CATEGORY = '(//*[contains(@class, "entity-category-list-item")])[{}]' BTN_REMOVE_ENTITY_CATEGORY = ENTITY_CATEGORY + '/button[contains(@class, "category-remove-btn")]' EXT_LINK = "//*[contains(@class, 'entity-media-services')]//*[contains(@class, '{}')]/.." BN_EXT_LINK_REST = "//*[contains(@class, 'entity-media-services')]/*[contains(@class, 'rest-services')]" EXT_SOCIAL_LINK = "//*[contains(@class, 'dropdown') " \ "and text()='Social Media']/..//*[contains(@class, 'icon-{}')]/.." EXT_STREAMING_LINK = "//*[contains(@class, 'dropdown') " \ "and text()='Streaming Services']/..//*[contains(@class, 'icon-{}')]/.." EXT_LINKS_ERROR = "//*[contains(@class, 'ext-links-loading-error')]" BTN_SHARE = "//button[contains(@class, 'share')]" ERROR_SHARE = "//*[contains(@class, 'share__failed--')]" TAB_PERFORMANCE = "//*[@id='tab-performance-{}']" SCOPE_BAR = "//*[@data-test-id='scope-bar-{}']" TITLE_PERFORMANCE = "(//*[contains(@class, 'performance-chart__title--main')])[{}]" DISCOVERY_DATA = "//*[contains(@class, 'discovery-data')]" PERFORMANCE_CHART_MARKER = "//*[contains(@class, 'performance-chart__title--main') and text()='{}']/../.." PERFORMANCE_CHART_TOOLTIP_HEADER = "(//*[contains(@class, 'tooltip-formatter__header')])[{}]" PERFORMANCE_CHART_TOOLTIP_NAME = "(//*[contains(@class, 'tooltip-formatter__body-point-name')])[{}]" PERFORMANCE_CHART_Y_LABELS = "//*[contains(@class, 'performance-chart__title--main') and text()='{}']/../..//div[" \ "contains(@class, 'highcharts-axis-labels highcharts-yaxis-labels')]/span" PERFORMANCE_CHART_Y_LABEL = PERFORMANCE_CHART_Y_LABELS + "[{}]" PERFORMANCE_CHART_X_LABELS = "//*[contains(@class, 'performance-chart__title--main') and text()='{}']/../..//*[" \ "contains(@class, 'highcharts-axis-labels highcharts-xaxis-labels')]/*" PERFORMANCE_CHART_X_LABEL = PERFORMANCE_CHART_X_LABELS + "[{}]" NOT_ENOUGH_DATA_ERROR = "//*[contains(@class, 'no-data-placeholder')]//*[contains(@class, 'title') and text()='{" \ "}']/../..//*[text()='Not enough historical data to build a sparkline.']" DISCOVERY_STATS_TITLE = "//*[contains(@class, 'discovery-data__stats--main-title')]" DISCOVERY_STATS_LAST_DATE_VALUE = "//*[contains(@class, 'discovery-data__stats--latest-date-value')]" DISCOVERY_STATS_SECONDARY = "//*[contains(@class, 'discovery-data__stats--secondary')][{}]" TRACKS_AND_VIDEOS = "//*[contains(@class, 'tracks-n-videos')]" TRACKS = TRACKS_AND_VIDEOS + "//*[contains(@class, 'tracks')]" VIDEOS = TRACKS_AND_VIDEOS + "//*[contains(@class, 'videos')]" TRACKS_ERROR = TRACKS + "//*[contains(@class, 'partial-error__title')]" VIDEOS_ERROR = VIDEOS + "//*[contains(@class, 'partial-error__title')]" CARD_SOUNDCLOUD = "(//*[contains(@class, 'sound-cloud-card') and contains(@class, 'flex-column')])[{}]" BTN_CARD_SOUNDCLOUD_DETAILS = CARD_SOUNDCLOUD + "//*[contains(@class, 'track-details__btn')]" CARD_SOUNDCLOUD_SRC = CARD_SOUNDCLOUD + "//iframe" CARD_SOUNDCLOUD_RELEASE = CARD_SOUNDCLOUD + "//*[contains(@class, 'track-details__release-date')]" CARD_SPOTIFY = "(//*[contains(@class, 'spotify__track') and contains(@class, 'flex-column')])[{}]" BTN_CARD_SPOTIFY_DETAILS = CARD_SPOTIFY + "//*[contains(@class, 'track-details__btn')]" CARD_SPOTIFY_SRC = CARD_SPOTIFY + "//iframe" CARD_SPOTIFY_RELEASE = CARD_SPOTIFY + "//*[contains(@class, 'track-details__release-date')]" CARD_TIKTOK = "(//*[contains(@class, 'card-tiktok--')])[{}]" CARD_TIKTOK_SRC = CARD_TIKTOK + "//a" CARD_TIKTOK_NAME = CARD_TIKTOK + "//*[contains(@class, 'description__artist-name')]" CARD_TIKTOK_PLAYS = CARD_TIKTOK + "//*[contains(@class, 'icon-rounded-play')]/../*[contains(@class, " \ "'stats__value')]" CARD_TIKTOK_LIKES = CARD_TIKTOK + "//*[contains(@class, 'icon-heart')]/../*[contains(@class, 'stats__value')]" CARD_YOUTUBE = "(//*[contains(@class, 'card-youtube--')])[{}]" CARD_YOUTUBE_SRC = CARD_YOUTUBE + "//a" CARD_YOUTUBE_TITLE = CARD_YOUTUBE + "//*[contains(@class, 'video-title')]/*" CARD_YOUTUBE_PLAYS = CARD_YOUTUBE + "//*[contains(@class, 'icon-rounded-play')]/../*[contains(@class, 'label')]" CARD_YOUTUBE_LIKES = CARD_YOUTUBE + "//*[contains(@class, 'icon-heart')]/../*[contains(@class, 'label')]"