Selinium Webdriver
Verfasst: Freitag 2. August 2024, 11:43
Hallo Leute,
Ich bin neu hier und komme ursprünglich aus der AutoIt-Welt des Codings. Nun habe ich mich zum ersten Mal mit Python auseinandergesetzt und bin mir noch nicht ganz sicher im Umgang mit dieser Programmiersprache.
Für mein aktuelles Projekt, das ich zuvor in AutoIt fertiggestellt hatte, aber ohnehin umändern muss, habe ich mich entschlossen, es mit Python zu programmieren. Bei meinen ersten Tests habe ich bereits eine GUI und ein Einstellungsfenster erstellt, um den Start des Webdrivers individuell zu gestalten.
Warum mache ich das?
Nun, ich muss Daten von einer firmeneigenen Seite abrufen und möchte dabei möglichst viele Ressourcen sparen.
Unter AutoIt konnte ich nicht alle Optionen des Webdrivers durchtesten.
Daher möchte ich ein Menü schaffen, das alle Eigenschaften und Einstellungen umfasst, um herauszufinden, was benötigt wird und was während der Laufzeit des Programms abgeschaltet werden kann.
Leider werden meine Einstellungen zwar in der SQLite-Datei übernommen, in der die Konfiguration gespeichert wird, aber nicht alle Funktionen/Argumente werden ausgeführt, wenn ich die Argumente auswähle.
Headless- und Inkognito-Modus funktionieren immer, aber z.B. das Nichtladen von Bildern funktioniert nicht. Wenn ich die Einstellungen direkt im Code angebe und starte, funktioniert alles einwandfrei.
Momentan habe ich nur 'Chrome' im Code berücksichtigt, möchte aber gerne, dass es mit allen Browsern funktioniert. Es muss jedoch erst einmal bei einem Browser funktionieren.
Hat jemand vielleicht ähnliche Erfahrungen gemacht oder Ideen, woran das liegen könnte?
Jede Hilfe wäre sehr willkommen!
Vielen Dank im Voraus!
module :
Ich bin neu hier und komme ursprünglich aus der AutoIt-Welt des Codings. Nun habe ich mich zum ersten Mal mit Python auseinandergesetzt und bin mir noch nicht ganz sicher im Umgang mit dieser Programmiersprache.
Für mein aktuelles Projekt, das ich zuvor in AutoIt fertiggestellt hatte, aber ohnehin umändern muss, habe ich mich entschlossen, es mit Python zu programmieren. Bei meinen ersten Tests habe ich bereits eine GUI und ein Einstellungsfenster erstellt, um den Start des Webdrivers individuell zu gestalten.
Warum mache ich das?
Nun, ich muss Daten von einer firmeneigenen Seite abrufen und möchte dabei möglichst viele Ressourcen sparen.
Unter AutoIt konnte ich nicht alle Optionen des Webdrivers durchtesten.
Daher möchte ich ein Menü schaffen, das alle Eigenschaften und Einstellungen umfasst, um herauszufinden, was benötigt wird und was während der Laufzeit des Programms abgeschaltet werden kann.
Leider werden meine Einstellungen zwar in der SQLite-Datei übernommen, in der die Konfiguration gespeichert wird, aber nicht alle Funktionen/Argumente werden ausgeführt, wenn ich die Argumente auswähle.
Headless- und Inkognito-Modus funktionieren immer, aber z.B. das Nichtladen von Bildern funktioniert nicht. Wenn ich die Einstellungen direkt im Code angebe und starte, funktioniert alles einwandfrei.
Momentan habe ich nur 'Chrome' im Code berücksichtigt, möchte aber gerne, dass es mit allen Browsern funktioniert. Es muss jedoch erst einmal bei einem Browser funktionieren.
Hat jemand vielleicht ähnliche Erfahrungen gemacht oder Ideen, woran das liegen könnte?
Jede Hilfe wäre sehr willkommen!
Vielen Dank im Voraus!
module :
Code: Alles auswählen
pip install selenium webdriver-manager customtkinter
Code: Alles auswählen
(edit: selenium
beautifulsoup4
requests
PyQt5
SQLAlchemy)
Code: Alles auswählen
import os
import sqlite3
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.firefox.service import Service as FirefoxService
from selenium.webdriver.safari.service import Service as SafariService
from selenium.webdriver.edge.service import Service as EdgeService
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.firefox import GeckoDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.firefox.options import Options as FirefoxOptions
from selenium.webdriver.safari.options import Options as SafariOptions
from selenium.webdriver.edge.options import Options as EdgeOptions
import customtkinter as ctk
import tkinter as tk
class WebDriverManager:
def __init__(self):
self.settings_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'settings')
os.makedirs(self.settings_dir, exist_ok=True)
self.config_path = os.path.join(self.settings_dir, 'config.db')
self.driver = None
self.browser = None
self.detailed_report = False
self.chrome_options = []
self.create_config_table()
self.load_settings()
def create_config_table(self):
conn = sqlite3.connect(self.config_path)
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS webdriver_settings (
id INTEGER PRIMARY KEY,
browser TEXT,
detailed_report BOOLEAN,
chrome_options TEXT
)''')
conn.commit()
conn.close()
def load_settings(self):
conn = sqlite3.connect(self.config_path)
c = conn.cursor()
c.execute("SELECT * FROM webdriver_settings WHERE id=1")
row = c.fetchone()
if row:
self.browser = row[1]
self.detailed_report = bool(row[2])
self.chrome_options = row[3].split(',')
conn.close()
def save_settings(self, browser, detailed_report, chrome_options):
chrome_options_str = ','.join(chrome_options)
conn = sqlite3.connect(self.config_path)
c = conn.cursor()
c.execute('''INSERT OR REPLACE INTO webdriver_settings
(id, browser, detailed_report, chrome_options)
VALUES (?, ?, ?, ?)''',
(1, browser, detailed_report, chrome_options_str))
conn.commit()
conn.close()
def start_webdriver(self, browser, chrome_options):
if self.driver:
self.driver.quit()
self.browser = browser
self.chrome_options = chrome_options
options = None
service = None
print(f"Starting WebDriver with options: {self.chrome_options}")
if self.browser == "chrome":
options = ChromeOptions()
for option in self.chrome_options:
if '=' in option:
key, value = option.split('=', 1)
options.add_argument(f"--{key}={value}")
else:
options.add_argument(f"--{option}")
if 'useAutomationExtension=false' in self.chrome_options:
options.add_experimental_option('useAutomationExtension', False)
if 'disable-blink-features=AutomationControlled' in self.chrome_options:
options.add_argument('--disable-blink-features=AutomationControlled')
service = ChromeService(ChromeDriverManager().install())
elif self.browser == "firefox":
options = FirefoxOptions()
# Fügen Sie hier Ihre Firefox-Optionen hinzu
service = FirefoxService(GeckoDriverManager().install())
elif self.browser == "safari":
options = SafariOptions()
# Fügen Sie hier Ihre Safari-Optionen hinzu
service = SafariService()
elif self.browser == "edge":
options = EdgeOptions()
options.use_chromium = True
# Fügen Sie hier Ihre Edge-Optionen hinzu
service = EdgeService(EdgeChromiumDriverManager().install())
if options and service:
if self.browser == "chrome":
self.driver = webdriver.Chrome(service=service, options=options)
elif self.browser == "firefox":
self.driver = webdriver.Firefox(service=service, options=options)
elif self.browser == "safari":
self.driver = webdriver.Safari(service=service, options=options)
elif self.browser == "edge":
self.driver = webdriver.Edge(service=service, options=options)
if self.detailed_report:
self.enable_detailed_logging()
def enable_detailed_logging(self):
# Implement logging setup here
pass
class WebDriverSettings(tk.Toplevel):
def __init__(self, parent):
super().__init__(parent)
self.title("WebDriver Einstellungen")
self.geometry("700x900")
self.create_widgets()
self.webd_func = WebDriverManager()
self.load_settings()
def create_widgets(self):
options_frame = ctk.CTkFrame(self)
options_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
self.browser_var = tk.StringVar(value="chrome")
ctk.CTkLabel(options_frame, text="Browser:").pack(anchor=tk.W)
ctk.CTkRadioButton(options_frame, text="Chrome", variable=self.browser_var, value="chrome").pack(anchor=tk.W)
ctk.CTkRadioButton(options_frame, text="Firefox", variable=self.browser_var, value="firefox").pack(anchor=tk.W)
ctk.CTkRadioButton(options_frame, text="Safari", variable=self.browser_var, value="safari").pack(anchor=tk.W)
ctk.CTkRadioButton(options_frame, text="Edge", variable=self.browser_var, value="edge").pack(anchor=tk.W)
self.detailed_report_var = tk.BooleanVar(value=False)
ctk.CTkLabel(options_frame, text="Ausführlicher Bericht:").pack(anchor=tk.W)
ctk.CTkCheckBox(options_frame, text="Erstellen", variable=self.detailed_report_var).pack(anchor=tk.W)
self.chrome_options_frame = ctk.CTkFrame(options_frame)
self.chrome_options_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
ctk.CTkLabel(self.chrome_options_frame, text="Chrome Optionen:").pack(anchor=tk.W)
chrome_options = [
("Kopflose Ausführung", "headless", "Führt den Browser im Kopflose Modus aus."),
("Keine Sandbox", "no_sandbox", "Deaktiviert die Sandbox-Sicherheitsfunktion."),
("Deaktivieren der Verwendung von /dev/shm", "disable_dev_shm_usage", "Verhindert die Nutzung von /dev/shm für mehr Stabilität."),
("Deaktivieren von Erweiterungen", "disable_extensions", "Deaktiviert alle installierten Erweiterungen."),
("Inkognito-Modus", "incognito", "Startet den Browser im Inkognito-Modus."),
("Maximiertes Fenster starten", "start_maximized", "Startet den Browser im maximierten Modus."),
("Deaktivieren der Infobars", "disable_infobars", "Deaktiviert Infobars."),
("Deaktivieren des Popup-Blockers", "disable_popup_blocking", "Deaktiviert den Popup-Blocker."),
("Deaktivieren der Web-Sicherheit", "disable_web_security", "Deaktiviert die Web-Sicherheitsfunktionen."),
("Sprache auf Deutsch setzen", "lang=de", "Setzt die Sprache des Browsers auf Deutsch."),
("Deaktivieren der Blink-Features für Automatisierungskontrolle", "disable_blink_features=AutomationControlled", "Deaktiviert die Blink-Features."),
("Deaktivieren der JavaScript", "disable_javascript", "Deaktiviert JavaScript."),
("Deaktivieren der Plugins", "disable_plugins", "Deaktiviert Plugins."),
("Deaktivieren der PDF-Material-UI", "disable_pdf_material_ui", "Deaktiviert die PDF-Material-UI."),
("Deaktivieren des Hintergrund-Timer-Drosselung", "disable_background_timer_throttling", "Deaktiviert die Drosselung von Hintergrund-Timern."),
("Deaktivieren der Hintergrund-Fenster", "disable_backgrounding_occluded_windows", "Deaktiviert Hintergrund-Fenster."),
("Deaktivieren des Renderer-Hintergrundes", "disable_renderer_backgrounding", "Deaktiviert den Hintergrund des Renderers."),
("Deaktivieren des Hang-Monitors", "disable_hang_monitor", "Deaktiviert den Hang-Monitor."),
("Deaktivieren der Synchronisation", "disable_sync", "Deaktiviert die Synchronisation."),
("Deaktivieren der Übersetzungsfunktion", "disable_translate", "Deaktiviert die automatische Übersetzung."),
("Nur Metriken aufzeichnen", "metrics_recording_only", "Zeichnet nur Metriken auf."),
("Automatische Safe-Browsing-Updates deaktivieren", "safebrowsing_disable_auto_update", "Deaktiviert automatische Safe-Browsing-Updates."),
("Zertifikatfehler ignorieren", "ignore_certificate_errors", "Ignoriert alle SSL-Zertifikatfehler."),
("Erlaube unsicheren localhost", "allow_insecure_localhost", "Ignoriert unsichere Verbindungen zu localhost."),
("Erlaube Loopback in Peer-Verbindung", "allow_loopback_in_peer_connection", "Erlaubt die Verwendung von Loopback in Peer-Verbindungen."),
("Deaktiviere Blink-Bilder", "blink_settings=imagesEnabled=false", "Deaktiviert das Laden von Bildern."),
("Automatisierungsinformationen deaktivieren", "useAutomationExtension=false", "Deaktiviert die Anzeige von Automatisierungsinformationen."),
]
self.chrome_vars = {}
for text, value, tooltip in chrome_options:
var = tk.BooleanVar(value=False)
self.chrome_vars[value] = var
self.create_checkbox(self.chrome_options_frame, text, var, tooltip)
save_button = ctk.CTkButton(self, text="Speichern", command=self.save_settings)
save_button.pack(pady=10)
def create_checkbox(self, frame, text, var, tooltip):
checkbox = ctk.CTkCheckBox(frame, text=text, variable=var)
checkbox.pack(anchor=tk.W)
checkbox.bind("<Enter>", lambda event, tooltip=tooltip: self.show_tooltip(event, tooltip))
checkbox.bind("<Leave>", self.hide_tooltip)
def show_tooltip(self, event, text):
x = event.widget.winfo_rootx() + 20
y = event.widget.winfo_rooty() + 20
self.tooltip = tk.Toplevel(self)
self.tooltip.wm_overrideredirect(True)
self.tooltip.wm_geometry(f"+{x}+{y}")
label = tk.Label(self.tooltip, text=text, background="yellow", relief="solid", borderwidth=1, padx=1, pady=1)
label.pack()
def hide_tooltip(self, event):
if self.tooltip:
self.tooltip.destroy()
self.tooltip = None
def load_settings(self):
self.webd_func.load_settings()
def save_settings(self):
browser = self.browser_var.get()
detailed_report = self.detailed_report_var.get()
chrome_options = [key for key, var in self.chrome_vars.items() if var.get()]
self.webd_func.save_settings(browser, detailed_report, chrome_options)
self.webd_func.start_webdriver(browser, chrome_options)
if __name__ == "__main__":
root = tk.Tk()
root.withdraw() # Versteckt das Hauptfenster
app = WebDriverSettings(root)
app.mainloop()