Как открыть новое окно в браузере с помощью 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')