Python Selenium: Wie speichere ich den Wert eines div's

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Phoenix976
User
Beiträge: 3
Registriert: Freitag 29. Mai 2020, 14:32

Hallo zusammen,
Ich habe eine Frage zu selenium mit Python:
Ich will eigentlich ein Programm schreiben das eine E-mail auf trash-mail.com erstellt und die Nachricht dann in eine Variable speichert.
Mein Programm sieht jetzt folgendermassen aus:

Code: Alles auswählen

from selenium import webdriver
import time
import random
import sys
zaehler = 0
Bots = 20
messagenumber = 1


def FindNewestMail():
    global messagenumber
    global newestMessage
    while True:
        try:
            driver.find_element_by_id("refresh-inbox")
            break

        except:
            driver.refresh()
    while True:
        try:
            driver.find_element_by_class_name("message-from")
            print("A E-mail is existing")
            break
        except:
            driver.find_element_by_id("refresh-inbox").click()
    while True:
        try:
            driver.find_element_by_id(f"message-from-{messagenumber}").click()
            # sys.exit()
            break

        except:
            messagenumber += 1
    while True:
        try:
            message = driver.find_element_by_xpath('//*[@id="utility-body"]/div[4]/div[1]')
            return message
        except Exception as error:
            print("Error Message is: \n" + str(error))
            driver.close()
            sys.exit()



E_Mail = "test"+str(zaehler)
E_Mail = str(E_Mail)
driver = webdriver.Chrome()
driver.get("https://www.trash-mail.com/posteingang/")
InputEmail = driver.find_element_by_id("inputEmail")
InputEmail.send_keys(E_Mail)
time.sleep(random.randrange(6))
driver.find_element_by_id("fetch-mails").click()
time.sleep(5)
print(f"The message of the newest E-mail is: \n\"{str(FindNewestMail())}\"")
Mein Problem ist jedoch das ich nicht weiss wie ich auf die Nachricht zugreifen kann, egal was ich probiere es findet einfach kein Objekt in dem eigentlich die Nachricht drinstehen müsste. Der sourcecode für die Webseite ist auf https://www.trash-mail.com/posteingang/ Nachzulesen (könnt ja einfach irgend ein username eintragen)
Vielen Dank im Voraus für eure Hilfe
Phoenix
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Code: Alles auswählen

# PEP8 Regel:
# Erst Standardbibliotheken
# Eigentl. auch absolute Importe
import time
import random
import sys
# Dann 3. Anbieter Bibl.
from selenium import webdriver



def FindNewestMail():
    # 1. Verwende so wenig wie möglich globale Variablen!
    # Zumal jede Funktion ein Rückgabewert enthalten soltle.
    #
    # 2. Zig versch. while-Schleifen, die du dann jedesmal abbrichst, ist irrsinnig.
    message = ""
    messagenumber = 1
    
    while True:
        try:
            driver.find_element_by_id("refresh-inbox")
        except:
            driver.refresh()
        try:
            driver.find_element_by_class_name("message-from")
            print("A E-mail is existing")
        except:
            driver.find_element_by_id("refresh-inbox").click()
        try:
            driver.find_element_by_id(f"message-from-{messagenumber}").click()
            # sys.exit()
        except:
            messagenumber += 1
        try:
            message = driver.find_element_by_xpath('//*[@id="utility-body"]/div[4]/div[1]')
        except Exception as error:
            print("Error Message is: \n".format(str(error)))
            driver.close()
            sys.exit()
       return messagenumber, message



Bots = 20
zaehler = 0
E_Mail = "test_{}".format(str(zaehler))# Geändert.
E_Mail = str(E_Mail)

driver = webdriver.Chrome()
driver.get("https://www.trash-mail.com/posteingang/")
InputEmail = driver.find_element_by_id("inputEmail")
InputEmail.send_keys(E_Mail)
time.sleep(random.randrange(6))
driver.find_element_by_id("fetch-mails").click()

time.sleep(5)
print("The message of the newest E-Mail is: \n {}".format(FindNewestMail()))# Geändert.
Der Code sollte etwas überarbeitet werden, hier...
Außerdem wird die Variable "Bots" nicht genutzt und bringt so eher Verwirrung.
Zudem solltest du genau sagen, in welcher Zeile es dann nicht mehr wie gewollt funktioniert.

ps. Habe den Code im Browser editiert, ich behalte mir daher kleine Fehler vor. ^^
Phoenix976
User
Beiträge: 3
Registriert: Freitag 29. Mai 2020, 14:32

Erstens:
Das mit den vielen While schlaufen istdafür dass, wenn ein Fehler auftritt das er noch mal probiert wird bis keine Fehler mehr auftreten.

Zweitens:
Was hast du gegen "f" Strings die sind sind super oder haben die einen Nachteil von dem ich nicht weiss?

Drittens:
Die Zeile 36 ist die die den Fehler wirft

Mein Code sieht jetzt so aus

Code: Alles auswählen

import time
import random
import sys
from selenium import webdriver


messagenumber = 1
message = ""

def FindNewestMail():
    global messagenumber
    global newestMessage
    while True:
        try:
            driver.find_element_by_id("refresh-inbox")
            break
        except:
            driver.refresh()

    while True:
        try:
            driver.find_element_by_class_name("message-from")
            print("A E-mail is existing")
            break
        except:
            driver.find_element_by_id("refresh-inbox").click()
    while True:
        try:
            driver.find_element_by_id(f"message-from-{messagenumber}").click()
            break
        except:
            messagenumber += 1
    while True:
        try:
            message = driver.find_element_by_xpath('/html/body/div[5]/div/div[2]/div[4]/div[1]')
            return message
        except Exception as error:
            print("Error Message is: \n" + str(error))
            driver.close()
            sys.exit()



E_Mail = str("test_"+str(Zaehler))
driver = webdriver.Chrome()
driver.get("https://www.trash-mail.com/posteingang/")
InputEmail = driver.find_element_by_id("inputEmail")
InputEmail.send_keys(E_Mail)
time.sleep(random.randrange(6))
driver.find_element_by_id("fetch-mails").click()
time.sleep(5)
print(f"The message of the newest E-mail is: \n\"{str(FindNewestMail())}\"")

Meine Frage ist jetzt wie speichere ich die Nachricht der neusten E-mail?
Falls fragen zu source-code der Website sind https://www.trash-mail.com/posteingang/
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

1. Die while-Schleifen sind deshalb irrsinnig, weil du auch alles in 1 while-Schleife mit 1 try-Block packen kannst. Das ist wesentlich übersichtlicher und auf jeden einzelnen Schritt zu warten, ist meiner Meinung nach sinnlos. Dein Code wird recht schnell durchgelaufen, deshalb macht es kein Sinn auf etwas zu warten. Korrigiert mich, wenn ich falsch liege. 😅 Aber stellt euch Mal vor, ihr schreibt ein großen Code, dann könnt ihr ja nicht jede Zeile in while & try packen.

2. Sorry, kannte f-Strings nicht, da sie erst in Python 3.6 verfügbar sind, ich aber 3.5.3 verwende.

3. Sobald ich zu Hause bin, kann ich dir weiter helfen. ^^
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@Phoenix976: was hast Du gegen f-Strings?

Code: Alles auswählen

E_Mail = f"test_{Zaehler}"
Schreibe Funktionen. Vergiss dass es global gibt, Funktionen liefern ihre Ergebnisse per `return` zurück.
Variablennamen und Funktionen schreibt man komplett klein.
Benutze keine nakten excepts, sondern fange nur die Exception ab, die Du auch erwartest. Eine Exception in ein print mit exit umzuwandeln, macht man nicht, denn Exceptions sind flexibler.
Phoenix976
User
Beiträge: 3
Registriert: Freitag 29. Mai 2020, 14:32

@xXSkyWalkerXx1
Die while-Schleifen sind deshalb irrsinnig, weil du auch alles in 1 while-Schleife mit 1 try-Block packen kannst.
Ich verpacke jede try schlaufe in eine einzene while schlaufe damit jedes mal wenn ein Error auftritt es noch mal probiert wird bis es fehlerlos funktionniert.

Vielen Dank für eure schon gegebene Hilfe und die die noch kommen wird
Antworten