Angenommen, Sie haben eine Web-App, deren Client etwas anderes als ein Webbrowser sein soll, z. B. eine mobile App.
Angenommen, es gibt keine Anmeldeseite, wie Sie sie in einem typischen Webdienst sehen würden. Dies liegt daran, dass die Client-App ein Anmeldeformular enthält.
Wenn ich jedoch automatische Tests durchführe, möchte ich über den Browser von Selenium darauf zugreifen und sehen, wie es funktioniert. Zu jener Zeit.
python
import requests
from selenium import webdriver
cookie_name = 'session_id'
#Melden Sie sich mit Anfragen an und erstellen Sie ein Sitzungscookie
s = requests.session()
login_data = {
'email': '[email protected]',
'password': 'xxxxxxxxxx',
}
res = s.post('https://example.com/login/', data=login_data)
res.raise_for_status()
#Sitzungscookie-Wert
cookie_value = s.cookies.get(cookie_name)
#Starten Sie Firefox
driver = webdriver.Firefox()
#Öffnen Sie im Voraus eine entsprechende Seite für die Zieldomäne.
#Wenn Sie dies nicht tun, fügen Sie hinzu_Ich erhalte eine Fehlermeldung mit einem Cookie
driver.get('https://example.com/')
#Übergeben Sie das durch Anfragen erhaltene Sitzungscookie an Firefox
driver.add_cookie({
'name': cookie_name,
'value': cookie_value,
'domain': 'example.com'})
#Zeigen Sie die Seite nach der Anmeldung an
driver.get('https://example.com/mypage/')
Sie können die Seite jetzt sehen, nachdem Sie sich in Firefox angemeldet haben.
Die Methode add_cookie funktioniert auch in webdriver.Chrome, sodass Sie sich auf die gleiche Weise anmelden können. Möglicherweise funktionieren auch andere Webtreiber.
Als ich lokal HTML eines geeigneten Formulars erstellt und dessen Aktion = als Anmelde-URL festgelegt habe, wurde es aus irgendeinem Grund von GET angefordert, auch wenn method = "POST". Es scheint, dass neuere Browser nicht mehr per POST domänenübergreifend senden können, wahrscheinlich aus Sicherheitsgründen.
Möglicherweise können Sie sich anmelden, indem Sie die entsprechende Seite der Domäne öffnen, bei der Sie sich in Selenium anmelden, ein Anmeldeformular in JS erstellen und von dort aus einen POST senden. Aber ich habe es nicht getan, weil es schwierig zu sein scheint.
Recommended Posts