מצאתי שקוד ישן שלי שנועד לבדוק דף שמכיל קצת JS מעצבן, כבר לא עובד אחרי ששדרגתי את הדביאן שלי. הקוד כתוב בפייתון כי הייתי צריך לייצר קוד דחוף בזמנו וכל שאר הדברים כבר היו בפייתון, וכן לא יכלתי להשתמש בשפה נורמאלית כמו פרל (סליחה לשי, הוא עשה פרצוף כשסיפרתי לו מקרה דומה בעבר). מפה לשם זה נשאר כבר שנים ככה, וזה פשוט עובד.
היום ניסתי לבדוק אותו כי שוב יש לי גישה למערכת שאתה מייצרת אותו (embeded device), מתברר שמאז bulseye משהוא נשבר , והסקריפט היה מתעופף כשיש גרסה עדנית של סלניום.
התיקון הוא שימוש בdriver.save_screenshot במקום הגישה שהייתה קודם לכן בה הייתי מצלם מסך ע"י קריאה למתודה על האלמנט עצמו.
הקוד הזה הוא גרוע, הוא לא בודק שגיאות או חריגות, אבל הוא עובד לצרכים שלי.
#!/usr/bin/python3
#Author Boris Shtrasman 2020
#License MIT/X11
# Originally a short script to take a screenshot from my dump device web interface, later adjust to any scroll required page, all it does, is simply a screengrab and not a proper PDF. as the device has no auth just pass url with full path.
# Tested on Debian Bookworm in 2023, you can install some required debs to be able to run it:
# apt-get install python3-selenium chromium-driver chromium-l10n chromium-shell chromium-driver chromium chromium-sandbox --no-install-recommends
import argparse #in order to be able to use argument parser
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time
import datetime
parser =argparse.ArgumentParser()
parser.add_argument('-u','--url', help="url to fetch", required= True)
args = parser.parse_args()
url = args.url
print (url)
cur_date = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
outputfilename = '/tmp/' + url.replace('/','_') +'_' + cur_date + '.png'
#Path to chrome driver, check your OS in case of a non ddebian one
CHROMEDRIVER = '/usr/bin/chromedriver'
#why did I choose a log-path instead a proper logger ? because I'm lazy, that's why!
s = Service(CHROMEDRIVER, service_args=["--verbose", "--log-path=./logfile.log"] )
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument('--no-sandbox')
driver = webdriver.Chrome(service=s, options=chrome_options) #take note for the new syntax in Bookworm!
driver.implicitly_wait(20) #wait a bit to get missing DOM elements into the page
driver.get(args.url)
driver.set_script_timeout(3600)
# scroll down the page, wait for a while between each scroll
#Inital page size, or page size on last iteration
page_height_from_scrollheight = driver.execute_script("return document.body.scrollHeight")
#On each scroll event we are going to get the updated height
updated_page_height_from_scrollheight = 0
#iterate over what we presume an entire page
while page_height_from_scrollheight != updated_page_height_from_scrollheight:
# Scroll to the end of the vertical end
driver.execute_script('window.scrollTo(0,document.body.scrollHeight,"smooth");')
time.sleep(1.8)
updated_page_height_from_scrollheight = driver.execute_script("return document.body.scrollHeight")
page_height_from_scrollheight = updated_page_height_from_scrollheight
# As we do not wish to hog the server, limit our new requests for a safe time period
#As we are doing a screenshot, we need to have height and width of the screen , set size to last known size.
driver.set_window_size(1280,updated_page_height_from_scrollheight)
driver.save_screenshot(outputfilename)
time.sleep(10) # give enough time for selenium to flush the file to disk
driver.quit()
נ.ב. לגאון הבא שדוחף ממשק ווב למכשיר שלא אמור להחזיק ממשק וובי למכשיר שיש לו מסך, שים את הממשק במסך או יותר טוב, פשוט תשתמש בפיקוד אנלוגי אם אתה לא מוסגל. !
אין תגובות:
הוסף רשומת תגובה