Как переключиться на активную вкладку в 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 не работает, потому что оно не говорит веб-драйверу фактически переключиться на новую вкладку.