Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 6, 2023 22:22:41

NewStudent
Зарегистрирован: 2022-12-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Python АвтоСкриншотер

Добрый день!

Подскажите, бьюсь уже несколько часов и не могу понять что не так.

Есть скрипт (приведен ниже). У меня работает хорошо, есть только косяк, что почему-то не может открыть ссылки, если не прописан протокол подключения, но думаю с этим разберусь. Главная проблема в том, что после компиляции в .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)

Офлайн

#2 Апрель 7, 2023 13:43:21

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Python АвтоСкриншотер

1) Зачем использовать этот ChromeDriverManager, это “deprecated” библиотека в каком-то роде. Скачай с оф (сайта) нужный сервер и его положи рядом со скриптом
Так как ты используешь библу для Windows API, предположу, что запускать ты будешь это только на винде. Следовательно скачай последнюю версию chromdriver.exe и норм будет (старые версии хрома от 96.x.x тоже будут работать)

2) Зачем использовать аж pywin32api, если у селениума есть встроенная функция скриншота

 driver.save_screenshot("ss.png")

3) Не критика, но просто предупреждение: tkinter - рудимент питона, если хочешь делать простенькие GUI'шки, советую easygui, PySimpleGUI

Ответ на твой вопрос, почему не работает. Может быть много причин, рекомендую сделать тестовый дебаг билд с логами и посмотреть, что именно тебе выдаст трейсбек, но мои предположения такие:
1. Не во всех виндах будет работать tkinter, возможно дело в этом
2. На разных компах стоит разных хром (разной версии), возможно просто скачиватеся неправильный chromdriver
3. Проверь то, как именно ты его билдишь в exe. Если через freeze, то часто в конфиге билдера надо вручную указывать библиотеки, которые необходимо добавить в пак



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Отредактировано DamMercul (Апрель 7, 2023 13:44:25)

Офлайн

#3 Апрель 7, 2023 15:22:22

NewStudent
Зарегистрирован: 2022-12-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Python АвтоСкриншотер

Добрый день!

Спасибо за ответ.

Делал не через freez, а pyinstaller.

Я не использую именно Selenium, потому что у Selenium нет возможности делать скриншот адресной строки браузера, он всё полностью обрезает.

“Не критика, но просто предупреждение: tkinter - рудимент питона, если хочешь делать простенькие GUI'шки, советую easygui, PySimpleGUI”

Попробую!


Разобрался в чем проблема была.

Установил на другом ПК phyton и при запуска скрипта он начал скачивать WDN, как я понял это webdriver и еще попросил скачать pillow.


Всё работает, но мне это не нравится. Я пробовал в ручную установить chromedriver и прописать PATH, но почему-то не подтягивает.


Теперь вот в чем вопрос, как мне сделать так, чтобы мне не пришлось на каждом ПК устанавливать Phyton для скачивания недостающего модуля или библиотеки.

Разве при компиляции в .exe библиотеки не должна также формироваться в папке?


Может я что-то упускаю. Осталось вроде чуть чуть и всё будет работать как надо, но вот этого чуть чуть не хватает(


П.С.
Такие нагромождения в коде, потому что не опытен и пытался путем методом и проб.

Отредактировано NewStudent (Апрель 7, 2023 15:25:34)

Офлайн

#4 Апрель 10, 2023 01:22:14

NewStudent
Зарегистрирован: 2022-12-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Python АвтоСкриншотер

Программу написал.

Пришлось всё переписывать и использовать классические библиотеки, от Selenium отказался и рад этому.

Топик можно закрывать.

Отредактировано NewStudent (Апрель 10, 2023 01:22:53)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version