Форум сайта python.su
Добрый день!
Подскажите, бьюсь уже несколько часов и не могу понять что не так.
Есть скрипт (приведен ниже). У меня работает хорошо, есть только косяк, что почему-то не может открыть ссылки, если не прописан протокол подключения, но думаю с этим разберусь. Главная проблема в том, что после компиляции в .exe у меня работает всё на ура, но стоит перенести .exe со всеми библиотеками, на других ПК не запускается.
Проверял версии WebDriver, устанавливал Selenium и т.д., просто не открывается Chrome (пробовал изменять на EdgeDriver). Я даже понять не могу не работает в общем и целом скрипт или просто не может достучаться до ChromeWebDriver.
Я в Phytone новичок, писал этот скрипт больше 2 месяцев. Уже обрадовался что у меня заработал, но на других ПК не работает. Подскажите в чем может быть проблема.
Спасибо!
import pyautogui from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager import win32api import time import tkinter as tk from tkinter import filedialog import os def save_screenshots(desired_width, desired_height, x, y, close_browser_after_screenshot): driver = webdriver.Chrome(ChromeDriverManager().install()) driver.set_window_size(desired_width, desired_height) region_width, region_height = desired_width - x, desired_height - y region_x, region_y, region_width, region_height = x, y, region_width, region_height folder_path = folder_path_entry.get() # Читаем список URL with open(urls_file_entry.get(), 'r') as f: for url in f: url = url.strip() if url.endswith('/'): url = url[:-1] driver.execute_script("window.open('" + url + "', '_blank');") time.sleep(int(sleep_entry.get())) # добавляем задержку в 10 секунд, чтобы страница успела загрузиться driver.switch_to.window(driver.window_handles[-1]) filename = url.split('//')[1].replace('/', '_') + '.png' file_path = os.path.join(folder_path, filename) # создаем полный путь к файлу pyautogui.screenshot(file_path, region=(region_x, region_y, region_width, region_height)) if close_browser_after_screenshot: driver.quit() def browse_folder_path(): folder_path = filedialog.askdirectory() folder_path_entry.delete(0, tk.END) folder_path_entry.insert(0, folder_path) def browse_urls_file(): file_path = filedialog.askopenfilename() urls_file_entry.delete(0, tk.END) urls_file_entry.insert(0, file_path) def start_screenshot(): desired_width = int(desired_width_entry.get()) desired_height = int(desired_height_entry.get()) x = int(x_entry.get()) y = int(y_entry.get()) close_browser_after_screenshot = close_browser_after_screenshot_var.get() save_screenshots(desired_width, desired_height, x, y, close_browser_after_screenshot) #Интерфейс root = tk.Tk() root.title("Автоскриншотер") desired_width_label = tk.Label(root, text="Ширина:") desired_width_entry = tk.Entry(root, width=10) desired_width_entry.insert(0, "2560") desired_height_label = tk.Label(root, text="Высота:") desired_height_entry = tk.Entry(root, width=10) desired_height_entry.insert(0, str(win32api.GetSystemMetrics(1) - 80)) # 40 - высота трея Windows по умолчанию sleep_label = tk.Label(root, text="Время ожидания (секунды):") sleep_entry = tk.Entry(root, width=10) sleep_entry.insert(0, "5") x_label = tk.Label(root, text="X:") x_entry = tk.Entry(root, width=10) x_entry.insert(0, "0") y_label = tk.Label(root, text="Y:") y_entry = tk.Entry(root, width=10) y_entry.insert(0, "0") folder_path_label = tk.Label(root, text="Куда сохранить скриншоты:") folder_path_entry = tk.Entry(root, width=35) folder_path_entry.insert(0, "Нажми на путь чтобы выбрать папку...") folder_path_button = tk.Button(root, text="Путь", command=browse_folder_path) urls_file_label = tk.Label(root, text="Путь к текстовому файлу с URL:") urls_file_entry = tk.Entry(root, width=35) urls_file_entry.insert(0, "Нажми на путь чтобы выбрать файл...") urls_file_button = tk.Button(root, text="Путь", command=browse_urls_file) close_browser_after_screenshot_var = tk.BooleanVar() close_browser_after_screenshot_var.set(True) close_browser_after_screenshot_checkbutton = tk.Checkbutton(root, text="Закрыть браузер") start_button = tk.Button(root, text="Скриншотить", command=start_screenshot) # Отображаем элементы управления на окне desired_width_label.grid(row=0, column=0, sticky="w") desired_width_entry.grid(row=0, column=0) desired_height_label.grid(row=1, column=0, sticky="w") desired_height_entry.grid(row=1, column=0) x_label.grid(row=2, column=0, sticky="w") x_entry.grid(row=2, column=0) y_label.grid(row=3, column=0, sticky="w") y_entry.grid(row=3, column=0) sleep_label.grid(row=6, column=0, sticky="w") sleep_entry.grid(row=6, column=1) folder_path_label.grid(row=4, column=0, sticky="w") folder_path_entry.grid(row=4, column=1) folder_path_button.grid(row=4, column=2) urls_file_label.grid(row=5, column=0, sticky="w") urls_file_entry.grid(row=5, column=1) urls_file_button.grid(row=5, column=2) close_browser_after_screenshot_checkbutton.grid(row=7, column=0, columnspan=2) start_button.grid(row=8, column=0, columnspan=3) root.mainloop()
Отредактировано NewStudent (Апрель 7, 2023 15:24:47)
Офлайн
1) Зачем использовать этот ChromeDriverManager, это “deprecated” библиотека в каком-то роде. Скачай с оф (сайта) нужный сервер и его положи рядом со скриптом
Так как ты используешь библу для Windows API, предположу, что запускать ты будешь это только на винде. Следовательно скачай последнюю версию chromdriver.exe и норм будет (старые версии хрома от 96.x.x тоже будут работать)
2) Зачем использовать аж pywin32api, если у селениума есть встроенная функция скриншота
driver.save_screenshot("ss.png")
# Life loop while alive: if (fun > boredom) and money: pass_day(fun, boredom, money) continue else: break
Отредактировано DamMercul (Апрель 7, 2023 13:44:25)
Офлайн
Добрый день!
Спасибо за ответ.
Делал не через freez, а pyinstaller.
Я не использую именно Selenium, потому что у Selenium нет возможности делать скриншот адресной строки браузера, он всё полностью обрезает.
“Не критика, но просто предупреждение: tkinter - рудимент питона, если хочешь делать простенькие GUI'шки, советую easygui, PySimpleGUI”
Попробую!
Разобрался в чем проблема была.
Установил на другом ПК phyton и при запуска скрипта он начал скачивать WDN, как я понял это webdriver и еще попросил скачать pillow.
Всё работает, но мне это не нравится. Я пробовал в ручную установить chromedriver и прописать PATH, но почему-то не подтягивает.
Теперь вот в чем вопрос, как мне сделать так, чтобы мне не пришлось на каждом ПК устанавливать Phyton для скачивания недостающего модуля или библиотеки.
Разве при компиляции в .exe библиотеки не должна также формироваться в папке?
Может я что-то упускаю. Осталось вроде чуть чуть и всё будет работать как надо, но вот этого чуть чуть не хватает(
П.С.
Такие нагромождения в коде, потому что не опытен и пытался путем методом и проб.
Отредактировано NewStudent (Апрель 7, 2023 15:25:34)
Офлайн
Программу написал.
Пришлось всё переписывать и использовать классические библиотеки, от Selenium отказался и рад этому.
Топик можно закрывать.
Отредактировано NewStudent (Апрель 10, 2023 01:22:53)
Офлайн