forked from devicons/devicon
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Changed to select all rather before take a pic (devicons#1058)
- Loading branch information
1 parent
bb58937
commit 47a1932
Showing
1 changed file
with
171 additions
and
171 deletions.
There are no files selected for viewing
342 changes: 171 additions & 171 deletions
342
.github/scripts/build_assets/selenium_runner/BuildSeleniumRunner.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,171 +1,171 @@ | ||
from typing import List | ||
import time | ||
from pathlib import Path | ||
|
||
from selenium.webdriver.support.ui import WebDriverWait | ||
from selenium.webdriver.common.by import By | ||
from selenium.webdriver.support import expected_conditions as ec | ||
from selenium.common.exceptions import TimeoutException as SeleniumTimeoutException | ||
|
||
from build_assets.selenium_runner.SeleniumRunner import SeleniumRunner | ||
from build_assets.selenium_runner.enums import IcomoonPage, IcomoonAlerts, IcomoonOptionState | ||
|
||
class BuildSeleniumRunner(SeleniumRunner): | ||
def build_icons(self, icomoon_json_path: str, | ||
zip_path: Path, svgs: List[str], screenshot_folder: str): | ||
self.upload_icomoon(icomoon_json_path) | ||
# necessary so we can take screenshot of only the | ||
# recently uploaded icons later | ||
self.deselect_all_icons_in_top_set() | ||
self.upload_svgs(svgs, screenshot_folder) | ||
self.take_icon_screenshot(screenshot_folder) | ||
self.download_icomoon_fonts(zip_path) | ||
|
||
def upload_icomoon(self, icomoon_json_path: str): | ||
""" | ||
Upload the icomoon.json to icomoon.io. | ||
:param icomoon_json_path: a path to the iconmoon.json. | ||
:raises TimeoutException: happens when elements are not found. | ||
""" | ||
print("Uploading icomoon.json file...") | ||
|
||
# find the file input and enter the file path | ||
import_btn = self.driver.find_element_by_css_selector( | ||
SeleniumRunner.GENERAL_IMPORT_BUTTON_CSS | ||
) | ||
import_btn.send_keys(icomoon_json_path) | ||
|
||
try: | ||
confirm_btn = WebDriverWait(self.driver, SeleniumRunner.MED_WAIT_IN_SEC).until( | ||
ec.element_to_be_clickable((By.XPATH, "//div[@class='overlay']//button[text()='Yes']")) | ||
) | ||
confirm_btn.click() | ||
except SeleniumTimeoutException as e: | ||
raise Exception("Cannot find the confirm button when uploading the icomoon.json" \ | ||
"Ensure that the icomoon.json is in the correct format for Icomoon.io") | ||
|
||
print("JSON file uploaded.") | ||
|
||
def upload_svgs(self, svgs: List[str], screenshot_folder: str): | ||
""" | ||
Upload the SVGs provided in svgs. This will upload the | ||
:param svgs: a list of svg Paths that we'll upload to icomoon. | ||
:param screenshot_folder: the name of the screenshot_folder. | ||
""" | ||
print("Uploading SVGs...") | ||
|
||
import_btn = self.driver.find_element_by_css_selector( | ||
SeleniumRunner.SET_IMPORT_BUTTON_CSS | ||
) | ||
|
||
# there could be at most 2 alerts when we upload an SVG. | ||
possible_alerts_amount = 2 | ||
err_messages = [] | ||
for i in range(len(svgs)): | ||
import_btn.send_keys(svgs[i]) | ||
print(f"Uploading {svgs[i]}") | ||
|
||
# see if there are stroke messages or replacing icon message | ||
# there should be none of the second kind | ||
for j in range(possible_alerts_amount): | ||
alert = self.test_for_possible_alert(self.SHORT_WAIT_IN_SEC) | ||
if alert == None: | ||
pass # all good | ||
elif alert == IcomoonAlerts.STROKES_GET_IGNORED_WARNING: | ||
message = f"SVG contained strokes: {svgs[i]}." | ||
err_messages.append(message) | ||
self.click_alert_button(self.ALERTS[alert]["buttons"]["DISMISS"]) | ||
elif alert == IcomoonAlerts.REPLACE_OR_REIMPORT_ICON: | ||
message = f"Duplicated SVG: {svgs[i]}." | ||
err_messages.append(message) | ||
self.click_alert_button(self.ALERTS[alert]["buttons"]["REIMPORT"]) | ||
else: | ||
raise Exception(f"Unexpected alert found: {alert}") | ||
|
||
self.edit_svg() | ||
print(f"Finished editing icon.") | ||
|
||
if err_messages != []: | ||
message = "BuildSeleniumRunner - Issues found when uploading SVGs:\n" | ||
raise Exception(message + '\n'.join(err_messages)) | ||
|
||
# take a screenshot of the svgs that were just added | ||
# select the latest icons | ||
self.switch_toolbar_option(IcomoonOptionState.SELECT) | ||
self.click_latest_icons_in_top_set(len(svgs)) | ||
new_svgs_path = str(Path(screenshot_folder, "new_svgs.png").resolve()) | ||
self.driver.save_screenshot(new_svgs_path); | ||
|
||
print("Finished uploading the svgs...") | ||
|
||
def take_icon_screenshot(self, screenshot_folder: str): | ||
""" | ||
Take the overview icon screenshot of the uploaded icons. | ||
:param svgs: a list of svg Paths that we'll upload to icomoon. | ||
:param screenshot_folder: the name of the screenshot_folder. | ||
""" | ||
# take pictures | ||
print("Taking screenshot of the new icons...") | ||
self.go_to_generate_font_page() | ||
|
||
# take an overall screenshot of the icons that were just added | ||
# also include the glyph count | ||
new_icons_path = str(Path(screenshot_folder, "new_icons.png").resolve()) | ||
main_content_xpath = "/html/body/div[4]/div[2]/div/div[1]" | ||
main_content = self.driver.find_element_by_xpath(main_content_xpath) | ||
main_content.screenshot(new_icons_path) | ||
print("Saved screenshot of the new icons...") | ||
|
||
def go_to_generate_font_page(self): | ||
""" | ||
Go to the generate font page. Also handles the "Deselect Icons | ||
with Strokes" alert. | ||
""" | ||
self.go_to_page(IcomoonPage.GENERATE_FONT) | ||
alert = self.test_for_possible_alert(self.MED_WAIT_IN_SEC) | ||
if alert == None: | ||
pass # all good | ||
elif alert == IcomoonAlerts.DESELECT_ICONS_CONTAINING_STROKES: | ||
message = f"One of SVGs contained strokes. This should not happen." | ||
raise Exception(message) | ||
else: | ||
raise Exception(f"Unexpected alert found: {alert}") | ||
|
||
def download_icomoon_fonts(self, zip_path: Path): | ||
""" | ||
Download the icomoon.zip from icomoon.io. Also take a picture of | ||
what the icons look like. | ||
:param zip_path: the path to the zip file after it's downloaded. | ||
""" | ||
print("Downloading Font files...") | ||
if self.current_page != IcomoonPage.SELECTION: | ||
self.go_to_page(IcomoonPage.SELECTION) | ||
|
||
self.select_all_icons_in_top_set() | ||
self.go_to_generate_font_page() | ||
|
||
download_btn = WebDriverWait(self.driver, SeleniumRunner.LONG_WAIT_IN_SEC).until( | ||
ec.presence_of_element_located((By.CSS_SELECTOR, "button.btn4 span")) | ||
) | ||
download_btn.click() | ||
if self.wait_for_zip(zip_path): | ||
print("Font files downloaded.") | ||
else: | ||
raise TimeoutError(f"Couldn't find {zip_path} after download button was clicked.") | ||
|
||
def wait_for_zip(self, zip_path: Path) -> bool: | ||
""" | ||
Wait for the zip file to be downloaded by checking for its existence | ||
in the download path. Wait time is self.LONG_WAIT_IN_SEC and check time | ||
is 1 sec. | ||
:param zip_path: the path to the zip file after it's | ||
downloaded. | ||
:return: True if the file is found within the allotted time, else | ||
False. | ||
""" | ||
end_time = time.time() + self.LONG_WAIT_IN_SEC | ||
while time.time() <= end_time: | ||
if zip_path.exists(): | ||
return True | ||
time.sleep(1) # wait so we don't waste sys resources | ||
return False | ||
from typing import List | ||
import time | ||
from pathlib import Path | ||
|
||
from selenium.webdriver.support.ui import WebDriverWait | ||
from selenium.webdriver.common.by import By | ||
from selenium.webdriver.support import expected_conditions as ec | ||
from selenium.common.exceptions import TimeoutException as SeleniumTimeoutException | ||
|
||
from build_assets.selenium_runner.SeleniumRunner import SeleniumRunner | ||
from build_assets.selenium_runner.enums import IcomoonPage, IcomoonAlerts, IcomoonOptionState | ||
|
||
class BuildSeleniumRunner(SeleniumRunner): | ||
def build_icons(self, icomoon_json_path: str, | ||
zip_path: Path, svgs: List[str], screenshot_folder: str): | ||
self.upload_icomoon(icomoon_json_path) | ||
# necessary so we can take screenshot of only the | ||
# recently uploaded icons later | ||
self.deselect_all_icons_in_top_set() | ||
self.upload_svgs(svgs, screenshot_folder) | ||
self.take_icon_screenshot(screenshot_folder) | ||
self.download_icomoon_fonts(zip_path) | ||
|
||
def upload_icomoon(self, icomoon_json_path: str): | ||
""" | ||
Upload the icomoon.json to icomoon.io. | ||
:param icomoon_json_path: a path to the iconmoon.json. | ||
:raises TimeoutException: happens when elements are not found. | ||
""" | ||
print("Uploading icomoon.json file...") | ||
|
||
# find the file input and enter the file path | ||
import_btn = self.driver.find_element_by_css_selector( | ||
SeleniumRunner.GENERAL_IMPORT_BUTTON_CSS | ||
) | ||
import_btn.send_keys(icomoon_json_path) | ||
|
||
try: | ||
confirm_btn = WebDriverWait(self.driver, SeleniumRunner.MED_WAIT_IN_SEC).until( | ||
ec.element_to_be_clickable((By.XPATH, "//div[@class='overlay']//button[text()='Yes']")) | ||
) | ||
confirm_btn.click() | ||
except SeleniumTimeoutException as e: | ||
raise Exception("Cannot find the confirm button when uploading the icomoon.json" \ | ||
"Ensure that the icomoon.json is in the correct format for Icomoon.io") | ||
|
||
print("JSON file uploaded.") | ||
|
||
def upload_svgs(self, svgs: List[str], screenshot_folder: str): | ||
""" | ||
Upload the SVGs provided in svgs. This will upload the | ||
:param svgs: a list of svg Paths that we'll upload to icomoon. | ||
:param screenshot_folder: the name of the screenshot_folder. | ||
""" | ||
print("Uploading SVGs...") | ||
|
||
import_btn = self.driver.find_element_by_css_selector( | ||
SeleniumRunner.SET_IMPORT_BUTTON_CSS | ||
) | ||
|
||
# there could be at most 2 alerts when we upload an SVG. | ||
possible_alerts_amount = 2 | ||
err_messages = [] | ||
for i in range(len(svgs)): | ||
import_btn.send_keys(svgs[i]) | ||
print(f"Uploading {svgs[i]}") | ||
|
||
# see if there are stroke messages or replacing icon message | ||
# there should be none of the second kind | ||
for j in range(possible_alerts_amount): | ||
alert = self.test_for_possible_alert(self.SHORT_WAIT_IN_SEC) | ||
if alert == None: | ||
pass # all good | ||
elif alert == IcomoonAlerts.STROKES_GET_IGNORED_WARNING: | ||
message = f"SVG contained strokes: {svgs[i]}." | ||
err_messages.append(message) | ||
self.click_alert_button(self.ALERTS[alert]["buttons"]["DISMISS"]) | ||
elif alert == IcomoonAlerts.REPLACE_OR_REIMPORT_ICON: | ||
message = f"Duplicated SVG: {svgs[i]}." | ||
err_messages.append(message) | ||
self.click_alert_button(self.ALERTS[alert]["buttons"]["REIMPORT"]) | ||
else: | ||
raise Exception(f"Unexpected alert found: {alert}") | ||
|
||
self.edit_svg() | ||
print(f"Finished editing icon.") | ||
|
||
if err_messages != []: | ||
message = "BuildSeleniumRunner - Issues found when uploading SVGs:\n" | ||
raise Exception(message + '\n'.join(err_messages)) | ||
|
||
# take a screenshot of the svgs that were just added | ||
# select the latest icons | ||
self.switch_toolbar_option(IcomoonOptionState.SELECT) | ||
self.select_all_icons_in_top_set() | ||
new_svgs_path = str(Path(screenshot_folder, "new_svgs.png").resolve()) | ||
self.driver.save_screenshot(new_svgs_path); | ||
|
||
print("Finished uploading the svgs...") | ||
|
||
def take_icon_screenshot(self, screenshot_folder: str): | ||
""" | ||
Take the overview icon screenshot of the uploaded icons. | ||
:param svgs: a list of svg Paths that we'll upload to icomoon. | ||
:param screenshot_folder: the name of the screenshot_folder. | ||
""" | ||
# take pictures | ||
print("Taking screenshot of the new icons...") | ||
self.go_to_generate_font_page() | ||
|
||
# take an overall screenshot of the icons that were just added | ||
# also include the glyph count | ||
new_icons_path = str(Path(screenshot_folder, "new_icons.png").resolve()) | ||
main_content_xpath = "/html/body/div[4]/div[2]/div/div[1]" | ||
main_content = self.driver.find_element_by_xpath(main_content_xpath) | ||
main_content.screenshot(new_icons_path) | ||
print("Saved screenshot of the new icons...") | ||
|
||
def go_to_generate_font_page(self): | ||
""" | ||
Go to the generate font page. Also handles the "Deselect Icons | ||
with Strokes" alert. | ||
""" | ||
self.go_to_page(IcomoonPage.GENERATE_FONT) | ||
alert = self.test_for_possible_alert(self.MED_WAIT_IN_SEC) | ||
if alert == None: | ||
pass # all good | ||
elif alert == IcomoonAlerts.DESELECT_ICONS_CONTAINING_STROKES: | ||
message = f"One of SVGs contained strokes. This should not happen." | ||
raise Exception(message) | ||
else: | ||
raise Exception(f"Unexpected alert found: {alert}") | ||
|
||
def download_icomoon_fonts(self, zip_path: Path): | ||
""" | ||
Download the icomoon.zip from icomoon.io. Also take a picture of | ||
what the icons look like. | ||
:param zip_path: the path to the zip file after it's downloaded. | ||
""" | ||
print("Downloading Font files...") | ||
if self.current_page != IcomoonPage.SELECTION: | ||
self.go_to_page(IcomoonPage.SELECTION) | ||
|
||
self.select_all_icons_in_top_set() | ||
self.go_to_generate_font_page() | ||
|
||
download_btn = WebDriverWait(self.driver, SeleniumRunner.LONG_WAIT_IN_SEC).until( | ||
ec.presence_of_element_located((By.CSS_SELECTOR, "button.btn4 span")) | ||
) | ||
download_btn.click() | ||
if self.wait_for_zip(zip_path): | ||
print("Font files downloaded.") | ||
else: | ||
raise TimeoutError(f"Couldn't find {zip_path} after download button was clicked.") | ||
|
||
def wait_for_zip(self, zip_path: Path) -> bool: | ||
""" | ||
Wait for the zip file to be downloaded by checking for its existence | ||
in the download path. Wait time is self.LONG_WAIT_IN_SEC and check time | ||
is 1 sec. | ||
:param zip_path: the path to the zip file after it's | ||
downloaded. | ||
:return: True if the file is found within the allotted time, else | ||
False. | ||
""" | ||
end_time = time.time() + self.LONG_WAIT_IN_SEC | ||
while time.time() <= end_time: | ||
if zip_path.exists(): | ||
return True | ||
time.sleep(1) # wait so we don't waste sys resources | ||
return False |