Expected Contidion error

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
cybrixx252
User
Beiträge: 30
Registriert: Freitag 27. August 2021, 14:06

Hallo

ich habe für meine Arbeit eine Anwendung erstellt, welche Mitarbeiter in einem Webbassierten Programm automatisch über selenium entfernt
Am ende hab ich einen "wait" befehl das er warten soll bis ein feld wieder clickbar ist, jedoch crashed es mir immer wieder zu unterschiedlichen Zeiten.
Ab und zu nach 10 Mitarbeiter dann weider nach 30.

Fehlermeldung ist:

Code: Alles auswählen

Traceback (most recent call last):
  File "ZMD_Clear.py", line 127, in <module>
  File "selenium\webdriver\support\wait.py", line 71, in until
  File "selenium\webdriver\support\expected_conditions.py", line 298, in __call__
  File "selenium\webdriver\remote\webelement.py", line 159, in is_enabled
  File "selenium\webdriver\remote\webelement.py", line 633, in _execute
  File "selenium\webdriver\remote\webdriver.py", line 321, in execute
  File "selenium\webdriver\remote\errorhandler.py", line 242, in check_response
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=93.0.4577.63)

[4416] Failed to execute script 'ZMD_Clear' due to unhandled exception!
und mein Befehl ist

Code: Alles auswählen

while showmitarbeiter == True:
    o = driver.find_element_by_xpath("//*[@id='member-table-row-0']/div/div[1]")
    o.click()
    time.sleep(1)
    mitarbeiter_inZone = driver.find_element_by_xpath("//*[@id='member-table-row-0']/zmd-member-table-edit/form/div[3]/div/select")
    mitarbeiter_inZone.click()
    mitarbeiterdd = Select(mitarbeiter_inZone)
    mitarbeiterdd.select_by_visible_text("")
    save = driver.find_element_by_xpath("//*[@id='member-table-row-0']/zmd-member-table-edit/form/div[4]/button")
    save.click()
   [u] wait = WebDriverWait(driver, 50)
    warten = wait.until(ec.element_to_be_clickable((By.XPATH, "//*[@id='member-table-row-0']/div/div[1]")))[/u]
    mitarbeiter = driver.find_element_by_xpath("//*[@id='member-table-row-0']/div/div[1]")
    showmitarbeiter = mitarbeiter.is_displayed()
else:
    print("Fertig mit löschen!!")
    
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@cybrixx252: Anmerkungen zum Quelltext: Hier gilt auch wieder das im anderen Thema angesprochene vergleichen mit literalen Wahrheitswerten: Das macht man nicht.

Der ``else``-Zweig zu der ``while``-Schleife macht keinen Sinn. Der Code sollte einfach ganz normal nach der Schleife stehen.

Python hat keine spezielle Syntax für eine nachprüfende Schleife. Statt da mit einem Flag wie `showmitarbeiter` zu arbeiten das vor der Schleife initialisiert werden muss, schreibt man eine ”Endlosschleife” die an entsprechender Stelle durch ein bedingtes ``break`` abgebrochen wird.

Man muss nicht jedes Zwischenergebnis an einen Namen binden.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Die X-Paths haben alle einen gemeinsamen Präfix, den man heraus ziehen kann.

Ungetestet:

Code: Alles auswählen

    row_xpath = "//*[@id='member-table-row-0']"
    mitarbeiter_xpath = f"{row_xpath}/div/div[1]"
    form_xpath = f"{row_xpath}/zmd-member-table-edit/form"
    while True:
        mitarbeiter = driver.find_element_by_xpath(mitarbeiter_xpath)
        if not mitarbeiter.is_displayed():
            break
        
        WebDriverWait(driver, 50).until(
            ec.element_to_be_clickable((By.XPATH, mitarbeiter_xpath))
        )
        mitarbeiter.click()
        time.sleep(1)
        mitarbeiter_in_zone = driver.find_element_by_xpath(
            f"{form_xpath}/div[3]/div/select"
        )
        mitarbeiter_in_zone.click()
        Select(mitarbeiter_in_zone).select_by_visible_text("")
        driver.find_element_by_xpath(f"{form_xpath}/div[4]/button").click()

    print("Fertig mit löschen!!")
Bei dem Problem würde ich vermuten Du erwischst nach dem Speichern manchmal noch ein Element das beim/durch das Speichern ersetzt wird, noch bevor es ersetzt wurde. Du müsstest sicherstellen, das der entsprechende Vorgang komplett durch ist.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
cybrixx252
User
Beiträge: 30
Registriert: Freitag 27. August 2021, 14:06

ah ok vielen dank. und sry wegen meinen struktur fehlern ich arbeite erst seit 2 wochen ca mit python und das war mein erstes Programm für die arbeit
Antworten