Selenium in unittest: "Warte bis seite neu geladen ist..."

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Anscheinend ist es nicht so einfach mit Selenium zu erkennen, ob eine Seite neu geladen ist oder nicht.

Was es gibt steht bei http://selenium-python.readthedocs.org/waits.html

Man kann mit dem "Explicit Waits" prüfen ob ein Element da oder weg ist usw...

In meinem Fall wird eine django form abgeschickt und kommt dann mit einem Fehler wieder. Von daher sind die vorhandenen Elemente im Grunde gleich...

Ich mache nun folgendes (pseudocode):

Code: Alles auswählen

PAGE_LOAD_TRACKING_ID="SeleniumPageLoadID"

driver = webdriver.Firefox()

driver.get('%s%s' % (self.live_server_url, '/'))

# Eigenes Element zur späteren Prüfung einfügen
driver.create_web_element(PAGE_LOAD_TRACKING_ID)

# Formular abschicken
driver.find_element_by_xpath('//input[@value="Log in"]').click()

# Warten bis eigenes Element weg ist
WebDriverWait(driver, 10).until(
    expected_conditions.invisibility_of_element_located(
        (By.ID, PAGE_LOAD_TRACKING_ID)
    )
)

Also die Idee ist simpel: Ich füge ein eigenes Element in die Seite ein und prüfe dann darauf...

Gibt es noch eine einfacherer Lösung?!?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das scheint noch einfacher zu sein:

Code: Alles auswählen

        body = self.driver.find_element_by_css_selector('body')
        check = WebDriverWait(self.driver, 10).until(
            expected_conditions.staleness_of(body)
        )
Allerdings Frage ich mich, ob das wirklich zuverlässig ist. Denn könnte es nicht sein, das die Prüfung Erst stattfindet nachdem die Seite schon weggeschickt ist?!?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Benutzt hier eigentlich jemand Selenium ?!?

Ich finde es recht schwierig damit Tests zu schreiben... Bzw. man findet schlecht den Grund, wenn ein Test fehlschlägt.

Hab nun angefangen sowas zu Hacken:

Code: Alles auswählen

class SeleniumVerboseAssert(object):
    def _verbose_assertion_error(self, page_source, err):
        print("\n", flush=True, file=sys.stderr)
        print("*" * 79, file=sys.stderr)
        traceback.print_exc()
        print(" -" * 40, file=sys.stderr)
        page_source = "\n".join([line for line in page_source.splitlines() if line.rstrip()])
        print(page_source, file=sys.stderr)
        print("*" * 79, file=sys.stderr)
        print("\n", flush=True, file=sys.stderr)
        raise

    def assertEqualTitle(self, should):
        try:
            self.assertEqual(self.driver.title, should)
        except AssertionError as err:
            self._verbose_assertion_error(self.driver.page_source, err)

    def assertInPageSource(self, member):
        try:
            self.assertIn(member, self.driver.page_source)
        except AssertionError as err:
            self._verbose_assertion_error(self.driver.page_source, err)

    def assertNotInPageSource(self, member):
        try:
            self.assertNotIn(member, self.driver.page_source)
        except AssertionError as err:
            self._verbose_assertion_error(self.driver.page_source, err)
Im Fehlerfall sieht man wenigstens die Aktuelle HTML Seite. Was oft schon mal weiter hilft.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten