Как открыть новое окно в браузере с помощью Selenium WebDriver для python?

Я пытаюсь открыть новую вкладку ИЛИ новое окно в браузере, используя selenium для python. Не важно, открывается ли новая вкладка или новое окно, важно только, чтобы открылся второй экземпляр браузера.

Я уже несколько раз пробовал несколько разных методов, и никто не преуспел.

  • Переключение на окно, которое не существует, и надеется, что оно откроет новое окно после того, как не найдет указанное окно:

    driver.switch_to_window(None)

  • Итерация через открытые окна (хотя в настоящее время существует только один)

    for handle in driver.window_handles:
        driver.switch_to_window(handle)
    
  • Попытка имитировать нажатие клавиши клавиатуры

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

Проблема с этим в частности заключалась в том, что не представляется возможным отправлять ключи непосредственно в браузер, только для определенного элемента, подобного этому:

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

Однако, когда команда, такая как это, отправляется элементу, она, похоже, ничего не делает. Я попытался найти верхний элемент HTML на странице и отправить ключи к нему, но снова был встречен с ошибкой:

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

Другая версия этого я нашел в Интернете и не смог проверить ее достоверность или ее отсутствие, потому что я не уверен, какой класс/модуль нуждается в импорте

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

Что-то очень похожее на другой синтаксис (я не уверен, что один или оба из них - правильный синтаксис)

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

Ответ 1

Как насчет того, что вы делаете что-то вроде этого

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

В зависимости от того, с каким окном вы хотите взаимодействовать, вы отправляете команды соответственно

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

Для всех вниз избирателей:


ОП запросил "it is only important that a second instance of the browser is opened.". Этот ответ не охватывает ВСЕ ВОЗМОЖНОСТНЫЕ требования каждого из всех случаев использования. Другие ответы ниже могут удовлетворить вашу особую потребность.

Ответ 2

Вы можете использовать execute_script, чтобы открыть новое окно.

driver = webdriver.Firefox()
driver.get("https://linkedin.com")
# open new tab
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

Ответ 3

Я рекомендую использовать команду CTRL + N в Firefox, чтобы уменьшить потребление памяти, чем создавать новые экземпляры браузера.

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

Способ переключения и управления окнами уже упоминался Dhiraj.

Ответ 4

driver = webdriver.Chrome()
driver.execute_script("window.open('');")
driver.get('first url')

driver.switch_to.window(driver.window_handles[1])
driver.get('second url')