Python & Selenium, UI 자동화 테스트 의 PO 디자인 모델 - QQ 메 일 예

대상 지향 특성: 패키지, 계승, 다 중.자동화 에 도 똑 같이 적용 된다. Selenium 자동화 테스트 에서 PageObject (사상 은 대상 을 대상 으로 하 는 특성 과 같다) 라 는 이름 이 자주 언급 되 는데 PO 모델 을 통 해 테스트 사례 의 유지 효율 을 크게 향상 시 킬 수 있다.
\ # \ # 전통 테스트 스 크 립 트 의 폐단
테스트 스 크 립 트 분리, 유지 보수 비용 이 높 고 확장 성 이 떨 어 지 는 재 활용 성 이 낮 음 등 PageObject 디자인 모델 selenium 자동화 테스트 프레임 워 크 의 PO 디자인 모델
PO 의 핵심 요소:
PO 모드 에서 BasePage 류 로 추상 적 으로 봉 인 됩 니 다. 이 기본 클래스 는 webdriver 인 스 턴 스 만 실현 하 는 속성 을 가 져 야 합 니 다.모든 페이지 는 BasePage 를 계승 하고 driver 를 통 해 이 페이지 의 요 소 를 관리 하 며 page 의 조작 을 하나씩 밀봉 하 는 방법 입 니 다.TestCase 는 unittest. Testcase 류 를 계승 하고 page 류 에 의존 하여 해당 하 는 테스트 절 차 를 실현 합 니 다.
사례 기초 사례 앞의 기초 장면 에서 선택 한 것 은 QQ 메 일 박스, 편지 쓰기 작업 입 니 다!
공공 방법 류 - 공용 을 봉인 하 는 조작 방법
class DriverUtil(object):
"""        """

_driver = None

#         
_auto_quit = True

@classmethod
def get_driver(cls):
    """         """
    if cls._driver is None:
        #         
        cls._driver = webdriver.Chrome()
        #        
        cls._driver.maximize_window()
        #       
        cls._driver.implicitly_wait(10)
        #     
        cls._driver.get('https://mail.qq.com/')
    return cls._driver

@classmethod
def quit_driver(cls):
    """         """
    if cls._auto_quit and cls._driver:
        cls._driver.quit()
        cls._driver = None

@classmethod
def auto_quit(cls, auto_quit):
    """         """
    cls._auto_quit = auto_quit

분석 하 다.
가 져 온 드라이버 대상 을 하나의 클래스 에 밀봉 하고 사용 할 때 현재 파일 을 호출 하면 됩 니 다.
페이지 요소 속성 클래스 - 사용 할 모든 요 소 를 액세스 합 니 다.
from selenium.webdriver.common.by import By


class UIElements:
"""        """

"""qq      """

Account_password_login_btn = (By.ID, 'switcher_plogin')  #         

input_user_name = (By.ID, 'u')  #      

input_password = (By.ID, 'p')  #      

login_button = (By.ID, 'login_button')  #     

"""qq    """

write_a_letter_btn = (By.XPATH, '//*[@id="composebtn"]')  #     

inbox_btn = (By.ID, 'folder_1')  #      

"""    """

Recipient_input_box = (By.XPATH, "//*[@id='toAreaCtrl']/div[2]/input")  #       

Subject_input_box = (By.ID, 'subject')  #      

text_input = (By.XPATH, '/html/body')  #      

send_btn = (By.XPATH, '//*[@id="toolbar"]/div/a[1]')  #     

Return_homepage = (By.ID, 'btnbackl')  #         

"""     """

apple_email = (
    By.XPATH, '//*[@id="div_showlastweek"]/table[1]/tbody/tr/td[3]/table/tbody/tr/td[1]/nobr/span')  #     
user_email = (
    By.XPATH, '//*[@id="mailContentContainer"]/table/tbody/tr/td/div[1]/table/tbody/tr[4]/td/table/tbody/tr[1]/td/table/tbody/tr[1]/td[1]/a') #       

분석 하 다.
모든 페이지 에 필요 한 요소 포 지 셔 닝 속성 은 함께 놓 으 면 관리 하기 편리 합 니 다. 사용 할 때 이 를 호출 하면 됩 니 다. 예 를 들 어 페이지 요소 의 수정 과 이 페이지 요소 의 속성 값 만 수정 하면 됩 니 다.
Base 작업 클래스 - 패키지 주요 작업 방법
from utils import DriverUtil


class Base(object):
"""page   """

def __init__(self):
    self.driver = DriverUtil.get_driver()

def get_element(self, loc):
    """
          (           )
    :param loc:               
    :return:     
    """
    return self.driver.find_element(*loc)

def get_elements(self, loc):
    """
          
    :param loc: (By.ID,id   ) (By.CLASS_NAME,class   ) (By.XPATH,xpath   )
    :return:        
    """
    return self.driver.find_elements(*loc)

def click_element(self, loc):
    """
        
    :param loc: (By.ID,id   ) (By.CLASS_NAME,class   ) (By.XPATH,xpath   )
    :return:
    """
    self.get_element(loc).click()

def send_element(self, loc, text):
    """
          
    :param loc: (By.ID,id   ) (By.CLASS_NAME,class   ) (By.XPATH,xpath   )
    :param text:       
    :return:
    """
    #     
    input_text = self.get_element(loc)
    #      
    input_text.clear()
    #     
    input_text.send_keys(text)

def get_text_information(self, loc):
    """
               
    :param loc: (By.ID,id   ) (By.CLASS_NAME,class   ) (By.XPATH,xpath   )
    :return:
    """
    return self.get_element(loc).text

분석 하 다.
이 는 이벤트 방법 을 조작 하기 위해 기 존의 클릭, 입력, 변경 요소 의 텍스트 정 보 를 얻 고 자신 과 결합 하여 사용 할 수 있 으 며 여러 가지 방법 을 자발적으로 추가 할 수 있 습 니 다.(사용 방법 이 필요 할 때 이런 것 을 호출 하면 됩 니 다)
page 클래스 - 페이지 의 모든 작업 을 실현 합 니 다.
"""qq      """
from base.base import Base
from page.UIElements import UIElements
import json
import config
import logging

class EmailLoginPage(Base):

def __init__(self):
    super().__init__()

def account_password_login(self):
    """        """
    self.click_element(UIElements.Account_password_login_btn)

def input_username(self, username):
    """     """
    self.send_element(UIElements.input_user_name, username)

def input_password(self, pwd):
    """    """
    self.send_element(UIElements.input_password, pwd)

def click_login_btn(self):
    """      """
    self.click_element(UIElements.login_button)

분석 하 다.
페이지 클래스, 각 페이지 를 나 누 어 각 페이지 에 조작 할 방법 을 기록 하고 페이지 에 따라 나 눕 니 다. (여 기 는 로그 인 페이지 의 모든 조작 방법 과 절 차 를 예 로 들 수 있 습 니 다)
스 크 립 트 클래스 - 페이지 클래스 의 모든 작업 절 차 를 순서대로 실행 합 니 다.
class TestLogin(unittest.TestCase):

@classmethod
 def setUpClass(cls):
    cls.driver = DriverUtil.get_driver()  #          
    cls.email_login_page = EmailLoginPage()  #          

    cls.driver.switch_to.frame("login_frame") #         
    cls.email_login_page.account_password_login()  #           

@classmethod
def tearDownClass(cls):
    DriverUtil.quit_driver()  #      


def tearDown(self):
    time.sleep(3)


def test_login(self ):
    self.email_login_page.input_username(“aaaa”)  #      

    self.email_login_page.input_password("11111")  #     

    self.email_login_page.click_login_btn()  #     

    #     ,         
    time.sleep(2)
    #       
    title = self.driver.title

    #         
    self.assertIn("    ", title)

분석 하 다.
스 크 립 트 클래스, 위 페이지 를 실행 하 는 방법, 스 크 립 트 를 실행 합 니 다.
테스트 사례 testcase 의 코드 를 작성 할 때 주로 테스트 사례 로 실 행 된 기능 입 니 다. 장면 에 따라 모든 사례 를 작성 할 수 있 고 전에 말 한 데이터 분리 구동 테스트 데 이 터 를 실현 할 수 있 습 니 다.다양한 읽 기와 호출 을 할 수 있 습 니 다. 유 니 티 스 트 프레임 워 크 를 통 해 테스트 사례 를 계승 합 니 다. TestCase 뒤에 HTML TestRunner 를 사용 하여 테스트 보고 서 를 생 성 합 니 다. 메 일 발송 및 PO 디자인 모델 의 테스트 프레임 워 크 - - - - - -

좋은 웹페이지 즐겨찾기