2015-02-25 12 views
15

Abbiamo sviluppato un'estensione per Chrome e voglio testare la nostra estensione con Selenium. Ho creato un test, ma il problema è che la nostra estensione apre una nuova scheda quando viene installata e penso di ottenere un'eccezione dall'altra scheda. È possibile passare alla scheda attiva che sto testando? Oppure un'altra opzione è iniziare con l'estensione disabilitata, quindi accedere al nostro sito Web e solo successivamente abilitare l'estensione. È possibile? Ecco il mio codice:Come passare alla scheda attiva in Selenium?

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() 

Il test fallisce con ElementNotVisibleException: Message: element not visible, perché nella nuova scheda (aperta dal estensione) "Log In" non è visibile (credo che la nuova scheda viene aperta solo dopo che il comando self.driver.get(url='http://example.com/logout')) .

Aggiornamento: ho scoperto che l'eccezione non è correlata alla scheda aggiuntiva, è dal nostro sito Web. Ma ho chiuso la scheda in più con questo codice, secondo il @ di aberna risposta:

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]) 

Dopo la chiusura della scheda in più, posso vedere il mio scheda nel video.

risposta

17

Alcune possibili approcci:

- Passa tra le schede utilizzando i send_keys (Ctrl + Tab)

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

- Passa tra le schede utilizzando i ActionsChains utilizzando (Control + TAB)

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

- Un altro approccio potrebbe rendere l'utilizzo dei metodi di selenio per verificare finestra corrente e passare a un altro:

È possibile utilizzare

driver.window_handles 

per trovare un elenco delle maniglie delle finestre e dopo tenta di passare usando metodi seguenti .

- driver.switch_to.active_element  
- driver.switch_to.default_content 
- driver.switch_to.window 
+0

Non funziona, penso che non cambi la scheda perché nel video [http://app.crossbrowsertesting.com/public/id7ed71371078e 09/selenio/2710150/videos/z4345e99d45d6a156ebf] Vedo che la scheda attiva è la stessa. – Uri

+0

@Uri non è così semplice analizzare il comportamento dei video. Ho aggiornato la risposta con un altro possibile approccio – aberna

+0

@ Uri qual è stato l'approccio che ha risolto il problema? – aberna

9

Questo in realtà ha lavorato per me in 3.x:

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

maniglie delle finestre sono aggiunti, quindi questo sceglie la seconda scheda nella lista

per continuare con la prima scheda:

driver.switch_to.window(driver.window_handles[0]) 
+1

Sembra logico ma funziona bene se si sa che il sito testato dovrebbe aprire un collegamento in una nuova scheda e nient'altro. Ottimo per veloce e sporco. – sdkks

Problemi correlati