본문 바로가기
코딩/Mobile 자동화 (new)

appium 자동화 2024 - 5) 소스 코드 구조화

by salzzak 2024. 2. 22.
728x90

이전에 짰던 하나의 소스코드를 구조화

 

import pytest

from appium import webdriver
from appium.options.android import UiAutomator2Options
from selenium.common import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver import WebElement
from selenium.webdriver.support.wait import WebDriverWait


# 1. 기다렸다가 클릭하는 함수 wait_Element / wait_Elements
def wait_Element(driver, xpath):
    location = xpath

    try:
        element:WebElement = WebDriverWait(driver, 5).until(
            EC.presence_of_element_located((By.XPATH, xpath))
        )
        return element

    except TimeoutException:
        print("Timeout!!!!!!!!!!!!")
        return False

def wait_Elements(driver, xpath):
    location = xpath
    wait_Element(driver, location)
    return driver.find_elements(By.XPATH, location)


# 2. appium 세팅
@pytest.fixture(scope="module")
def driver():
    capabilities = dict(
        platformName='Android',
        automationName='uiautomator2'
    )

    appium_server_url = 'http://localhost:4723'

    driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(capabilities))

    driver.press_keycode(3)

    yield driver
    driver.quit()



# 3. 테스트케이스
def test_case_01(driver):
    el = wait_Element(driver, '//android.widget.TextView[@content-desc="시계"]')
    el.click()
    assert 1;

def test_case_02(driver):
    el = wait_Element(driver, '//android.widget.TextView[@resource-id="com.sec.android.app.clockpackage:id/title" and @text="세계시각"]')
    el.click()
    assert 1;

def test_case_03(driver):
    el = wait_Element(driver, '//android.widget.TextView[@resource-id="com.sec.android.app.clockpackage:id/title" and @text="스톱워치"]')
    el.click()
    assert 1;

def test_case_04(driver):
    el = wait_Element(driver, '//android.widget.TextView[@resource-id="com.sec.android.app.clockpackage:id/title" and @text="타이머"]')
    el.click()
    assert 1;

 

#1 은 자주 쓰이는 함수로 Basic/common.py 로 분류

#2 는 자동화 세팅 영역으로 Basic/appium_setting.py 로 분류

#3 는 TC 영역으로 TestCase/test_case_01.py 로 분류

 

ㄴ Python Package 로 Basic + TestCase 생성

 

ㄴ 각 폴더 아래에 Basic/common.py , Basic/appium_setting.py , TestCase/test_case_01.py 생성

 

각각 파일에 #1, #2, #3 을 넣어준다.

 

Basic/common.py

from selenium.common import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver import WebElement
from selenium.webdriver.support.wait import WebDriverWait

# 기다렸다가 클릭하는 함수 wait_Element / wait_Elements
def wait_Element(driver, xpath):
    location = xpath

    try:
        element:WebElement = WebDriverWait(driver, 5).until(
            EC.presence_of_element_located((By.XPATH, xpath))
        )
        return element

    except TimeoutException:
        print("Timeout!!!!!!!!!!!!")
        return False

def wait_Elements(driver, xpath):
    location = xpath
    wait_Element(driver, location)
    return driver.find_elements(By.XPATH, location)

 

 

Basic/appium_setting.py

import pytest

from appium import webdriver
from appium.options.android import UiAutomator2Options

# appium 세팅
@pytest.fixture(scope="module")
def driver():
    capabilities = dict(
        platformName='Android',
        automationName='uiautomator2'
    )

    appium_server_url = 'http://localhost:4723'

    driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(capabilities))

    driver.press_keycode(3)

    yield driver
    driver.quit()

 

 

TestCase/test_case_01.py

# 테스트케이스
def test_case_01(driver):
    el = wait_Element(driver, '//android.widget.TextView[@content-desc="시계"]')
    el.click()
    assert 1;

def test_case_02(driver):
    el = wait_Element(driver, '//android.widget.TextView[@resource-id="com.sec.android.app.clockpackage:id/title" and @text="세계시각"]')
    el.click()
    assert 1;

def test_case_03(driver):
    el = wait_Element(driver, '//android.widget.TextView[@resource-id="com.sec.android.app.clockpackage:id/title" and @text="스톱워치"]')
    el.click()
    assert 1;

def test_case_04(driver):
    el = wait_Element(driver, '//android.widget.TextView[@resource-id="com.sec.android.app.clockpackage:id/title" and @text="타이머"]')
    el.click()
    assert 1;

 

 

TestCase/test_case_01.py 에서 Basic 패키지를 참조하기 위해,

 

Basic/__init__.py

from Basic.appium_setting import *
from Basic.common import *

 

파일에 위 내용을 입력해준다.

 

from Basic import *

 

이후 TestCase/test_case_01.py 상단에 입력해주자.

 

cd TestCase
pytest test_case_01.py

TestCase 로 이동 후 pytest 명령어 실행 시,

단일소스코드와 동일하게 동작됨 확인할 수있다.

 

 

댓글