Seite 1 von 1

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

Verfasst: Mittwoch 6. Mai 2015, 13:11
von jens
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?!?

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

Verfasst: Mittwoch 6. Mai 2015, 13:26
von jens
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?!?

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

Verfasst: Donnerstag 7. Mai 2015, 21:25
von jens
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.