Как переключиться на активную вкладку в Selenium?

Мы разработали расширение Chrome, и я хочу протестировать наше расширение с помощью 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()

Тест завершился неудачей с ElementNotVisibleException: Message: element not visible, потому что на новой вкладке (открытой расширением) "Вход" не отображается (я думаю, что новая вкладка открывается только после команды self.driver.get(url='http://example.com/logout')).

Обновление. Я узнал, что исключение не связано с дополнительной вкладкой, с нашего веб-сайта. Но я закрыл дополнительную вкладку с помощью этого кода, в соответствии с ответом @aberna:

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

После закрытия дополнительной вкладки я вижу свою вкладку в видео.

Ответы

Ответ 1

Некоторые возможные подходы:

1. Переключение между вкладками с помощью кнопок send_keys (CONTROL + TAB)

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

2. Переключение между вкладками с помощью ActionsChains (CONTROL + TAB)

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

3. Другой подход может помочь использовать методы Selenium для проверки текущего окна и перехода к другому:

Вы можете использовать

driver.window_handles

чтобы найти список дескрипторов окон и после попытки переключения с помощью следующих методов.

- driver.switch_to.active_element      
- driver.switch_to.default_content
- driver.switch_to.window

Ответ 2

Это действительно работало для меня в 3.x:

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

добавляются дескрипторы окон, поэтому выбирается вторая вкладка в списке

чтобы продолжить первую вкладку:

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

Ответ 3

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

driver.execute_script('''window.open("https://some.site/", "_blank");''')
sleep(1) # you can also try without it, just playing safe
driver.switch_to_window(driver.window_handles[-1]) # last opened tab handle
# driver.switch_to.window(driver.window_handles[-1])  for newer versions.

если вам нужно вернуться на главную вкладку, используйте:

driver.switch_to_window(driver.window_handles[0])

Резюме:

window_handles содержит список handles открытых tabs, используйте его в качестве аргумента в switch_to_window() для переключения между вкладками.

Ответ 4

Нажатие ctrl + t или выбор window_handles[0] предполагает, что при запуске у вас открыта только одна вкладка.

Если у вас открыто несколько вкладок, это может стать ненадежным.

Это то, что я делаю:

old_tabs=self.driver.window_handles
#Perform action that opens new window here
new_tabs=self.driver.window_handles
for tab in new_tabs:
     if tab in old tabs:
          pass
     else:
          new_tab=tab
driver.switch_to.window(new_tab)

Это то, что положительно идентифицирует новую вкладку перед переключением на нее и устанавливает в активном окне нужную новую вкладку.

Простое указание браузеру отправить ctrl + tab не работает, потому что оно не говорит веб-драйверу фактически переключиться на новую вкладку.