class TopChartsSpotifyTabLocators: # headers STICKY_HEADER = "//*[contains(@class, 'sticky-header show')]" STICKY_HEADER_SPOTIFY_ICON = f"{STICKY_HEADER}//../*[contains(@class, 'icon-spotify')]" STICKY_HEADER_TOP_TRACKS = f"{STICKY_HEADER}//../*[text()='Top tracks']" STICKY_HEADER_MARKET_GENRE_DATE = f"{STICKY_HEADER}//../*[@tag]" STICKY_HEADER_CLOCK_ICON = f"{STICKY_HEADER}//../*[contains(@class, 'icon-time')]" CHARTS_TABLE_HEADER_NON_STICKY = "//*[contains(@class, 'tableHeader') and not(contains(@class, 'show'))]" CHARTS_TABLE_HEADER_STICKY = "//*[contains(@class, 'sticky-header show')]" CHARTS_TABLE_SUB_HEADER_STICKY = "//*[contains(@class, 'tableHeader show')]" # buttons and dropdowns BACK_TO_TOP_BUTTON = "//*[contains(@class, 'backToTop show')]" PERIOD_DD_DAILY = "//*[@id='spotify-period-dd']" PERIOD_DD_WEEKLY = "//*[@id='top-charts-spotify-period-dd']" PERIOD_DD_WEEKLY_SELECTED = f"{PERIOD_DD_WEEKLY}/span[1]" MARKET_DD = "//*[contains(@id, 'market-dd')]" MARKET_DD_FILTER_INPUT = "//*[@id='top-charts-spotify-market-dd-filter-input']" MARKET_DD_LIST_OF_MARKETS = "//*[contains(@id, 'market-dd-item') and contains(@id, 'label')]" MARKET_DD_CLOSE_ICON = "//*[@id='top-charts-spotify-market-dd-filter-input-close-icon']" MARKET_DD_NO_MARKETS_PLACEHOLDER = "//*[.='No markets found.']" MARKET_DD_ITEM = "//*[contains(@id, 'market-dd-item') and text()='{}']" EXPORT_BUTTON = "//*[@id='top-charts-spotify-export-btn']" DAILY_SUB_TAB = "//*[@id='top-charts-spotify-daily-scope-bar']" WEEKLY_SUB_TAB = "//*[@id='top-charts-spotify-weekly-scope-bar']" CLOCK_ICON = "(//*[contains(@id, 'hint-icon')])[last()]" CLOCK_ICON_TOOLTIP = "//*[contains(@id, 'hint-icon-tooltip')]" TRACK_OWNER_FILTER_DD = "//*[@id='top-charts-spotify-filter-dd']" TRACK_OWNER_SONY_CHACKBOX = "//*[@id='top-charts-spotify-filter-dd-checkbox-sony']" TRACK_OWNER_NON_SONY_CHECKBOX = "//*[@id='top-charts-spotify-filter-dd-checkbox-non_sony']" TRACK_OWNER_APPLY_BUTTON = "//*[contains(@id, 'apply-btn')]" FILTER_INPUT = "//*[@id='top-charts-spotify-filter-input']" # table column headers chart_spotify_cell = "charts-table-cell-" position, trend, image, name, streams = "position", "trend", "image", "name", "streams" CELL_POSITION_HEADER = f"//*[@id='{chart_spotify_cell}{position}']" CELL_POSITION_TREND_HEADER = f"//*[@id='{chart_spotify_cell}{trend}']" CELL_IMAGE_HEADER = f"//*[@id='{chart_spotify_cell}{image}']" CELL_TRACK_HEADER = f"//*[@id='{chart_spotify_cell}{name}']" CELL_STREAMS_HEADER = f"//*[@id='{chart_spotify_cell}{streams}']" # table column values CELL_POSITION_VALUES = f"//*[contains(@id, '{chart_spotify_cell}{position}-')]" CELL_POSITION_TREND_VALUES = f"//*[contains(@id, '{chart_spotify_cell}{trend}-')]" CELL_IMAGE_VALUES = f"//*[contains(@id, '{chart_spotify_cell}{image}-')]" CELL_TRACK_VALUES = f"//*[contains(@id, '{chart_spotify_cell}{name}-')]" CELL_STREAMS_VALUES = f"//*[contains(@id, '{chart_spotify_cell}{streams}-')]" ENTRY_REENTRY_TOOLTIP = "//*[contains(text(), 'Entry')]" # table NO_RESULTS = "//*[text()='No results to show.']" SPOTIFY_TOP_200_CHART_FOR_MARKET_NOT_EXISTS = "//*[.='Spotify {} Top 200 chart']//following-sibling::*"