Wie wechsle ich in Selenium zum aktiven Tab?

Lesezeit: 11 Minuten

Wie wechsle ich in Selenium zum aktiven Tab
Uri

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:

def login_to_webapp(self):
    self.driver.get(url="http://example.com/logout")
    self.driver.maximize_window()
    self.assertEqual(first="Web Editor", second=self.driver.title)
    action = webdriver.ActionChains(driver=self.driver)
    action.move_to_element(to_element=self.driver.find_element_by_xpath(xpath="//div[@id='header_floater']/div[@class="header_menu"]/button[@class="btn_header signature_menu"][text()='My signature']"))
    action.perform()
    self.driver.find_element_by_xpath(xpath="//ul[@id='signature_menu_downlist'][@class="menu_downlist"]/li[text()='Log In']").click()
    self.driver.find_element_by_xpath(xpath="//form[@id='atho-form']/div[@class="input"]/input[@name="useremail"]").send_keys("[email]")
    self.driver.find_element_by_xpath(xpath="//form[@id='atho-form']/div[@class="input"]/input[@name="password"]").send_keys("[password]")
    self.driver.find_element_by_xpath(xpath="//form[@id='atho-form']/button[@type="submit"][@class="atho-button signin_button"][text()='Sign in']").click()

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.

Wie wechsle ich in Selenium zum aktiven Tab
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

1643120166 301 Wie wechsle ich in Selenium zum aktiven Tab
aberna

Einige mögliche Ansätze:

1 – Wechseln Sie zwischen den Tabs mit den send_keys (CONTROL + TAB)

self.driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.TAB)

2 – Wechseln Sie zwischen den Registerkarten mit Hilfe von ActionsChains (CONTROL+TAB)

actions = ActionChains(self.driver)      
actions.key_down(Keys.CONTROL).key_down(Keys.TAB).key_up(Keys.TAB).key_up(Keys.CONTROL).perform()

3 – Ein anderer Ansatz könnte die Selenium-Methoden verwenden, um das aktuelle Fenster zu überprüfen und zu einem anderen zu wechseln:

Sie können verwenden

driver.window_handles

um eine Liste von Fenstergriffen zu finden und versuchen Sie anschließend, mit den folgenden Methoden zu wechseln.

- driver.switch_to.active_element      
- driver.switch_to.default_content
- driver.switch_to.window

Um beispielsweise zum zuletzt geöffneten Tab zu wechseln, können Sie Folgendes tun:

driver.switch_to.window(driver.window_handles[-1])

  • Es funktioniert nicht, ich denke, es wechselt den Tab nicht, weil im Video [ app.crossbrowsertesting.com/public/id7ed71371078e09/selenium/… ] Ich sehe, dass die aktive Registerkarte die gleiche ist.

    – Uri

    25. Februar 15 um 10:44 Uhr


  • @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

1643120166 171 Wie wechsle ich in Selenium zum aktiven Tab
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


1643120166 988 Wie wechsle ich in Selenium zum aktiven Tab
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:

from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get('https://www.google.com')

driver.execute_script("window.open('');")
time.sleep(5)

driver.switch_to.window(driver.window_handles[1])
driver.get("https://facebook.com")
time.sleep(5)

driver.close()
time.sleep(5)

driver.switch_to.window(driver.window_handles[0])
driver.get("https://www.yahoo.com")
time.sleep(5)

#driver.close()

1643120167 794 Wie wechsle ich in Selenium zum aktiven Tab
Ajjax

Der Tipp vom User “aberna” hat bei mir folgendermaßen funktioniert:

Zuerst bekam ich eine Liste der Registerkarten:

  tab_list = driver.window_handles

Dann wähle ich den Reiter:

   driver.switch_to.window(test[1])

Zurück zur vorherigen Registerkarte:

    driver.switch_to.window(test[0])

1643120167 174 Wie wechsle ich in Selenium zum aktiven Tab
RobC

Hier ist das vollständige Skript.

Notiz: Entfernen Sie die Leerzeichen in den beiden Zeilen für die kleine URL unten. Stack Overflow lässt den winzigen Link hier nicht zu.

import ahk
import win32clipboard
import traceback
import appJar
import requests
import sys
import urllib
import selenium
import getpass
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import socket
import time 
import urllib.request
from ahk import AHK, Hotkey, ActionChain # You want to play with AHK. 
from appJar import gui

try:                                                                                                                                                                         
    ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU64.exe")    

except:                                                                                                                                                                         
    ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU32.exe")    

finally:                                                                                                                                                                         
    pass 

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--start-maximized')
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation']);
chromeDriver = webdriver.Chrome('C:\new_software\chromedriver.exe', chrome_options = chrome_options)

def  ahk_disabledevmodescript():
    try:                                                                                                                                                                         
        ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU64.exe")                                                                                                                                                                           
    except:                                                                                                                                                                         
        ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU32.exe")                                                                                                                                                                         
    finally:                                                                                                                                                                         
        pass   
    ahk_disabledevmodescriptt= [
    str('WinActivate,ahk_exe chrome.exe'),
    str('Send {esc}'),
    ]
    #Run-Script
    for snipet in  ahk_disabledevmodescriptt:
        ahk.run_script(snipet, blocking=True )
    return 

def launchtabsagain():

    chromeDriver.execute_script("window.open('https://developers.google.com/edu/python/introduction', 'tab2');")
    chromeDriver.execute_script("window.open('https://www.facebook.com/', 'tab3');")
    chromeDriver.execute_script("window.open('https://developer.mozilla.org/en-US/docs/Web/API/Window/open', 'tab4');")
    chromeDriver.execute_script("window.open('https://www.easyespanol.org/', 'tab5');")
    chromeDriver.execute_script("window.open('https://www.google.com/search?source=hp&ei=EPO2Xf3EMLPc9AO07b2gAw&q=programming+is+not+difficult&oq=programming+is+not+difficult&gs_l=psy-ab.3..0i22i30.3497.22282..22555...9.0..0.219.3981.21j16j1......0....1..gws-wiz.....6..0i362i308i154i357j0j0i131j0i10j33i22i29i30..10001%3A0%2C154.h1w5MmbFx7c&ved=0ahUKEwj9jIyzjb_lAhUzLn0KHbR2DzQQ4dUDCAg&uact=5', 'tab6');")
    chromeDriver.execute_script("window.open('https://www.google.com/search?source=hp&ei=NvO2XdCrIMHg9APduYzQDA&q=dinner+recipes&oq=&gs_l=psy-ab.1.0.0i362i308i154i357l6.0.0..3736...0.0..0.179.179.0j1......0......gws-wiz.....6....10001%3A0%2C154.gsoCDxw8cyU', 'tab7');")

    return  
chromeDriver.get('https://ebc.cybersource.com/ebc2/')
compoanionWindow = ahk.active_window

launchtabs = launchtabsagain()
disabledevexetmessage = ahk_disabledevmodescript()



def copyUrl(): 
    try:                                                                                                                                                                         
        ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU64.exe")                                                                                                                                                                           
    except:                                                                                                                                                                         
        ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU32.exe")                                                                                                                                                                         
    finally:                                                                                                             

        pass 
    snipet = str('WinActivate,ahk_exe chrome.exe')
    ahk.run_script(snipet, blocking=True )  
    compoanionWindow.activate() 
    ahk_TinyChromeCopyURLScript=[

        str('WinActivate,ahk_exe chrome.exe'),
        str('send ^l'),
        str('sleep 10'),
        str('send ^c'),
        str('BlockInput, MouseMoveoff'),
        str('clipwait'),
    ] 

    #Run-AHK Script
    if ahk:
        for snipet in  ahk_TinyChromeCopyURLScript:
            ahk.run_script(snipet, blocking=True )  
    win32clipboard.OpenClipboard()
    urlToShorten = win32clipboard.GetClipboardData()
    win32clipboard.CloseClipboard()   


    return(urlToShorten)


def tiny_url(url):
    try:

        apiurl = "https: // tinyurl. com / api - create. php? url= " #remove spaces here
        tinyp = requests.Session()
        tinyp.proxies = {"https" : "https://USER:PASSWORD." + "@userproxy.visa.com:443", "http" : "http://USER:PASSWORD." + "@userproxy.visa.com:8080"}
        tinyUrl = tinyp.get(apiurl+url).text
        returnedresponse = tinyp.get(apiurl+url)
        if returnedresponse.status_code == 200: 
            print('Success! response code=" + str(returnedresponse))
        else:
            print("Code returned = ' + str(returnedresponse))
            print('From IP Address=" +IPadd)


    except:
        apiurl = "https: // tinyurl. com / api - create. php? url= " #remove spaces here
        tinyp = requests.Session()
        tinyUrl = tinyp.get(apiurl+url).text
        returnedresponse = tinyp.get(apiurl+url)
        if returnedresponse.status_code == 200: 
            print("Success! response code=" + str(returnedresponse))
            print("From IP Address=" +IPadd)
        else:
            print("Code returned = ' + str(returnedresponse))

    return tinyUrl

def tinyUrlButton():

    longUrl = copyUrl()
    try:                                                                                                                                                                         
        ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU64.exe")                                                                                                                                                                           
    except:                                                                                                                                                                         
        ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU32.exe")                                                                                                                                                                         
    finally:                                                                                                                                                                         
        pass
    try:
        shortUrl = tiny_url(longUrl)
        win32clipboard.OpenClipboard()
        win32clipboard.EmptyClipboard()
        win32clipboard.SetClipboardText(shortUrl)
        win32clipboard.CloseClipboard()
        if ahk:
            try:
                if str(shortUrl) == 'Error':
                    ahk.run_script("Msgbox,262144 ,Done.,"+ shortUrl + "`rPlease make sure there is a link to copy and that the page is fully loaded., 5.5" )
                else:
                    ahk.run_script("Msgbox,262144 ,Done.,"+ shortUrl + " is in your clipboard., 1.5" )
                # ahk.run_script("WinActivate, tinyUrl" )
            except:
                traceback.print_exc()
                print('error during ahk script')

                pass

    except:
        print('Error getting tinyURl')
        traceback.print_exc()

def closeChromeTabs(): 
        try: 
            try:                                                                                                                                                                          
                ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU64.exe")                                                                                                                                                                          
            except:                                                                                                                                                                          
                ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU32.exe")                                                                                                                                                                  
            finally:                                                                                                                                                                          
                    pass   
            compoanionWindow.activate()  
            ahk_CloseChromeOtherTabsScript = [ 

                str('WinActivate,ahk_exe chrome.exe'), 
                str('Mouseclick, Right, 30, 25,,1'), 
                str('Send {UP 3} {enter}'), 
                str('BlockInput, MouseMoveOff'), 
                ] 
                #Run-Script 
            if ahk: 
                for snipet in  ahk_CloseChromeOtherTabsScript: 
                        ahk.run_script(snipet, blocking=True ) 
            return(True) 
        except: 
            traceback.print_exc() 
            print("Failed to run closeTabs function.") 
            ahk.run_script('Msgbox,262144,,Failed to run closeTabs function.,2') 
            return(False)         



        # create a GUI and testing this library.

window = gui("tinyUrl and close Tabs test ", "200x160")
window.setFont(9)
window.setBg("blue")
window.removeToolbar(hide=True)
window.addLabel("description", "Testing AHK Library.")
window.addLabel("title", "tinyURL")
window.setLabelBg("title", "blue")
window.setLabelFg("title", "white")
window.addButtons(["T"], tinyUrlButton)
window.addLabel("title1", "Close tabs")
window.setLabelBg("title1", "blue")
window.setLabelFg("title1", "white")
window.addButtons(["C"], closeChromeTabs)
window.addLabel("title2", "Launch tabs")
window.setLabelBg("title2", "blue")
window.setLabelFg("title2", "white")
window.addButtons(["L"], launchtabsagain)
window.go()

if window.exitFullscreen():
    chromeDriver.quit()


def closeTabs():
    try:
        try:                                                                                                                                                                         
            ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU64.exe")                                                                                                                                                                           
        except:                                                                                                                                                                         
            ahk = AHK(executable_path="C:\Program Files\AutoHotkey\AutoHotkeyU32.exe")                                                                                                                                                                         
        finally:                                                                                                                                                                         
                pass   

        compoanionWindow.activate()     
        ahk_CloseChromeOtherTabsScript = [

            str('WinActivate,ahk_exe chrome.exe'),
            str('Mouseclick, Right, 30, 25,,1'),
            str('Send {UP 3} {enter}'),
            str('BlockInput, MouseMoveOff'),
            ]
            #Run-Script
        if ahk:
            for snipet in  ahk_CloseChromeOtherTabsScript:
                    ahk.run_script(snipet, blocking=True )
        return(True)
    except:
        traceback.print_exc()
        print("Failed to run closeTabs function.")
        ahk.run_script('Msgbox,262144,Failed,Failed to run closeTabs function.,2')
        return(False)

  • Nicht ganz sicher, warum dies negative Bewertungen erhalten hat.

    – Xammax

    21. Dezember 21 um 5:42 Uhr

.

633180cookie-checkWie wechsle ich in Selenium zum aktiven Tab?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy