2017-07-09 1 views
0

Ich möchte die Website mit Selen anmelden. Diese Seite hat einen Link (Mitglieder Login) und wenn ich auf diesen Link klicke, erscheint ein Popup-Fenster.In Selen, wie man sich im Popup-Fenster mit Python in die Website einloggt?

Die Website-URL ist http://affiliates.888.com/

ich den Code schrieb wie folgt.

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

eight88 = webdriver.Chrome() 
eight88.get("http://affiliates.888.com/") 
assert "Earn Real Money" in eight88.title 
loginForm = eight88.find_element_by_class_name("hide-under-480").click() 
# so far popup appears. 
eight88.switch_to_alert() 
eight88.find_element_by_id("userName").send_keys("username") 
eight88.find_element_by_id("password").send_keys("password") 

Wenn ich dieses Skript ausführen, tritt NoSuchElementException auf.

raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"userName"} 
    (Session info: chrome=59.0.3071.115) 
    (Driver info: chromedriver=2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57),platform=Linux 4.4.0-83-generic x86_64) 

Ich weiß nicht, wie Sie auf das Popup gehen und dort Element finden.

Wie kann ich diese Website auf Popup einloggen.

+1

Sie könnten ein paar Dutzend einer Sekunde für das Popup warten müssen erscheinen und/oder prüfen Sie, ob es tauchte und dann weiter mit dem Füllen Dinge mit Ihrem Benutzernamen/Passwort aus. – Anthon

+0

Danke für Ihre Antwort. Ich habe Code wie acht88.implicitly_wait (10) hinzugefügt, aber dieselbe Ausnahme ist aufgetreten. Wie kann ich damit umgehen? –

+0

Dafür können Sie ExplicitWait verwenden, aber wenn das JavaScript so gestaltet ist, dass es die neuen Felder nicht in die ursprüngliche Seitenquelle aufnimmt, würde das nicht funktionieren. –

Antwort

3

Autorisierungsformular befindet sich in einem iframe, keine Warnung. Um in der Lage sein, um Elemente innerhalb iframe behandeln sollten Sie schalten zuerst:

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.ui import WebDriverWait as wait 

eight88 = webdriver.Chrome() 
eight88.get("http://affiliates.888.com/") 
assert "Earn Real Money" in eight88.title 
loginForm = eight88.find_element_by_class_name("hide-under-480") 
loginForm.click() 

wait(eight88, 10).until(EC.frame_to_be_available_and_switch_to_it(eight.find_element_by_xpath('//iframe[contains(@src, "Auth/Login")]'))) 

eight88.find_element_by_id("userName").send_keys("username") 
eight88.find_element_by_id("password").send_keys("password") 
+0

Danke für Ihre Hilfe. es läuft gut. –

0

Das Popup wird von einem JavaScript generiert. Das ist also eine dynamische Seite. Wenn Sie driver.get() verwenden, lesen Sie die erste statische Seitenquelle, die generiert wird, und natürlich sind die Felder Benutzername und Passwort nicht enthalten. Ermitteln Sie zuerst, wie das JavaScript das Popup aufruft und verwenden Sie dann die exec-Funktion von selen, um das JavaScript auszuführen, und eine weitere, um sich über das Ergebnis des ersten zu authentifizieren.

+0

Danke für Ihre Hilfe. Würden Sie das im Detail mit einem Code-Schnipsel erklären? –

+0

Leider musst du JavaScript kennen, um es zurückzuentwickeln und deshalb habe ich Angst, dass ich nicht helfen könnte. Markieren Sie JavaScript in der Frage und veröffentlichen Sie die js, die für dieses Pop-up verantwortlich ist, und noch wichtiger, die js, die die Authentifizierung durchführt. Wenn es einfach eine POST-Anfrage zurückgibt, ist dies einfach. –

Verwandte Themen