Compare commits

...

5 Commits

6 changed files with 149 additions and 120 deletions

View File

@ -560,11 +560,11 @@ class ModalEditRack(ModalWindowComponent):
""" """
return [ return [
"TestUserRulesAdmin", "admin",
"TestUserRulesOper", "manager",
"TestUserRulesManager", "operator",
"TestUserRulesSec", "sec",
"TestUserRulesCollector" "collector"
] ]
def _process_single_field( def _process_single_field(

View File

@ -56,16 +56,8 @@ class RackPage(BasePage):
# Действия # Действия
def click_edit_button(self) -> None: def click_edit_button(self) -> None:
""" """ Кликает на кнопку 'Изменить'."""
Кликает на кнопку 'Изменить'.
"""
logger.debug("Clicking on 'Edit' button...")
# Проверяем видимость кнопки
self.toolbar.check_button_visibility("edit")
self.toolbar.check_button_tooltip("edit", "Изменить")
# Кликаем на кнопку
self.toolbar.get_button_by_name("edit").click() self.toolbar.get_button_by_name("edit").click()
self.wait_for_timeout(1000) self.wait_for_timeout(1000)
@ -458,7 +450,7 @@ class RackPage(BasePage):
self.toolbar.check_button_tooltip("edit", "Изменить") self.toolbar.check_button_tooltip("edit", "Изменить")
# Кликаем на кнопку "Изменить" для проверки функциональности # Кликаем на кнопку "Изменить" для проверки функциональности
self.toolbar.get_button_by_name("edit").click() #self.toolbar.get_button_by_name("edit").click()
def should_have_hide_rack_button(self) -> None: def should_have_hide_rack_button(self) -> None:

View File

@ -8,13 +8,14 @@ from locators.rack_locators import RackLocators
from components_derived.accounting_objects.rack_maker import RackObjectMaker, RackData from components_derived.accounting_objects.rack_maker import RackObjectMaker, RackData
from components_derived.frames.create_child_element_frame import CreateChildElementFrame from components_derived.frames.create_child_element_frame import CreateChildElementFrame
from pages.location_page import LocationPage from pages.location_page import LocationPage
from components_derived.modal_edit_rack import ModalEditRack, RackEditData
from pages.login_page import LoginPage from pages.login_page import LoginPage
from pages.main_page import MainPage from pages.main_page import MainPage
from pages.rack_page import RackPage from pages.rack_page import RackPage
from components.alert_component import AlertComponent
logger = get_logger("CREATE_RACK_ELEMENT_TEST") logger = get_logger("CREATE_RACK_TEST")
logger.setLevel("INFO") logger.setLevel("INFO")
# @pytest.mark.smoke # @pytest.mark.smoke
@ -136,6 +137,12 @@ class TestCreateRackElement:
# Нажимаем кнопку создания # Нажимаем кнопку создания
create_child_frame.click_add_button() create_child_frame.click_add_button()
# Проверяем уведомление об успешном создании
alert = AlertComponent(browser)
expected_alert_text = f"Элемент {rack_name} создан"
alert.check_alert_presence(expected_alert_text)
alert.close_alert_by_text(expected_alert_text)
def _delete_rack_from_context_menu(self, browser: Page, rack_name: str) -> None: def _delete_rack_from_context_menu(self, browser: Page, rack_name: str) -> None:
"""Удаляет стойку через контекстное меню. """Удаляет стойку через контекстное меню.
@ -153,41 +160,34 @@ class TestCreateRackElement:
self.main_page.wait_for_timeout(500) self.main_page.wait_for_timeout(500)
# 2. Проверяем и нажимаем кнопку "Изменить" # 2. Проверяем и нажимаем кнопку "Изменить"
logger.debug("Step 1: Clicking 'Edit' button...")
rack_page = RackPage(browser) rack_page = RackPage(browser)
# Проверяем видимость кнопки # Проверяем видимость и тултип кнопки
rack_page.toolbar.check_button_visibility("edit") rack_page.should_be_toolbar_buttons()
# Проверяем тултип кнопки
rack_page.toolbar.check_button_tooltip("edit", "Изменить")
# Кликаем на кнопку "Изменить" # Кликаем на кнопку "Изменить"
rack_page.toolbar.get_button_by_name("edit").click() rack_page.click_edit_button()
logger.debug("Edit button clicked, waiting for edit form...") self.main_page.wait_for_timeout(1000)
# 3. Используем метод click_remove_button, который обрабатывает весь процесс удаления # 3. Создаем экземпляр ModalRackEditRack
# включая диалог подтверждения rack_edit = ModalEditRack(browser, rack_name)
logger.debug("Clicking remove button...")
rack_page.click_remove_button()
# 4. Проверяем уведомление об успешном удалении - требуется создать разработчику (заведена задача) # Используем метод для удаления
# Создаем экземпляр фрейма для доступа к alert компоненту rack_edit.click_remove_button()
# create_child_frame = CreateChildElementFrame(browser) self.main_page.wait_for_timeout(1000)
# Проверяем наличие любого alert-окна (не обязательно точного текста) # 4. Проверяем уведомление об успешном удалении
# create_child_frame.alert.check_alert_presence("") alert = AlertComponent(browser)
expected_alert_text = "Успешно удалено"
alert.check_alert_presence(expected_alert_text)
# Получаем текст alert, чтобы убедиться что удаление прошло успешно # Получаем текст alert для логирования
# alert_text = create_child_frame.alert.get_text() alert_text = alert.get_text()
# logger.debug(f"Alert text after deletion: {alert_text}") logger.debug(f"Alert text after deletion: {alert_text}")
# Проверяем что в тексте есть указание на успешное удаление
# assert "удален" in alert_text.lower() or "успешно" in alert_text.lower()
# Закрываем alert # Закрываем alert
# create_child_frame.alert.close_alert() alert.close_alert_by_text(expected_alert_text)
logger.debug("Rack deletion completed") logger.debug("Rack deletion completed")
@ -249,17 +249,19 @@ class TestCreateRackElement:
# Проверяем валидацию полей # Проверяем валидацию полей
logger.debug("Checking validation results") logger.debug("Checking validation results")
alert = AlertComponent(create_child_frame.page)
# Обрабатываем alert-окна # Обрабатываем alert-окна
if not height_value: if not height_value:
logger.debug("Expecting height validation alert") logger.debug("Expecting height validation alert")
create_child_frame.alert.check_alert_presence(expected_alert_height) alert.check_alert_presence(expected_alert_height)
create_child_frame.alert.close_alert_by_text(expected_alert_height) alert.close_alert_by_text(expected_alert_height)
logger.debug("Height alert handled") logger.debug("Height alert handled")
if not depth_value: if not depth_value:
logger.debug("Expecting depth validation alert") logger.debug("Expecting depth validation alert")
create_child_frame.alert.check_alert_presence(expected_alert_depth) alert.check_alert_presence(expected_alert_depth)
create_child_frame.alert.close_alert_by_text(expected_alert_depth) alert.close_alert_by_text(expected_alert_depth)
logger.debug("Depth alert handled") logger.debug("Depth alert handled")
# Проверяем подсветку обязательных полей # Проверяем подсветку обязательных полей
@ -321,22 +323,15 @@ class TestCreateRackElement:
# Нажимаем кнопку "Добавить" # Нажимаем кнопку "Добавить"
create_child_frame.click_add_button() create_child_frame.click_add_button()
# 1. Проверяем уведомление об успешном создании стойки - требуется создать разработчику (заведена задача) # Проверяем уведомление об успешном создании стойки
# Проверяем наличие alert-окна alert = AlertComponent(browser)
# create_child_frame.alert.check_alert_presence("") expected_alert_text = f"Элемент {rack_name} создан"
alert.check_alert_presence(expected_alert_text)
# Получаем текст alert
# alert_text = create_child_frame.alert.get_text()
# logger.debug(f"Alert text after creation: {alert_text}")
# Проверяем, что в тексте есть указание на успешное создание
# assert "создан" in alert_text.lower() or "успешно" in alert_text.lower()
# assert final_rack_name in alert_text
# Закрываем alert # Закрываем alert
# create_child_frame.alert.close_alert() alert.close_alert_by_text(expected_alert_text)
# 2. Проверяем, что стойка создана и отображается # Проверяем, что стойка создана и отображается
logger.debug(f"Verifying that rack '{rack_name}' was created...") logger.debug(f"Verifying that rack '{rack_name}' was created...")
# Обновляем навигационную панель # Обновляем навигационную панель
@ -347,7 +342,6 @@ class TestCreateRackElement:
assert rack_exists, f"Rack '{rack_name}' should be visible in navigation panel after creation" assert rack_exists, f"Rack '{rack_name}' should be visible in navigation panel after creation"
logger.debug(f"Rack '{rack_name}' is visible in navigation panel") logger.debug(f"Rack '{rack_name}' is visible in navigation panel")
logger.debug("Test for creating 'Rack' child element completed successfully") logger.debug("Test for creating 'Rack' child element completed successfully")
def test_create_rack_content(self, browser: Page) -> None: def test_create_rack_content(self, browser: Page) -> None:
@ -429,18 +423,19 @@ class TestCreateRackElement:
# Нажимаем кнопку создания # Нажимаем кнопку создания
create_child_frame.click_add_button() create_child_frame.click_add_button()
create_child_frame.wait_for_timeout(2000) create_child_frame.wait_for_timeout(1000)
# Проверяем наличие alert-окна с сообщением о дублирующемся имени # Проверяем наличие alert-окна с сообщением о дублирующемся имени
alert = AlertComponent(browser)
expected_alert_text = f"Имя {rack_name} уже используется" expected_alert_text = f"Имя {rack_name} уже используется"
create_child_frame.alert.check_alert_presence(expected_alert_text) alert.check_alert_presence(expected_alert_text)
# Проверяем, что остались на странице создания (стойка не создана)
create_child_frame.check_toolbar_title('Создать дочерний элемент в')
# Закрываем alert-окно с помощью кнопки закрытия # Закрываем alert-окно с помощью кнопки закрытия
create_child_frame.wait_for_timeout(2000) create_child_frame.wait_for_timeout(2000)
create_child_frame.alert.close_alert_by_text(expected_alert_text) alert.close_alert_by_text(expected_alert_text)
# Проверяем, что остались на странице создания (стойка не создана)
create_child_frame.check_toolbar_title('Создать дочерний элемент в')
logger.debug("System prevented creating rack with duplicate name") logger.debug("System prevented creating rack with duplicate name")
@ -572,20 +567,13 @@ class TestCreateRackElement:
create_child_frame.click_add_button() create_child_frame.click_add_button()
create_child_frame.wait_for_timeout(500) create_child_frame.wait_for_timeout(500)
# Проверяем уведомление об успешном создании стойки - требуется создать разработчику (заведена задача) # Проверяем уведомление об успешном создании стойки
# Проверяем наличие alert-окна alert = AlertComponent(browser)
# create_child_frame.alert.check_alert_presence("") expected_alert_text = f"Элемент {final_rack_name} создан"
alert.check_alert_presence(expected_alert_text)
# Получаем текст alert
# alert_text = create_child_frame.alert.get_text()
# logger.debug(f"Alert text after creation: {alert_text}")
# Проверяем что в тексте есть указание на успешное создание
# assert "создан" in alert_text.lower() or "успешно" in alert_text.lower()
# assert final_rack_name in alert_text
# Закрываем alert # Закрываем alert
# create_child_frame.alert.close_alert() alert.close_alert_by_text(expected_alert_text)
logger.debug("Required fields validation test completed successfully") logger.debug("Required fields validation test completed successfully")

View File

@ -15,13 +15,14 @@ from pages.rack_page import RackPage
from components_derived.accounting_objects.rack_maker import RackObjectMaker, RackData from components_derived.accounting_objects.rack_maker import RackObjectMaker, RackData
from components_derived.frames.create_child_element_frame import CreateChildElementFrame from components_derived.frames.create_child_element_frame import CreateChildElementFrame
from components_derived.modal_edit_rack import ModalEditRack, RackEditData from components_derived.modal_edit_rack import ModalEditRack, RackEditData
from components.alert_component import AlertComponent
from tools.logger import get_logger from tools.logger import get_logger
# Константы # Константы
RACK_NAME = "Test-Rack-Functionality" RACK_NAME = "Test-Rack-Functionality"
# Инициализация логгера для всего модуля # Инициализация логгера для всего модуля
logger = get_logger("RACK_TESTS") logger = get_logger("RACK_EDIT_TESTS")
logger.setLevel("INFO") logger.setLevel("INFO")
class TestRackTab: class TestRackTab:
@ -101,6 +102,12 @@ class TestRackTab:
# Нажимаем кнопку создания # Нажимаем кнопку создания
create_child_frame.click_add_button() create_child_frame.click_add_button()
# Проверяем уведомление об успешном создании
alert = AlertComponent(browser)
expected_alert_text = f"Элемент {rack_name} создан"
alert.check_alert_presence(expected_alert_text)
alert.close_alert_by_text(expected_alert_text)
logger.info(f"Rack '{rack_name}' created successfully") logger.info(f"Rack '{rack_name}' created successfully")
def _delete_rack_from_context_menu(self, browser: Page, rack_name: str) -> None: def _delete_rack_from_context_menu(self, browser: Page, rack_name: str) -> None:
@ -123,20 +130,26 @@ class TestRackTab:
# 2. Проверяем и нажимаем кнопку "Изменить" # 2. Проверяем и нажимаем кнопку "Изменить"
rack_page = RackPage(browser) rack_page = RackPage(browser)
# Проверяем видимость кнопки # Проверяем видимость и тултип кнопки
rack_page.toolbar.check_button_visibility("edit") rack_page.should_be_toolbar_buttons()
# Проверяем тултип кнопки
rack_page.toolbar.check_button_tooltip("edit", "Изменить")
# Кликаем на кнопку "Изменить" # Кликаем на кнопку "Изменить"
rack_page.toolbar.get_button_by_name("edit").click() rack_page.click_edit_button()
self.main_page.wait_for_timeout(1000)
# 3. Создаем экземпляр ModalRackEditRack # 3. Создаем экземпляр ModalRackEditRack
rack_edit = ModalEditRack(browser, rack_name) rack_edit = ModalEditRack(browser, rack_name)
# Используем метод для удаления # Используем метод для удаления
rack_edit.click_remove_button() rack_edit.click_remove_button()
self.main_page.wait_for_timeout(1000)
# 4. Проверяем уведомление об успешном удалении
alert = AlertComponent(browser)
expected_alert_text = "Успешно удалено"
alert.check_alert_presence(expected_alert_text)
alert.close_alert_by_text(expected_alert_text)
logger.info(f"Rack '{rack_name}' deleted successfully") logger.info(f"Rack '{rack_name}' deleted successfully")
@ -237,7 +250,7 @@ class TestRackTab:
# Создаем тестовые данные для заполнения всех полей # Создаем тестовые данные для заполнения всех полей
rack_edit_data = RackEditData( rack_edit_data = RackEditData(
# Основные поля # Основные поля
name="Test-Rack-Functionality", name=RACK_NAME,
serial="SN123456789", serial="SN123456789",
inventory="INV987654321", inventory="INV987654321",
comment="Тестовый комментарий для стойки (обновленный)", comment="Тестовый комментарий для стойки (обновленный)",
@ -261,7 +274,15 @@ class TestRackTab:
# Сохраняем изменения # Сохраняем изменения
rack_edit.click_done_button() rack_edit.click_done_button()
rack_edit.wait_for_timeout(3000) rack_edit.wait_for_timeout(2000)
# Проверяем уведомление об успешном обновлении
alert = AlertComponent(browser)
expected_alert_text = "Элемент успешно обновлён"
alert.check_alert_presence(expected_alert_text)
alert.close_alert_by_text(expected_alert_text)
browser.mouse.click(10, 10)
# Вход в режим редактирования # Вход в режим редактирования
rack_page.click_edit_button() rack_page.click_edit_button()
@ -298,11 +319,10 @@ class TestRackTab:
rack_edit.switch_to_tab(ModalEditRack.TAB_IMAGE) rack_edit.switch_to_tab(ModalEditRack.TAB_IMAGE)
# Проверяем вкладку # Проверяем вкладку
assert rack_edit.is_tab_active(ModalEditRack.TAB_IMAGE), \ assert rack_edit.is_tab_active(ModalEditRack.TAB_IMAGE), "Image tab should be active"
"Image tab should be active"
# Загружаем изображение если есть # Загружаем изображение если есть
test_image_path = os.path.join(os.path.dirname(__file__), "test_image.jpg") test_image_path = os.path.join(os.path.dirname(__file__), "test_edit_rack_image.jpg")
if os.path.exists(test_image_path): if os.path.exists(test_image_path):
logger.debug(f"Found test image: {test_image_path}") logger.debug(f"Found test image: {test_image_path}")
# Находим input и загружаем файл # Находим input и загружаем файл
@ -319,6 +339,13 @@ class TestRackTab:
# Сохраняем # Сохраняем
rack_edit.click_done_button() rack_edit.click_done_button()
rack_page.wait_for_timeout(2000)
# Проверяем уведомление об успешном обновлении
alert = AlertComponent(browser)
expected_alert_text = "Элемент успешно обновлён"
alert.check_alert_presence(expected_alert_text)
alert.close_alert_by_text(expected_alert_text)
@pytest.mark.develop @pytest.mark.develop
def test_rack_access_rules(self, browser: Page) -> None: def test_rack_access_rules(self, browser: Page) -> None:
@ -354,11 +381,11 @@ class TestRackTab:
# Пользователи для добавления в каждое поле # Пользователи для добавления в каждое поле
custom_users = [ custom_users = [
"TestUserRulesAdmin", "admin",
"TestUserRulesOper", "manager",
"TestUserRulesManager", "operator",
"TestUserRulesSec", "sec",
"TestUserRulesCollector" "collector"
] ]
# Заполняем поля # Заполняем поля
@ -393,7 +420,13 @@ class TestRackTab:
# Сохраняем изменения # Сохраняем изменения
rack_edit.click_done_button() rack_edit.click_done_button()
rack_edit.wait_for_timeout(3000) rack_page.wait_for_timeout(2000)
# Проверяем уведомление об успешном обновлении
alert = AlertComponent(browser)
expected_alert_text = "Элемент успешно обновлён"
alert.check_alert_presence(expected_alert_text)
alert.close_alert_by_text(expected_alert_text)
# Возвращаемся в режим редактирования и проверяем снова # Возвращаемся в режим редактирования и проверяем снова
rack_page.click_edit_button() rack_page.click_edit_button()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -9,14 +9,21 @@ from playwright.sync_api import Page
from locators.navigation_panel_locators import NavigationPanelLocators from locators.navigation_panel_locators import NavigationPanelLocators
from components_derived.accounting_objects.rack_maker import RackObjectMaker, RackData from components_derived.accounting_objects.rack_maker import RackObjectMaker, RackData
from components_derived.frames.create_child_element_frame import CreateChildElementFrame from components_derived.frames.create_child_element_frame import CreateChildElementFrame
from components_derived.modal_edit_rack import ModalEditRack
from pages.location_page import LocationPage from pages.location_page import LocationPage
from pages.login_page import LoginPage from pages.login_page import LoginPage
from pages.main_page import MainPage from pages.main_page import MainPage
from pages.rack_page import RackPage from pages.rack_page import RackPage
from components.alert_component import AlertComponent
from tools.logger import get_logger
# Константы # Константы
RACK_NAME = "Test-Rack-Functionality" RACK_NAME = "Test-Rack-Functionality"
# Инициализация логгера для всего модуля
logger = get_logger("RACK_MANAGEMENT_TESTS")
logger.setLevel("INFO")
class TestRackTab: class TestRackTab:
"""Набор тестов для вкладки 'Стойка' в модуле Объекты. """Набор тестов для вкладки 'Стойка' в модуле Объекты.
@ -25,7 +32,6 @@ class TestRackTab:
Тесты покрывают следующие функциональные области: Тесты покрывают следующие функциональные области:
1. test_rack_tab_content - Базовая структура и содержимое вкладки стойки 1. test_rack_tab_content - Базовая структура и содержимое вкладки стойки
2. test_rack_tab_switching - Функциональность переключения между вкладками стойки
""" """
# Инициализируем атрибуты # Инициализируем атрибуты
@ -63,6 +69,8 @@ class TestRackTab:
browser: Страница Playwright browser: Страница Playwright
rack_name: Имя стойки для создания rack_name: Имя стойки для создания
""" """
logger.debug(f"Creating rack: {rack_name}")
# Нажимаем кнопку "Создать" на тулбаре # Нажимаем кнопку "Создать" на тулбаре
self.location_page.click_create_button() self.location_page.click_create_button()
@ -91,6 +99,14 @@ class TestRackTab:
# Нажимаем кнопку создания # Нажимаем кнопку создания
create_child_frame.click_add_button() create_child_frame.click_add_button()
# Проверяем уведомление об успешном создании
alert = AlertComponent(browser)
expected_alert_text = f"Элемент {rack_name} создан"
alert.check_alert_presence(expected_alert_text)
alert.close_alert_by_text(expected_alert_text)
logger.info(f"Rack '{rack_name}' created successfully")
def _delete_rack_from_context_menu(self, browser: Page, rack_name: str) -> None: def _delete_rack_from_context_menu(self, browser: Page, rack_name: str) -> None:
"""Удаляет стойку через контекстное меню. """Удаляет стойку через контекстное меню.
@ -100,7 +116,9 @@ class TestRackTab:
""" """
# 1. Находим элемент стойки в навигационной панели # 1. Находим элемент стойки в навигационной панели
rack_element = browser.locator(NavigationPanelLocators.TREEVIEW).get_by_text(rack_name, exact=True).first rack_element = browser.locator(
NavigationPanelLocators.TREEVIEW
).get_by_text(rack_name, exact=True).first
# Прокручиваем до элемента если нужно # Прокручиваем до элемента если нужно
rack_element.scroll_into_view_if_needed() rack_element.scroll_into_view_if_needed()
@ -109,18 +127,28 @@ class TestRackTab:
# 2. Проверяем и нажимаем кнопку "Изменить" # 2. Проверяем и нажимаем кнопку "Изменить"
rack_page = RackPage(browser) rack_page = RackPage(browser)
# Проверяем видимость кнопки # Проверяем видимость и тултип кнопки
rack_page.toolbar.check_button_visibility("edit") rack_page.should_be_toolbar_buttons()
# Проверяем тултип кнопки
rack_page.toolbar.check_button_tooltip("edit", "Изменить")
# Кликаем на кнопку "Изменить" # Кликаем на кнопку "Изменить"
rack_page.toolbar.get_button_by_name("edit").click() rack_page.click_edit_button()
# 3. Используем метод click_remove_button, который обрабатывает весь процесс удаления self.main_page.wait_for_timeout(1000)
# включая диалог подтверждения
rack_page.click_remove_button() # 3. Создаем экземпляр ModalRackEditRack
rack_edit = ModalEditRack(browser, rack_name)
# Используем метод для удаления
rack_edit.click_remove_button()
self.main_page.wait_for_timeout(1000)
# 4. Проверяем уведомление об успешном удалении
alert = AlertComponent(browser)
expected_alert_text = "Успешно удалено"
alert.check_alert_presence(expected_alert_text)
alert.close_alert_by_text(expected_alert_text)
logger.info(f"Rack '{rack_name}' deleted successfully")
@pytest.fixture(scope="function", autouse=True) @pytest.fixture(scope="function", autouse=True)
def setup(self, browser: Page) -> None: def setup(self, browser: Page) -> None:
@ -154,6 +182,8 @@ class TestRackTab:
if not self._check_rack_existance(browser, RACK_NAME): if not self._check_rack_existance(browser, RACK_NAME):
self._create_rack(browser, RACK_NAME) self._create_rack(browser, RACK_NAME)
self.main_page.wait_for_timeout(3000) self.main_page.wait_for_timeout(3000)
else:
logger.info(f"Rack '{RACK_NAME}' already exists")
# Переходим к стойке для тестирования # Переходим к стойке для тестирования
self.main_page.click_subpanel_item(RACK_NAME, parent="test-zone") self.main_page.click_subpanel_item(RACK_NAME, parent="test-zone")
@ -231,20 +261,6 @@ class TestRackTab:
# Проверка кнопки "Показать стойку" # Проверка кнопки "Показать стойку"
rt.should_have_show_rack_button() rt.should_have_show_rack_button()
rt.wait_for_timeout(1000)
def test_rack_tab_switching(self, browser: Page) -> None:
"""Тест переключения между вкладками стойки оборудования.
Тестирует переключение на все доступные вкладки: Общая информация,
Обслуживание, События, Сервисы.
Args:
browser (Page): Экземпляр страницы Playwright для взаимодействия с UI
"""
rt = RackPage(browser)
# Проверяем переключение между всеми вкладками стойки # Проверяем переключение между всеми вкладками стойки
rt.check_tab_switching() rt.check_tab_switching()