From d910c5923c769e25fc302c297100643283164eb9 Mon Sep 17 00:00:00 2001 From: jonghyeokFF Date: Wed, 6 May 2026 23:21:07 +0900 Subject: [PATCH] =?UTF-8?q?feat(entrance-card):=20=EC=B6=9C=EC=9E=85?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EB=B0=9C=EA=B8=89=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 출입카드 발급 버튼 클릭, 바텀시트 마지막 항목 선택, 발급 확인 구현 Co-Authored-By: Claude Sonnet 4.6 --- .../pages/entrance_card_issue_page.py | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 fastfive-auto-app-dev/pages/entrance_card_issue_page.py diff --git a/fastfive-auto-app-dev/pages/entrance_card_issue_page.py b/fastfive-auto-app-dev/pages/entrance_card_issue_page.py new file mode 100644 index 0000000..c510795 --- /dev/null +++ b/fastfive-auto-app-dev/pages/entrance_card_issue_page.py @@ -0,0 +1,72 @@ +from selenium.webdriver.common.by import By +from .base_page import BasePage + + +class EntranceCardIssuePage(BasePage): + ANDROID = { + 'entrance_tab': (By.XPATH, '//*[@content-desc="출입카드" or @text="출입카드"]'), + 'issue_button': (By.XPATH, '//*[@text="출입카드 발급" or @text="출입카드 생성"]'), + } + + IOS = { + 'entrance_tab': (By.XPATH, '//XCUIElementTypeButton[contains(@label, "출입카드")]'), + 'issue_button': (By.XPATH, '//XCUIElementTypeOther[@name="출입카드 발급" or @name="출입카드 생성"]'), + } + + def get_selector(self, key): + return self.ANDROID[key] if self.is_android() else self.IOS[key] + + def go_to_entrance_card_tab(self): + self.click(self.get_selector('entrance_tab')) + print("출입카드 탭 클릭") + self.wait_seconds(2) + + def click_issue_button(self): + if self.is_ios(): + element = self.find_element(self.get_selector('issue_button')) + element.click() + else: + self.click(self.get_selector('issue_button')) + print("출입카드 생성 버튼 클릭") + self.wait_seconds(2) + + def select_last_item(self): + """바텀시트 리스트의 마지막 항목 선택 (좌표 기반)""" + window = self.driver.get_window_size() + tap_x = window['width'] // 2 + if self.is_ios(): + # 화면 높이의 84% 지점 = 마지막 라디오 항목 + tap_y = int(window['height'] * 0.84) + print(f"마지막 항목 탭 (x={tap_x}, y={tap_y})") + self.driver.execute_script('mobile: tap', {'x': tap_x, 'y': tap_y}) + else: + items = self.driver.find_elements(By.XPATH, '//android.widget.TextView') + exclude = {'모바일 출입카드 발급', '발급', '출입카드 생성', '출입카드 발급', ''} + targets = [el for el in items if el.text not in exclude] + assert targets, "선택 가능한 항목이 없습니다" + last = targets[-1] + print(f"마지막 항목 선택: {last.text}") + last.click() + self.wait_seconds(1) + + def click_confirm_button(self): + """발급 버튼 클릭 (좌표 기반)""" + window = self.driver.get_window_size() + tap_x = window['width'] // 2 + if self.is_ios(): + # 화면 높이의 94% 지점 = 발급 버튼 + tap_y = int(window['height'] * 0.94) + print(f"발급 버튼 탭 (x={tap_x}, y={tap_y})") + self.driver.execute_script('mobile: tap', {'x': tap_x, 'y': tap_y}) + else: + self.click((By.XPATH, '//*[@text="발급"]')) + print("발급 버튼 클릭") + self.wait_seconds(2) + + def full_entrance_card_issue_flow(self): + self.go_to_entrance_card_tab() + self.click_issue_button() + self.select_last_item() + self.click_confirm_button() + print("✅ 출입카드 생성 테스트 완료") + return True