2013-06-26 52 views
9

Próbuję otworzyć nową kartę LUB nowe okno w przeglądarce przy użyciu selenu dla Pythona. Nie ma znaczenia, czy nowa karta lub nowe okno jest otwarte, ważne jest tylko, aby otworzyła się druga instancja przeglądarki.Jak otworzyć nowe okno przeglądarki przy użyciu Selenium WebDriver dla Pythona?

Próbowałem już kilku różnych metod i żadna nie odniosła sukcesu.

  1. Przejście do okna, które nie istnieje w nadziei, że będzie następnie otworzyć nowe okno po awarii do zlokalizowania powiedział okno:

    driver.switch_to_window(None)

  2. iteracja otwartych okien (choć istnieje obecnie tylko jeden)

    for handle in driver.window_handles: 
        driver.switch_to_window(handle) 
    
  3. Próba symulować naciśnięć przycisków klawiatury

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

Problem ten w szczególności, że nie wydaje się możliwe, aby wysłać klucze bezpośrednio do przeglądarki, tylko do określonego elementu jak poniżej:

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

Jednak, gdy komenda taka jak ta jest wysyłana do elementu, wydaje się, że absolutnie nic nie robi. Próbowałem zlokalizować najwyższego elementu HTML na stronie i wysłać klucze do tego, ale po raz kolejny spotkał się z porażki:

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

Inna wersja to znalazłem w internecie, i nie był w stanie zweryfikować jego ważności lub brak ich, bo nie jestem pewien, co klasa/moduł, który wymaga importu

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

coś bardzo podobnego z innej składni (nie jestem pewien, czy jeden lub oba z nich jest poprawna składnia)

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

To tylko dla przeglądarek worowych, Firefox, Chrome itp. W przykładzie PhantomJS nie ma żadnych powiązań klawiszy i musisz wywołać 'execute_script()' z poprawnym kodem javascript. Sprawa, w której musisz przekazać przedmioty/pliki cookie, po prostu utwórz link celu = _blank, a następnie kliknij go wcześniej. – erm3nda

Odpowiedz

12

Jak Pan zrobić coś takiego

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

zależności od okna chcesz interakcji z, wysyłać polecenia odpowiednio

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

Dla wszystkich w dół wyborców:


Program OP poprosił o "it is only important that a second instance of the browser is opened. ". Ta odpowiedź nie obejmuje WSZYSTKICH możliwych wymagań każdego przypadku użycia. Inne odpowiedzi poniżej mogą odpowiadać konkretnej potrzebie.

+0

Idealny! Tak proste, ale udało mi się osiągnąć dokładnie to, czego pragnąłem, dziękuję. Czy istnieje jednak sposób na uogólnienie tego polecenia, aby działało niezależnie od używanej przeglądarki? Być może sposób na uzyskanie przeglądarki używanej w pierwszym kierowcy, aby otworzyć drugi? –

+0

@ "Być może sposób na uzyskanie przeglądarki używanej w pierwszym sterowniku do otwarcia drugiego?" - Nie jestem pewien, jaką wartość to doda. Nawet jeśli tak. Przepraszam, nie wiem jak to zrobić. W każdym razie, jeśli uważasz tę odpowiedź za pomocną, możesz oznaczyć to jako odpowiedź, tak - http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 – Amey

+4

To faktycznie otwiera drugą instancję przeglądarki Firefox. Rozróżnienie między "nowym oknem w istniejącej przeglądarce" a "całkowicie nową aplikacją przeglądarki" może być ważne w niektórych przypadkach testowych. – ManicDee

9

Możesz użyć execute_script, aby otworzyć nowe okno.

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

Nie ma żadnej wzmianki o ładowaniu Jquery'ego i zakładasz, że jest załadowany przez poprzedni URL załadowany PhantomJS. Ponadto kod javascript jest taki sam, więc po prostu 'driver.execute_script (" window.open ('https://twitter.com') ") będzie działać. – erm3nda

4

polecam użyć CTRL + N polecenie w Firefoksie, aby zmniejszyć zużycie pamięci mniej niż tworzyć nowe instancje przeglądarki.

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

Sposób przełączania okien i kontrolne zostało już wspomniane przez Dhiraj.

+0

To najlepsze rozwiązanie, ponieważ okno jest otwierane w tym samym sterowniku. Ale to nie zadziała dla stron XML. – Andrew

+1

@ fx-kirin Nie działa w przeglądarce Firefox? –

Powiązane problemy