onclick-event auf webseite mittels python triggern?

4 Antworten

Du vermischst hier leider etwas die Abstraktionsschichten.

Du brauchst irgendwas (eine Laufzeitumgebung) was das JavaScript auch ausführt. Typischerweise macht das ja der Browser. Ein nackter HTTP-Request (egal ob aus Python oder einer anderen Sprache heraus) hingegen "kennt" das Konzept JavaScript nicht, da das quasi nur Text ist was du da zurück bekommst, und der Request selbst auf einer tieferen Abstraktionsschicht stattfindet.

Automatisiert könntest du das allerdings über z.B. Selenium und einen WebDriver für deinen jeweiligen Browser machen.

Hi chandler222,

Webseiten arbeiten normalerweise mit HTML, CSS und JavaScript. Python läuft nicht auf clientseite. Daher musst du deine Eventhandler oder auch Event Listener via JavaScript erstellen. Du kannst aber serverseitig weiterhin Python verwenden um z.B. die gesendeten Quiz-Daten zu verarbeiten und dann ein Request zu deiner Seite senden.

Ich würde dir auch empfehlen kein jQuery dafür zu verwenden und bevorzugt fetch anzuwenden in diesem Beispiel. Fetch-Methode bietet dir mehr Flexibilität zum Standard-XML-HTTP-Request via XML-HTTP-Request-Objekt.

jQuery.getJSON( url + "&callback=?", {
    quizSelection: idx
}, function( retVal ) {
    ...
});

Daher sollte man das ganze so ähnlich bauen wie hier:

function handleRestart(neu, idx) {
    if (!idx) idx = 1;

    if (neu > 0) {
        const params = new URLSearchParams({
            quizSelection: idx
        });

        // Beispiel: Falls "url" schon ? enthält, anhängen mit &, sonst mit ?
        const fetchUrl = url.includes('?') ? `${url}&${params.toString()}` : `${url}?${params.toString()}`;

        fetch(fetchUrl)
            .then(response => response.json())
            .then(retVal => {
                quiz = retVal;
                if (quiz.error && quiz.error === "forbidden") {
                    handleServerError();
                    return;
                }
                quiz.fragenPointer = 0;
                anzFalsch = 0;
                const frageHtml = renderQuestion(quiz.fragen[quiz.fragenIds[quiz.fragenPointer]]);
                document.querySelector("#frageContainer").innerHTML = frageHtml;
                renderStats();
            })
            .catch(error => {
                console.error("Fehler beim Laden des Quiz:", error);
            });

    } else {
        quiz.fragenPointer = 0;
        anzFalsch = 0;
        for (let i = 0; i < quiz.fragenIds.length; i++) {
            quiz.fragen[quiz.fragenIds[i]].answer = -1;
        }
        const frageHtml = renderQuestion(quiz.fragen[quiz.fragenIds[quiz.fragenPointer]]);
        document.querySelector("#frageContainer").innerHTML = frageHtml;
        renderStats();
    }
}

Man könnte das ganze noch weiter entwickeln und die DOM-Manipulation verbessern und das ganze erst in ein DOMFragment-Objekt packen und dann in den DOM packen. Man könnte auch anstatt JSON auch mit dem FormData-Objekt arbeiten und noch sauberer die Daten versenden usw. Also da gibt es noch viele weitere Verbesserungen. Zudem könnte man anstatt den Event Handler einen Event Listener verwenden, was den Code noch verbessert und die Trennung von Code und HTML struktur strigenter aufbauen lässt.

Hier wäre ein Beispiel dazu:

<td data-restart="1,3" class="rstElem">xxxxxxxx</td>

Hier der JavaScript-Teil:

document.querySelectorAll(".rstElem").forEach((currentElem)=>{
    currentElem.addEventListener("click", (event)=>{
        let thisObj = event.currentTarget;
        let [neu, idx] = thisObj.dataset.restart.split(',').map(str => str.trim());
        handleRestart(neu, idx);
    });
});

Viel Erfolg bei der Umsetzung deines Quizes.

Woher ich das weiß:Berufserfahrung – Ich bin gelernter Mediengestalter Digital und Print(IHK)

Moin, wenn du das in Python umsetzen willst kannst du dir dazu Selenium ansehen:
https://www.selenium.dev/

Dort kannst du die Seite aufrufen lassen und darauffolgend dann Elemente anklicken lassen. Dazu sollte es auch genügend Tutorials geben.

Du kannst natürlich auch mit der requests bibliothek die Fragen nach und nach von der Schnittstelle abrufen, wie es schon in deinem Codebeispiel passiert. Da würdest du dir die Interaktion mit der Seite sparen.

Moin,

als Warnung, ich kann kein Pyton. Aber ich kenne dein Problem. In jQuery gibt es die möglichkeit etwas zu triggern: https://api.jquery.com/trigger/

Das kannst du gleich nachdem die Seite fertig geladen wurde triggern.

Entweder ist das eine Lösung oder ich hab dein Problem nicht verstanden weil ich kein Pyton kann :D. Viel Glück.


guterfrager5  24.03.2025, 12:21

ich denke das Problem hat er als letztes geschrieben (vielleicht nicht die beste Struktur für eine Frage 😅) also das hier:

Im Quelltext wird durch ein Funktionsaufruf eine .json geholt. Diese würde ich mir gerne ansehen und evtl. Daten rausholen. Ziel ist es alle Fragen des Quiz zu bekommen, ohne händisch durchzugehen und diese aufzuschreiben.

Also er will eine JSON-Datei laden, in Python parsen und die Werte davon auslesen.

Das parsen und Werte auslesen scheint ja ziemlich einfach zu gehen (laut Stackoverflow):

import json
data = json.loads('...')
# irgendwas machen mit data['...']

Wie er die Datei laden kann, hat er verrückterweise schon selbst geschrieben (oder von Stackoverflow 🤓)

import requests
req = requests.get('url') # oder .post
# irgendwas machen mit req.text

also fehlt nur noch die URL, die er laden will (und die können wir nicht sehen, weil er die Webseite nicht verraten hat) 😉

Ich bin zwar auch nicht wirklich bewandert in Python (also habe es nur ein oder zweimal in der Schule benutzt) aber würde mal vermuten, dass das Skript dann in etwa so aussehen wird:

import json
import requests

def Quiz(idx):
  params = {'callbacks':'?'}
  data = {'quizSelection': idx}
  # hier fehlt der dubiose Wert von url aus dem Skript
  req = requests.post('url', params=params, json=data)

  return json.loads(req.text)

# für 10 Quiz-Dinger anzuzeigen
for x in range (10):
  print Quiz(x)

Aber wie gesagt ich kenne mich auch nicht wirklich mit Python aus und für jQuery habe ich auch nur kurz die Doku für diese eine Funktion durchgelesen also das habe ich noch nichtmal in der Schule benutzt 😅

chandler222 
Beitragsersteller
 24.03.2025, 13:42
@guterfrager5

Die URL möchte ich nicht verraten.
Aber mein Problem wurde falsch verstanden.

Mit der URL komme ich auf eine Seite, wo eine Tabelle mit mehreren Zeilen ist.

Klicke ich auf eine Zeile, komme ich zum dementsprechenden Quiz. Die Funktion die ich erwähnt habe, ist auf der Seite selber. Die wird aufgerufen, wenn ich auf die entsprechende Zeile klicke.

Meine frage war, ob es jetzt irgendwie möglich ist, diese Funktion von python direkt aufzurufen um an das json objekt zu kommen.

guterfrager5  24.03.2025, 14:07
@chandler222
Meine frage war, ob es jetzt irgendwie möglich ist, diese Funktion von python direkt aufzurufen

Die kurze Antwort wäre Nein (aber die hast du sicher schon gelesen) die längere Antwort wäre mit Selenium, Phantom.js oder so etwas in dieser Richtung (was aber sehr wahrscheinlich overkill wäre).

um an das json objekt zu kommen.

Ist es deine Webseite oder willst du einen Scraper für eine andere bauen?

Wenn es deine ist, könntest du einfach eine Schnittstelle in Python bauen, mit der du die REST-Api ansprechen kannst (so wie ich es mit den nicht ausreichenden Infos versucht habe).

Wenn es nicht deine ist, müsstest du (wie ich in der Nachfrage geschrieben habe) einmal gucken, welchen Wert die Variable url an der Stelle hat (also herausfinden, wie die fremde REST-Api funktioniert), dass du den Wert dann in der Python Schnittstelle benutzen kannst.

Ich habe irgendwie die Befürchtung, dass es sich hier um ein XY-Problem handelt.