2013-06-26 17 views
9

Ich versuche, eine neue Registerkarte oder ein neues Fenster in einem Browser mit Selen für Python zu öffnen. Es ist von geringer Bedeutung, wenn eine neue Registerkarte oder ein neues Fenster geöffnet wird, es ist nur wichtig, dass eine zweite Instanz des Browsers geöffnet wird.Wie öffnet man ein neues Fenster in einem Browser mit Selenium WebDriver für Python?

Ich habe bereits verschiedene Methoden ausprobiert und keine davon ist erfolgreich.

  1. zu einem Fenster wechseln, das mit der Hoffnung, nicht vorhanden ist, dass es dann ein neues Fenster bei einem Ausfall öffnen würde zu lokalisieren das Fenster:

    driver.switch_to_window(None)

  2. Iterieren durch offene Fenster (obwohl es derzeit nur eine)

    for handle in driver.window_handles: 
        driver.switch_to_window(handle) 
    
  3. Der Versuch, eine Tastaturtaste drücken zu simulieren

    from selenium.webdriver.common.keys import Keys 
    driver.send_keys(Keys.CONTROL + 'T') 
    

Das Problem mit dieser insbesondere war, dass es nicht möglich erscheint Schlüssel an den Browser direkt zu senden, nur auf ein bestimmtes Element wie folgt aus:

driver.find_element_by_id('elementID').send_keys(Keys.CONTROL + 'T') 

Wenn jedoch Ein Befehl wie dieser wird an ein Element gesendet, es scheint absolut nichts zu tun. Ich habe versucht, die oberste HTML-Element auf der Seite zu finden und die Schlüssel zu, dass zu senden, wurde aber wieder gescheitert:

driver.find_element_by_id('wrapper').send_keys(Keys.CONTROL + 'T') 

Eine andere Version dieser fand ich online, und war nicht in der Lage ihre Gültigkeit oder Mangel zu überprüfen davon, weil ich nicht sicher bin, welche Klasse/Modul, das

act = ActionChains(driver) 
act.key_down(browserKeys.CONTROL) 
act.click("").perform() 
act.key_up(browserKeys.CONTROL) 

Etwas sehr ähnlich mit unterschiedlichen Syntax muss importieren (ich bin nicht sicher, ob eine oder beide diese korrekte Syntax ist)

actions.key_down(Keys.CONTROL) 
element.send_keys('t') 
actions.key_up(Keys.CONTROL) 
+0

Das nur für Browser, Firefox, Chrome, etc. In Beispiel PhantomJS hat keine Tastenbelegungen und Sie müssen 'execute_script()' mit dem richtigen JavaScript-Code aufrufen. Falls Sie Elemente/Cookies übergeben müssen, erstellen Sie einfach einen target = _blank-Link und klicken Sie dann darauf. – erm3nda

Antwort

12

Wie über Sie so etwas wie dieses

driver = webdriver.Firefox() #First FF window 
second_driver = webdriver.Firefox() #The new window you wanted to open 

Je nach tun, die Fenster, mit denen Sie interagieren möchten, können Sie senden Befehle entsprechend

print driver.title #to interact with the first driver 
print second_driver.title #to interact with the second driver 

Für alle unten Wähler:


Das OP fragte nach "it is only important that a second instance of the browser is opened. ". Diese Antwort umfasst nicht ALLE möglichen Anforderungen der Anwendungsfälle jeder einzelnen Person. Die anderen Antworten können Ihrem speziellen Bedarf entsprechen.

+0

Perfekt! So einfach, aber es hat genau das erreicht, was ich mir gewünscht habe, danke. Gibt es jedoch eine Möglichkeit, diesen Befehl zu verallgemeinern, so dass er unabhängig vom verwendeten Browser funktioniert? Vielleicht eine Möglichkeit, den verwendeten Browser im ersten Treiber abzuleiten, um den zweiten zu öffnen? –

+0

@ "Vielleicht eine Möglichkeit, den im ersten Treiber verwendeten Browser abzuleiten, um den zweiten zu öffnen?" - Ich bin mir nicht sicher, welchen Wert das hinzufügen wird. Auch wenn es so ist. Es tut mir leid, ich weiß nicht, wie ich es machen soll. Wie auch immer, wenn Sie diese Antwort hilfreich finden, können Sie dies als die Antwort markieren, dies ist - http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 – Amey

+4

Dies öffnet tatsächlich eine zweite Instanz von Firefox. Die Unterscheidung zwischen "neues Fenster im vorhandenen Browser" und "völlig neue Browser-Anwendung" kann für einige Testfälle wichtig sein. – ManicDee

9

Sie können execute_script verwenden, um ein neues Fenster zu öffnen.

driver = webdriver.Firefox() 
driver.get("https://linkedin.com") 
driver.execute_script("$(window.open('https://twitter.com'))") 
print driver.current_window_handle 

# Switch to new window 
driver.switch_to_window(driver.window_handles[-1]) 
print " Twitter window should go to facebook " 
print "New window ", driver.title 
driver.get("http://facebook.com") 
print "New window ", driver.title 

# Switch to old window 
driver.switch_to_window(driver.window_handles[0]) 
print " Linkedin should go to gmail " 
print "Old window ", driver.title 
driver.get("http://gmail.com") 
print "Old window ", driver.title 

# Again new window 
driver.switch_to_window(driver.window_handles[1]) 
print " Facebook window should go to Google " 
print "New window ", driver.title 
driver.get("http://google.com") 
print "New window ", driver.title 
+1

Dort wird nicht erwähnt, dass Jquery geladen wird, und Sie gehen davon aus, dass es von der vorherigen mit PhantomJS geladenen URL geladen wird. Auch der JavaScript-Code ist der gleiche, so dass nur 'driver.execute_script (" window.open ('https://twitter.com') ") funktioniert. – erm3nda

4

Ich empfehle CTRL + N Befehl auf Firefox zu verwenden, weniger Speicherverbrauch zu reduzieren, als neue Browser-Instanzen zu erstellen.

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

browser = webdriver.Firefox() 
body = browser.find_element_by_tag_name('body') 
body.send_keys(Keys.CONTROL + 'n') 

Der Weg zum Schalter und Kontrollfenster wird bereits von Dhiraj erwähnt.

+0

Dies ist die beste Lösung, da das Fenster im selben Treiber geöffnet wird. Dies funktioniert jedoch nicht für XML-Seiten. – Andrew

+1

@ fx-kirin Es funktioniert nicht im Firefox-Browser? –

Verwandte Themen