2016-08-23 1 views
1

Die Homepage der Webanwendung, die ich teste, hat einen Ladebildschirm, wenn Sie sie zum ersten Mal laden, dann erscheint ein Benutzername/Passwort-Feld. Es ist ein dynamisch generiertes UI-Element und der Cursor befindet sich standardmäßig im Feld Benutzername.Webseite in einer dynamischen Seite, Treiberinteraktionen mit Selenium (Python) nicht möglich

Ich sah mich um und jemand schlug vor, Aktionsketten zu verwenden. Wenn ich Aktionsketten verwende, kann ich sofort Text in die Felder Benutzername und Passwort eingeben und dann die Eingabetaste drücken und die nächste Seite wird geladen. Leider sind Aktionsketten aufgrund meiner speziellen Aufstellung keine langfristige Lösung für mich.

Wenn ich die webdriver find_element_by_id benutze ich bin in der Lage, es zu lokalisieren und ich bin nicht in der Lage zu send_keys auf das Element obwohl, weil es irgendwie nicht sichtbar ist. Ich erhalte

selenium.common.exceptions.ElementNotVisibleException: Nachricht: Element nicht sichtbar.

Ich bin auch nicht in der Lage, auf das Feld zu klicken oder anderweitig damit zu interagieren, ohne diesen Fehler zu bekommen.

Ich habe auch versucht, die Elemente mit anderen Mitteln, wie "XPaths" und CSS zu identifizieren und zu interagieren, ohne Erfolg. Sie sind immer not visible.

Seltsamerweise funktioniert es mit dynamischen Seitentiteln. Wenn die Seite zuerst geladen wird, ist es Loading... und wenn es fertig ist, ist es Login. Der Treiber gibt den aktuellen Titel zurück, wenn driver.title aufgerufen wird.

Hat jemand einen Vorschlag?

+0

Ok bestätige mich, dass die Ladeanzeige auf der Anmeldeseite erscheint, wenn du ein Element findest ??? –

+0

Ja, es ist da. Ich lege eine time.sleep (20), bevor ich versuche, mit ihr zu interagieren, was ausreichend Zeit für das Erscheinen der Login-Box ist. – JRodge01

+0

tatsächlich presence_of_element_located des Elements nur Element vorhanden auf dem DOM Überprüfung oder nicht, während visibility_of_element_located beide vorhanden und sichtbar Überprüfung bedeutet presence_of_element_located auch in der Lage verstecktes Element sowie sichtbares Element zu finden, während der Sichtbarkeit deshalb presence_of_element_located funktioniert nur sichtbar wird. –

Antwort

1

Eigentlich, wenn es geladen Fortschrittsbalken erscheint in Sie Seite anmelden, sollten Sie versuchen, WebDriverWait mit warten, bis Element wird immer sichtbar wie folgt: -

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

wait = WebDriverWait(driver, 10) 

element = wait.until(EC.visibility_of_element_located((By.ID, "enter element id here"))) 

# now use send_keys 
element.send_keys("enter value here") 

Edited1: - Wenn Sie immer TimeoutException, würde ich vorschlagen, dass Sie vor der Suche nach Elemente zu warten versuchen, unsichtbar Ladefortschrittsbalken mit WebDriverWait statt hart codiert Schlaf sein dann Wunsch Element finden wartet wie folgt: -

wait = WebDriverWait(driver, 10) 

wait.until(EC.invisibility_of_element_located((By.ID, "enter loading progress bar id or other locators here"))) 

#now after invisible of loading progress bar wait for desire element 
element = wait.until(EC.presence_of_element_located((By.ID, "enter element id here"))) 

# now use send_keys 
element.send_keys("enter value here") 

Edited2: - eigentlich presence_of_element_located von Elemente gerade Elements Überprüfung, die auf dem DOM oder nicht, während visibility_of_element_located beide vorhanden und sichtbar Überprüfung bedeutet presence_of_element_located auch in der Lage verstecktes Element sowie sichtbares Element zu finden, während der Sichtbarkeit deshalb presence_of_element_located funktionieren nur sichtbar wird .

Jetzt Problem während send_keys, da Selen kann nicht INTRACT zu Element sein, bis sie nicht sichtbar ist, warum Sie in Schwierigkeiten sind, können einige versteckte CSS Werke auf Wunsch Element gibt, die es das ist unsichtbar macht, warum Selen nicht in der Lage, mit ihm zu interagieren Aber keine Sorge, Sie können den Wert immer noch mit execute_script einstellen.

Jetzt können Sie versuchen, Wertelement auf Eingang zu setzen, anstatt send_keys der Verwendung nach Elemente zu finden, wie: -

driver.execute_script("arguments[0].value = arguments[1]", element, "enter your value here") 
+0

Ich verwende eine fest codierte Wartezeit, um sicherzustellen, dass das Element auf dem Bildschirm angezeigt wird, und habe dann das getan, was Sie vorgeschlagen haben. Das Element ist deutlich sichtbar auf dem Bildschirm und in der Quelle, aber ich bekomme immer noch eine TimeoutException ausgelöst durch die wait.until() Ich habe versucht, Frames zu wechseln, dachte, es könnte so wackelig sein, aber hat nicht geholfen. Gibt es irgendeine Art von Aktualisierung, die ich für Selen durchführen muss, um die neue Quelle oder etwas zu registrieren? – JRodge01

+0

Ok dann statt hart codiert Warte Verwendung WebDriverWait unsichtbar dann bis zum Verladen bar warten Element finden, versuchen bearbeitet Antwort und lassen Sie mich wissen ... :) –

+0

Ich habe versucht, das zu tun. Es kann den Ladebalken gut finden und bemerkt, wenn es unsichtbar wird, aber immer noch nicht in der Lage ist, den Benutzernamen und das Passwort zu finden. Ich denke darüber nach, nur Aktionsketten für diesen Teil zu verwenden und zu versuchen, andere Teile der Site zu automatisieren, um zu sehen, ob dies ein Problem ist, dem ich überall begegne. – JRodge01

0

Wie saurabh vorgeschlagen, 1 self.wait verwenden.bis (EC.visibility_of_element_located ((By.CSS_SELECTOR, OR.Sub_categories)))

Else einen Schlaf und sehen, jedoch ist es nicht ratsam, zu verwenden, kann die XPath Sie Änderungen zum Zeitpunkt der Seitenlade haben sein

+0

Ich versuchte beide, einschließlich der Verwendung einer expliziten warten, bis ich sicher bin, dass das Element auf dem Bildschirm war und dann versuchen, es mit einer EC.visibility-Funktion zu finden. Es kann die Box immer noch nicht finden. – JRodge01

Verwandte Themen