Programm funktioniert nicht brauche Hilfe?

NackterGerd  05.09.2024, 06:59

Hast du schon mal dir Fehlermeldungen angeschaut

jstn279 
Beitragsersteller
 06.09.2024, 09:22

ja.habe ich verstehe aber nichtt genau was das Heist und was ich ändern muss

1 Antwort

Die Probleme im Code hängen mit dem falschen Umgang mit dem Textfeld zusammen. Der Zugriff auf das Textfeld muss mit

send_keys()

erfolgen, um Text einzufügen. Die Methode

.text

wird verwendet, um Text aus einem Element zu lesen, nicht um Text einzugeben. Auch das Leeren des Textfelds sollte korrekt gemacht werden, indem du

textfield.clear()

direkt nach dem Finden des Elements aufrufst. Außerdem müssen die CSS-Selektoren für das Textfeld, den Button und das Ergebnisfeld korrekt angegeben werden, damit der Browser weiß, auf welche Elemente er zugreifen soll. Stelle sicher, dass der Resultat-Selektor tatsächlich den Bereich anspricht, in dem das Ergebnis angezeigt wird, um den richtigen Text abzufragen.

from lib2to3.pgen2 import driver
import random
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By


def get_random_words_from_file(file_path, num_words=12):
    with open(file_path, 'r', encoding='utf-8') as f:
        words = f.read().splitlines()
    return random.sample(words, num_words)


def automate_browser(word_list, url, textfield_selector, button_selector, result_selector):
    service = Service('/usr/local/bin/chromedriver')
    driver = webdriver.Chrome(service=service)


    try:
        driver.get(url)


        while True:
            textfield = driver.find_element(By.CSS_SELECTOR, textfield_selector)
            textfield.clear()
            textfield.send_keys(' '.join(word_list))


            button = driver.find_element(By.CSS_SELECTOR, button_selector)
            button.click()


            time.sleep(2)


            result = driver.find_element(By.CSS_SELECTOR, result_selector).text
            if "korrekt" in result.lower():
                print("Eingabe war korrekt!")
                break
            else:
                print("Eingabe war falsch, versuche erneut...")


            word_list = get_random_words_from_file("words.txt")
            time.sleep(1)


    finally:
        driver.quit()


if __name__ == "__main__":
    file_path = '/usr/local/bin/words.txt'
    url = 'URL einfügen'
    textfield_selector = '#input1'
    button_selector = '#onboarding-form-submit-button'
    result_selector = '#result-field'


    word_list = get_random_words_from_file(file_path)
    automate_browser(word_list, url, textfield_selector, button_selector, result_selector)



jstn279 
Beitragsersteller
 05.09.2024, 05:32

ist immer noch nicht anders aber es kann glaube ich auch daran liegen das immer wenn ich Chrome mit dem Programm öffne es mich nach meinem Standardbrowser abfragt innerhalb von Chrome weis nicht wie ich das umgehe

MasterFAQ  05.09.2024, 05:35
@jstn279

Das Problem, dass Chrome immer wieder nach dem Standardbrowser fragt, kann daran liegen, dass der Chrome-Browser beim Starten durch das Programm nicht die richtigen Benutzerprofileinstellungen lädt. Es gibt jedoch eine Möglichkeit, dies zu umgehen, indem du Chrome mit einem spezifischen Profil oder in einem „headless“ Modus startest, damit diese Abfrage nicht erscheint.

Du kannst den Chrome-Browser mit spezifischen Startoptionen konfigurieren, um dieses Problem zu beheben. Hier ist eine Möglichkeit, wie du den WebDriver entsprechend anpassen kannst:

  1. Chrome in „headless“ Mode ausführen: Dieser Modus startet den Browser ohne grafische Oberfläche, was bedeutet, dass solche Pop-ups nicht mehr erscheinen sollten.
  2. Nutzung eines Benutzerprofils: Du kannst ein spezielles Benutzerprofil für Chrome erstellen, das der WebDriver beim Start lädt. Dadurch wird Chrome nicht jedes Mal nach dem Standardbrowser fragen.

Überarbeiteter Code der das berücksichtigt:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import random
import time


def get_random_words_from_file(file_path, num_words=12):
    with open(file_path, 'r', encoding='utf-8') as f:
        words = f.read().splitlines()
    return random.sample(words, num_words)


def automate_browser(word_list, url, textfield_selector, button_selector, result_selector):
    chrome_options = Options()
    chrome_options.add_argument("--headless")  # Headless mode, entfernt die grafische Oberfläche
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")
    
    service = Service('/usr/local/bin/chromedriver')  # Pfad zum chromedriver anpassen
    driver = webdriver.Chrome(service=service, options=chrome_options)


    try:
        driver.get(url)


        while True:
            textfield = driver.find_element(By.CSS_SELECTOR, textfield_selector)
            textfield.clear()
            textfield.send_keys(' '.join(word_list))


            button = driver.find_element(By.CSS_SELECTOR, button_selector)
            button.click()


            time.sleep(2)


            result = driver.find_element(By.CSS_SELECTOR, result_selector).text
            if "korrekt" in result.lower():
                print("Eingabe war korrekt!")
                break
            else:
                print("Eingabe war falsch, versuche erneut...")


            word_list = get_random_words_from_file("words.txt")
            time.sleep(1)


    finally:
        driver.quit()


if __name__ == "__main__":
    file_path = '/usr/local/bin/words.txt'
    url = 'URL einfügen'
    textfield_selector = '#input1'
    button_selector = '#onboarding-form-submit-button'
    result_selector = '#result-field'


    word_list = get_random_words_from_file(file_path)
    automate_browser(word_list, url, textfield_selector, button_selector, result_selector)


Falls du den Browser nicht im Headless-Modus starten möchtest, kannst du auch das Chrome-Profil laden, um diese Abfragen zu vermeiden:

chrome_options.add_argument("user-data-dir=path_to_your_profile")

Dabei ersetzt du

path_to_your_profile

durch den Pfad zu deinem Chrome-Benutzerprofil. Damit sollte der WebDriver dein vorhandenes Profil nutzen und diese Pop-ups nicht mehr anzeigen.

Falls der Browser weiterhin das Problem mit der Standardbrowser-Abfrage zeigt, wäre der „headless“-Modus wahrscheinlich die einfachste Lösung.

jstn279 
Beitragsersteller
 05.09.2024, 05:38
@jstn279

@MasterFAQ du scheinst dich echt sehr gut auszukennen verstehe nicht ganz wie du das mit sendKeys und .text meinst könntest mir das vielleicht in dem Code zeigen.

jstn279 
Beitragsersteller
 05.09.2024, 05:39
@MasterFAQ

dankeschön für die Hilfe schonmal ;)

MasterFAQ  05.09.2024, 05:41
@jstn279

Klar, ich zeige dir das direkt anhand deines Codes und erkläre den Unterschied zwischen

send_keys()

und

.text

  • send_keys()
  • wird verwendet, um Text in ein Eingabefeld (z. B. ein Textfeld oder eine Suchleiste) einzufügen.
  • .text
  • wird verwendet, um den vorhandenen Text eines Elements auszulesen, zum Beispiel um das Ergebnis einer Berechnung oder die Anzeige eines Labels zu erfassen.

Schauen wir uns das an:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import random
import time


def get_random_words_from_file(file_path, num_words=12):
    with open(file_path, 'r', encoding='utf-8') as f:
        words = f.read().splitlines()
    return random.sample(words, num_words)


def automate_browser(word_list, url, textfield_selector, button_selector, result_selector):
    service = Service('/usr/local/bin/chromedriver')
    driver = webdriver.Chrome(service=service)


    try:
        driver.get(url)


        while True:
            # Textfeld finden und leeren
            textfield = driver.find_element(By.CSS_SELECTOR, textfield_selector)
            textfield.clear()
            
            # Zufällig ausgewählte Wörter in das Textfeld einfügen
            textfield.send_keys(' '.join(word_list))  # Hier wird 'send_keys()' verwendet


            # Button klicken
            button = driver.find_element(By.CSS_SELECTOR, button_selector)
            button.click()


            time.sleep(2)  # Kurze Pause, um das Ergebnis laden zu lassen


            # Ergebnis überprüfen (auslesen des Textes im Ergebnisfeld)
            result = driver.find_element(By.CSS_SELECTOR, result_selector).text  # .text gibt den Text des Elements zurück
            
            if "korrekt" in result.lower():
                print("Eingabe war korrekt!")
                break
            else:
                print("Eingabe war falsch, versuche erneut...")


            # Neue Wörter auswählen
            word_list = get_random_words_from_file("words.txt")
            time.sleep(1)


    finally:
        driver.quit()


if __name__ == "__main__":
    file_path = '/usr/local/bin/words.txt'
    url = 'URL einfügen'
    textfield_selector = '#input1'
    button_selector = '#onboarding-form-submit-button'
    result_selector = '#result-field'


    word_list = get_random_words_from_file(file_path)
    automate_browser(word_list, url, textfield_selector, button_selector, result_selector)

Erklärung:

  • send_keys(' '.join(word_list))
  • : Hier wird der Text, der in das Textfeld eingegeben werden soll, über
  • send_keys()
  • eingefügt. Du sendest den Text in das Element, um simulierte Tastatureingaben zu machen.
  • result = driver.find_element(By.CSS_SELECTOR, result_selector).text
  • : Hier wird der Text des Ergebniselements mit
  • .text
  • gelesen, um zu prüfen, ob das Wort "korrekt" im Ergebnis steht.

Das

send_keys()

wird genutzt, um Daten in das Textfeld zu schreiben, während

.text

verwendet wird, um vorhandenen Text aus einem Element zu extrahieren.

jstn279 
Beitragsersteller
 05.09.2024, 05:49
@MasterFAQ

hast du den code so mal ausprobiert ob es bei dir funktioniert hat und verstehe ich das richtig er schaut danach ob das Wort Korrekt dort steht also muss ich schauen wie der Button beschriftet ist um dem Programm sagen zu können wann es fertig ist

jo135  05.09.2024, 07:53
@jstn279

Mittlerweile sollte dir aufgefallen sein, dass du hier mit ChatGPT oder einem ähnlichen LLM sprichst.

MasterFAQ  05.09.2024, 08:05
@jo135

Tatsächlich use ich KI zum programmieren weil es ein effektives Tool ist , aber hab gemerkt das das hier nicht gern gesehen wird. Selbst wenn KI used musst du selbständig debuggen , und für solche Sachen brauch ich mir nicht die Mühe machen und meine Zeit zu wasten wenn ich das auch in 5 Sekunden Copy & pasten kann. Ich habe die Frage korrekt beantwortet wenn er nichtmal den Code selbst testet oder den Unterschied erkennt sollte er das Programmieren lassen. Ich erziele mit KI Ergebnisse aber dafür brauch man trotzdem Kenntnisse und muss auch debuggen können. KI hin oder her es wird die Zukunft sein und in 10 Jahren spät überall standard sein , gutefrage ist so abgeneigt gegen KI ob das ein Unterschied macht Informationen über KI anzufordern oder zu googeln absofort troll ich hier nur noch rein und mach rechtschreibfela ohne ende damit noch weniger leuten geholfen wird , siehe meine Auszeichnung soviel unbeantwortet Fragen ne lieber unbeantwortet lassen für 1 jahr anstatt wenigst zu versuchen 1 antwort zu geben die sogar effektiv helfen kann , naja ich weis mir zu helfen und kann meine Probleme lösen wenn ich meine Methoden nicht teilen darf um anderen zu helfen ist die Seite in meinen Augen ne Sekte die nicht offen für Technik ist.

jstn279 
Beitragsersteller
 06.09.2024, 05:45
@MasterFAQ

oha was ein Text ja bin auch noch ganz am Anfang wollte nur dieses eine Programm schreiben weil ich des für was brauch und hab natürlich alles selbst getestet sonst wäre mir ja nicht aufgefallen das es sich immer direkt wieder schließt. Dachte halt jemand kann Helfen wenn man noch ein Noob ist.