mirror of
https://github.com/konpa/devicon.git
synced 2025-08-11 09:04:27 +02:00
123 lines
5.1 KiB
Python
123 lines
5.1 KiB
Python
from typing import List
|
|
from pathlib import Path
|
|
|
|
from build_assets.selenium_runner.SeleniumRunner import SeleniumRunner
|
|
from build_assets.selenium_runner.enums import IcomoonPage, IcomoonAlerts
|
|
|
|
class PeekSeleniumRunner(SeleniumRunner):
|
|
def peek(self, svgs: List[str], screenshot_folder: str, icon_info: dict):
|
|
"""
|
|
Upload the SVGs and peek at how Icomoon interpret its SVGs and
|
|
font versions.
|
|
:param svgs: a list of svg Paths that we'll upload to icomoon.
|
|
:param screenshot_folder: the name of the screenshot_folder.
|
|
:param icon_info: a dictionary containing info on an icon. Taken from the devicon.json.
|
|
:return an array of svgs with strokes as strings. These show which icon
|
|
contains stroke.
|
|
"""
|
|
messages = self.peek_svgs(svgs, screenshot_folder)
|
|
self.peek_icons(screenshot_folder, icon_info)
|
|
return messages
|
|
|
|
def peek_svgs(self, svgs: List[str], screenshot_folder: str):
|
|
"""
|
|
Peek at the SVGs provided in svgs. This will look at how Icomoon
|
|
interprets the SVGs as a font.
|
|
:param svgs: a list of svg Paths that we'll upload to icomoon.
|
|
:param screenshot_folder: the name of the screenshot_folder.
|
|
:return an array of svgs with strokes as strings. These show which icon
|
|
contains stroke.
|
|
"""
|
|
print("Peeking SVGs...", file=self.log_output)
|
|
|
|
import_btn = self.driver.find_element_by_css_selector(
|
|
SeleniumRunner.GENERAL_IMPORT_BUTTON_CSS
|
|
)
|
|
|
|
svgs_with_strokes = []
|
|
for i in range(len(svgs)):
|
|
import_btn.send_keys(svgs[i])
|
|
print(f"Uploaded {svgs[i]}", file=self.log_output)
|
|
|
|
alert = self.test_for_possible_alert(self.SHORT_WAIT_IN_SEC)
|
|
if alert == None:
|
|
pass # all good
|
|
elif alert == IcomoonAlerts.STROKES_GET_IGNORED_WARNING:
|
|
print(f"- This icon contains strokes: {svgs[i]}", file=self.log_output)
|
|
svg = Path(svgs[i])
|
|
svgs_with_strokes.append(f"- {svg.name}")
|
|
self.click_alert_button(self.ALERTS[alert]["buttons"]["DISMISS"])
|
|
else:
|
|
raise Exception(f"Unexpected alert found: {alert}")
|
|
|
|
self.edit_svg(screenshot_folder, i)
|
|
|
|
# take a screenshot of the svgs that were just added
|
|
self.select_all_icons_in_top_set()
|
|
new_svgs_path = str(Path(screenshot_folder, "new_svgs.png").resolve())
|
|
icon_set_xpath = "/html/body/div[4]/div[1]/div[2]/div[1]"
|
|
icon_set = self.driver.find_element_by_xpath(icon_set_xpath)
|
|
icon_set.screenshot(new_svgs_path)
|
|
|
|
print("Finished peeking the svgs...", file=self.log_output)
|
|
return svgs_with_strokes
|
|
|
|
def peek_icons(self, screenshot_folder: str, icon_info: dict):
|
|
"""
|
|
Peek at the icon versions of the SVGs that were uploaded.
|
|
:param screenshot_folder: the name of the screenshot_folder.
|
|
:param icon_info: a dictionary containing info on an icon. Taken from the devicon.json.
|
|
"""
|
|
print("Begin peeking at the icons...", file=self.log_output)
|
|
# ensure all icons in the set is selected.
|
|
self.select_all_icons_in_top_set()
|
|
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:
|
|
self.click_alert_button(self.ALERTS[alert]["buttons"]["CONTINUE"])
|
|
else:
|
|
raise Exception(f"Unexpected alert found: {alert}")
|
|
|
|
# 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);
|
|
|
|
# go in reverse order so we get the oldest icon first
|
|
icon_divs_xpath = f'//div[@id="glyphSet0"]/div'
|
|
icon_divs = self.driver.find_elements_by_xpath(icon_divs_xpath)
|
|
icon_divs.reverse()
|
|
i = 0
|
|
for icon_div in icon_divs:
|
|
if not icon_div.is_displayed():
|
|
continue
|
|
|
|
icon_screenshot = str(
|
|
Path(screenshot_folder, f"new_icon_{i}.png").resolve()
|
|
)
|
|
icon_div.screenshot(icon_screenshot)
|
|
|
|
i += 1
|
|
|
|
# test the colors
|
|
style = "#glyphSet0 span:first-of-type {color: " + icon_info["color"] + "}"
|
|
script = f"document.styleSheets[0].insertRule('{style}', 0)"
|
|
self.driver.execute_script(script)
|
|
i = 0
|
|
for icon_div in icon_divs:
|
|
if not icon_div.is_displayed():
|
|
continue
|
|
|
|
icon_screenshot = str(
|
|
Path(screenshot_folder, f"new_colored_icon_{i}.png").resolve()
|
|
)
|
|
icon_div.screenshot(icon_screenshot)
|
|
|
|
i += 1
|
|
|
|
print("Finished peeking the icons...", file=self.log_output)
|