import csv import logging from concurrent.futures._base import as_completed from concurrent.futures.thread import ThreadPoolExecutor import pytest import requests from ui_automation_framework.core.init_driver import InitDriver from ui_automation_framework.utils import CoreConfig from ui_automation_framework.utils import logger as cl @pytest.mark.usefixtures("set_up", "one_time_set_up") class TestAlbumImages: @pytest.fixture(autouse=True) def classSetup(self): self.log = cl.Logger(logging.DEBUG) self.base_page = InitDriver(self.driver) self.session = requests.session() def test_album_images_1(self): self.base_page.go_to_url(CoreConfig.ENV_BASE_URL) self.base_page.wait_for_element_visible("//a[text()='tracks']", "xpath") for i in range(0, 250): self.base_page.wait_for_element_visible(f"(//a[text()='tracks'])[{i + 1}]", "xpath") self.base_page.click_element(f"(//a[text()='tracks'])[{i+1}]", "xpath") self.base_page.wait_for_element_visible("//img", "xpath") urls = [] images = self.base_page.get_elements("//img", "xpath") artist = self.base_page.get_text("//h2", "xpath").partition("Tracks")[0] for image in images: image_url = self.base_page.get_attribute_value("", "", image, "src") urls.append(image_url) data = [] with ThreadPoolExecutor() as executor: future_to_status_code = {executor.submit(self.get_image_status_code, url): url for url in set(urls)} for future in as_completed(future_to_status_code): url = future_to_status_code[future] code = future.result() if code != 200: data.append(([artist, url, code])) self.images_csv_writer(data, 'missing_album_images.csv') self.base_page.go_back() self.base_page.wait_for_element_visible("//a[text()='tracks']", "xpath") def test_album_images_2(self): self.base_page.go_to_url(CoreConfig.ENV_BASE_URL) self.base_page.wait_for_element_visible("//a[text()='tracks']", "xpath") for i in range(250, 500): self.base_page.wait_for_element_visible(f"(//a[text()='tracks'])[{i + 1}]", "xpath") self.base_page.click_element(f"(//a[text()='tracks'])[{i+1}]", "xpath") self.base_page.wait_for_element_visible("//img", "xpath") urls = [] images = self.base_page.get_elements("//img", "xpath") artist = self.base_page.get_text("//h2", "xpath").partition("Tracks")[0] for image in images: image_url = self.base_page.get_attribute_value("", "", image, "src") urls.append(image_url) data = [] with ThreadPoolExecutor() as executor: future_to_status_code = {executor.submit(self.get_image_status_code, url): url for url in set(urls)} for future in as_completed(future_to_status_code): url = future_to_status_code[future] code = future.result() if code != 200: data.append(([artist, url, code])) self.images_csv_writer(data, 'missing_album_images.csv') self.base_page.go_back() self.base_page.wait_for_element_visible("//a[text()='tracks']", "xpath") def test_album_images_3(self): self.base_page.go_to_url(CoreConfig.ENV_BASE_URL) self.base_page.wait_for_element_visible("//a[text()='tracks']", "xpath") for i in range(500, 750): self.base_page.wait_for_element_visible(f"(//a[text()='tracks'])[{i + 1}]", "xpath") self.base_page.click_element(f"(//a[text()='tracks'])[{i+1}]", "xpath") self.base_page.wait_for_element_visible("//img", "xpath") urls = [] images = self.base_page.get_elements("//img", "xpath") artist = self.base_page.get_text("//h2", "xpath").partition("Tracks")[0] for image in images: image_url = self.base_page.get_attribute_value("", "", image, "src") urls.append(image_url) data = [] with ThreadPoolExecutor() as executor: future_to_status_code = {executor.submit(self.get_image_status_code, url): url for url in set(urls)} for future in as_completed(future_to_status_code): url = future_to_status_code[future] code = future.result() if code != 200: data.append(([artist, url, code])) self.images_csv_writer(data, 'missing_album_images.csv') self.base_page.go_back() self.base_page.wait_for_element_visible("//a[text()='tracks']", "xpath") def test_album_images_4(self): self.base_page.go_to_url(CoreConfig.ENV_BASE_URL) self.base_page.wait_for_element_visible("//a[text()='tracks']", "xpath") for i in range(750, 1087): self.base_page.wait_for_element_visible(f"(//a[text()='tracks'])[{i + 1}]", "xpath") self.base_page.click_element(f"(//a[text()='tracks'])[{i+1}]", "xpath") self.base_page.wait_for_element_visible("//img", "xpath") urls = [] images = self.base_page.get_elements("//img", "xpath") artist = self.base_page.get_text("//h2", "xpath").partition("Tracks")[0] for image in images: image_url = self.base_page.get_attribute_value("", "", image, "src") urls.append(image_url) data = [] with ThreadPoolExecutor() as executor: future_to_status_code = {executor.submit(self.get_image_status_code, url): url for url in set(urls)} for future in as_completed(future_to_status_code): url = future_to_status_code[future] code = future.result() if code != 200: data.append(([artist, url, code])) self.images_csv_writer(data, 'missing_album_images.csv') self.base_page.go_back() self.base_page.wait_for_element_visible("//a[text()='tracks']", "xpath") def get_image_status_code(self, url): status_code = self.session.get(url).status_code return status_code def images_csv_writer(self, data, path): with open(path, "a", newline='') as csv_file: writer = csv.writer(csv_file) writer.writerows(data)