Wir haben eine Chrome-Erweiterung entwickelt und ich möchte unsere Erweiterung mit Selenium testen. Ich habe einen Test erstellt, aber das Problem ist, dass unsere Erweiterung bei der Installation eine neue Registerkarte öffnet, und ich glaube, ich bekomme eine Ausnahme von der anderen Registerkarte. Ist es möglich, zu der aktiven Registerkarte zu wechseln, die ich teste? Oder Sie starten mit deaktivierter Erweiterung, melden sich dann auf unserer Website an und aktivieren erst dann die Erweiterung. Ist es möglich? Hier ist mein Code:
Der Test schlägt mit fehl ElementNotVisibleException: Message: element not visible, weil im neuen Tab (geöffnet durch die Erweiterung) “Anmelden” nicht sichtbar ist (ich denke, der neue Tab wird erst nach dem Befehl geöffnet self.driver.get(url="http://example.com/logout")).
Aktualisieren: Ich habe herausgefunden, dass die Ausnahme nicht mit der zusätzlichen Registerkarte zusammenhängt, sondern von unserer Website. Aber ich habe die zusätzliche Registerkarte mit diesem Code geschlossen, gemäß der Antwort von @aberna:
def close_last_tab(self):
if (len(self.driver.window_handles) == 2):
self.driver.switch_to.window(window_name=self.driver.window_handles[-1])
self.driver.close()
self.driver.switch_to.window(window_name=self.driver.window_handles[0])
Nachdem ich den zusätzlichen Tab geschlossen habe, kann ich meinen Tab im Video sehen.
Gieriger_Geier
Das hat bei mir tatsächlich in 3.x funktioniert:
driver.switch_to.window(driver.window_handles[1])
Fenstergriffe werden angehängt, sodass dies die zweite Registerkarte in der Liste auswählt
um mit dem ersten Tab fortzufahren:
driver.switch_to.window(driver.window_handles[0])
Es sieht hackisch aus, funktioniert aber gut, wenn Sie wissen, dass Ihre getestete Website einen Link in einem neuen Tab und sonst nichts öffnen soll. Super für Quick&Dirty.
– Benutzer3905644
3. November 17 um 4:54 Uhr
@sdkks Es tut mir leid, dass ich nicht verstehe, was du meinst. Entschuldigung, wenn mein Kommentar dumm oder beleidigend ist, das sollte nicht sein. Ich habe diesen Code verwendet und es funktioniert gut. Können Sie erklären, warum es hackish aussieht? Beim Wort Sie Ich meinte nicht “Sie, Benutzer sdkks”, sondern einen anderen Grund als “getestete Site soll einen Link in einem neuen Tab öffnen”, zum Beispiel, wenn der Entwickler den Webdriver explizit auffordert, einen neuen Tab zu öffnen.
– Gabriel Devillers
30. Januar 19 um 9:44 Uhr
Kann dich nicht mehr schätzen. Du bist der MANN. Vielen Dank!
– Frankie
23. Juni 2020 um 16:18 Uhr
aberna
Einige mögliche Ansätze:
1 – Wechseln Sie zwischen den Tabs mit den send_keys (CONTROL + TAB)
@Uri Verhalten per Video nicht so einfach zu analysieren. Ich habe die Antwort mit einem anderen möglichen Ansatz aktualisiert
– aberna
25. Februar 15 um 11:03 Uhr
@Uri Was war der Ansatz, der Ihr Problem gelöst hat?
– aberna
25. Februar 15 um 12:50 Uhr
Ich denke, dieser Ansatz wird nicht funktionieren, wenn die zweite Registerkarte eine Texteingabe hat und Selen dort Text eingibt – zumindest in meinem Fall.
– Islam
22. Dezember 16 um 16:09 Uhr
Ich hatte Probleme mit dem neuen Tab, dieser Ansatz hat den Tag gerettet driver.switch_to_window(driver.window_handles[1])
– Benutzer3905644
3. November 17 um 4:52 Uhr
Pedro Lobito
Die akzeptierte Antwort hat bei mir nicht funktioniert.
Um einen neuen Tab zu öffnen und Selen dorthin zu wechseln, habe ich Folgendes verwendet:
driver.execute_script('''window.open("https://some.site/", "_blank");''')
sleep(1) # you can also try without it, just playing safe
driver.switch_to.window(driver.window_handles[-1]) # last opened tab handle
# driver.switch_to_window(driver.window_handles[-1]) # for older versions
Wenn Sie zurück zur Hauptregisterkarte wechseln müssen, verwenden Sie:
driver.switch_to.window(driver.window_handles[0])
Zusammenfassung:
Der window_handles enthält eine Liste der handles von geöffnet tabs, verwenden Sie es als Argument in switch_to.window() um zwischen Registerkarten zu wechseln.
Beachten Sie, dass switch_to_window() ist veraltet und wird ersetzt durch switch_to.window()
– winklerrr
19. September 18 um 11:45 Uhr
Möglicherweise nützliche Ergänzung – verwenden Sie, um kontinuierlich durch alle geöffneten Registerkarten zu blättern import itertools, time; for tab in itertools.cycle(reversed(driver.window_handles)): driver.switch_to.window(tab); time.sleep(2)
– Dirk
11. März 20 um 12:14 Uhr
@winklerrr Antwort mit dem neueren aktualisiert switch_to.window(), tk!
– Pedro Lobito
24. März 20 um 2:00 Uhr
Talmtikisan
Drücken Strg+T oder wählen window_handles[0] geht davon aus, dass Sie beim Start nur einen Tab geöffnet haben.
Wenn Sie mehrere Registerkarten geöffnet haben, kann es unzuverlässig werden.
Das ist was ich mache:
old_tabs=self.driver.window_handles
#Perform action that opens new window here
new_tabs=self.driver.window_handles
for tab in new_tabs:
if tab in old tabs:
pass
else:
new_tab=tab
driver.switch_to.window(new_tab)
Dies ist etwas, das die neue Registerkarte positiv identifizieren würde, bevor zu ihr gewechselt wird, und das aktive Fenster auf die gewünschte neue Registerkarte setzt.
Sagen Sie dem Browser einfach, dass er senden soll Strg+Tab funktioniert nicht, weil es dem Webdriver nicht mitteilt, tatsächlich auf die neue Registerkarte zu wechseln.
Wenn Sie nur die aktive Registerkarte schließen möchten und das Browserfenster geöffnet lassen müssen, können Sie die switch_to.window-Methode verwenden, die den Eingabeparameter als Fenster-Handle-ID hat. Das folgende Beispiel zeigt, wie diese Automatisierung erreicht wird: