1. 程式人生 > 其它 >ui自動化框架

ui自動化框架

技術標籤:ui自動化

from selenium import webdriver
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def get_driver(drivername="chrome"):
    if drivername == "chrome":
        # user_data_dir = r"--user-data-dir=C:\Users\01397622\AppData\Local\Google\Chrome\User Data"
        # options = webdriver.ChromeOptions()
        # options.add_argument(user_data_dir)
        # driver = webdriver.Chrome(options=options)
        driver = webdriver.Chrome()
    elif drivername == "firefox":
        driver = webdriver.Firefox()
    elif drivername == "ie":
        driver = webdriver.Ie()
    else:
        driver = None
    return driver


class Base:
    def __init__(self, driver):
        self.driver = driver

    def get_url(self, url):
        self.driver.get(url)
        self.driver.maximize_window()
        sleep(2)

    def close(self):
        sleep(2)
        self.driver.quit()

    def refresh(self):
        self.driver.refresh()

    def back(self):
        self.driver.back()

    def forward(self):
        self.driver.forward()

    def get_element(self, locator, timeout=20):
        try:
            element = WebDriverWait(self.driver, timeout).until(EC.presence_of_element_located(locator))
        except Exception as e:
            print(e)
            element = None
        return element

    def get_elements(self, locator, timeout=10):
        try:
            elements = WebDriverWait(self.driver, timeout).until(EC.presence_of_all_elements_located(locator))
        except Exception as e:
            print(e)
            elements = None
        return elements

    def is_text_in_element(self, locator, text, timeout=20):
        try:
            if WebDriverWait(self.driver, timeout).until(EC.text_to_be_present_in_element(locator, text)):
                return True
            else:
                return False
        except Exception as e:
            print(e)
            return False

    def is_value_in_element(self, locator, value, timeout=10):
        try:
            if WebDriverWait(self.driver, timeout).until(EC.text_to_be_present_in_element_value(locator, value)):
                return True
            else:
                return False
        except Exception as e:
            print(e)
            return False

    def click(self, locator):
        try:
            self.get_element(locator).click()
            sleep(3)
        except Exception as e:
            print(e)

    def clear(self, locator):
        try:
            self.get_element(locator).clear()
        except Exception as e:
            print(e)

    def send_keys(self, locator, text):
        try:
            self.clear(locator)
            self.get_element(locator).send_keys(text)
            sleep(2)
        except Exception as e:
            print(e)

    def click_checkBox(self, locator):
        try:
            element = self.get_element(locator)
            if element.is_selected():
                pass
            else:
                self.click(locator)
        except Exception as e:
            print(e)

    def quit(self):
        self.driver.quit()


if __name__ == '__main__':
    driver = get_driver("chrome")
    base = Base(driver)
    base.get_url(r"C:\Users\01397622\PycharmProjects\Selenium-study\練習頁面\註冊A.html")  # r轉義
    userA_loc = ("id", "userA")
    telA_loc = ("id", "telA")
    apple_loc = ("id", "pga")
    base.send_keys(userA_loc, "lm")
    base.send_keys(telA_loc, "110")
    base.click_checkBox(apple_loc)
    base.close()
from common.base import Base
from common.base import get_driver

page_url = "https://www.baidu.com/"


class Page(Base):
    login_loc = ("link text", "登入")
    usernamelogin_loc = ("css selector", "#TANGRAM__PSP_11__footerULoginBtn")
    username_loc = ("name", "userName")
    password_loc = ("name", "password")
    submit_loc = ("id", "TANGRAM__PSP_11__submit")
    success_username_loc = ("css selector", "#s-top-username > span.user-name.c-font-normal.c-color-t")

    def get(self):
        self.get_url(page_url)

    def click_login(self):
        self.click(self.login_loc)

    def click_usernamelogin(self):
        self.click(self.usernamelogin_loc)

    def input_username(self, text):
        self.send_keys(self.username_loc, text)

    def input_password(self, text):
        self.send_keys(self.password_loc, text)

    def click_submit(self):
        self.click(self.submit_loc)

    def judge_success(self, name):
        if self.is_text_in_element(self.success_username_loc, name):
            return True
        else:
            return False


if __name__ == '__main__':
    driver = get_driver("chrome")
    p = Page(driver)
    p.get()
    p.click_login()
    p.click_usernamelogin()
    p.input_username("13065175265")
    p.input_password("lm18379695606")
    p.click_submit()
    p.judge_success()
from common.base import get_driver
from page.page import Page
import unittest
import ddt

data = [{"username": "13065175265", "password": "lm18379695606","judgename":"妮可Alex", "expect": True},
        {"username": "18866665555", "password": "lm18379695606", "judgename":"妮可Bob","expect": False}
        ]
"""
ddt資料驅動  測試資料單獨操作
"""
# data的這部分測試資料可以放一個excel表格中儲存,python的xlrd庫可以操作 #
@ddt.ddt
class Test_login(unittest.TestCase):
    def setUp(self):
        self.driver = get_driver()
        self.p = Page(self.driver)
        self.p.get()

    def tearDown(self):
        self.p.close()

    @ddt.data(*data)
    def test_login(self, data):
        """百度登入引數化"""
        self.p.click_login()
        self.p.click_usernamelogin()
        self.p.input_username(data['username'])
        self.p.input_password(data['password'])
        self.p.click_submit()
        result = self.p.judge_success(data['judgename'])
        self.assertEqual(data['expect'], result, msg="預期不一致,登入失敗")


if __name__ == '__main__':
    unittest.main(verbosity=2)
"""
  引數化  斷言 操作
  unittest 中自己寫引數化還是挺麻煩的,跟 pytest 的 pytest.mark.parametrize 比差太多。
有兩個輔助的庫,專門解決 unittest 的引數化問題:ddt 和 parameterized。
  """
"""
pip install BeautifulReport -i https://pypi.tuna.tsinghua.edu.cn/simple/
必須是run**.py檔案


"""
import unittest   #單元測試模組
from script.script import Test_login
from BeautifulReport import BeautifulReport   #匯入BeautifulReport模組,這個模組也是生成報告的模組,但是比HTMLTestRunner模板好看

suite = unittest.TestSuite()  # 定義一個測試集合
suite.addTest(unittest.makeSuite(Test_login))  # 把寫的用例加進來(將Test_login類)加進來
run = BeautifulReport(suite) # 例項化BeautifulReport模組
run.report(filename='report',description='百度登入自動化報告',report_dir='report')  # (報告名稱 , 報告描述) :必填項
# 報告存放路徑:report目錄與run_case.py檔案同級 , 故不能../report,直接report
# report和/report 是不同的地址

"""
F.  # 一個成功,一個失敗
測試已全部完成, 可開啟 C:\\Users\01397622\PycharmProjects\Selenium-study\SF-tech\report.html 檢視報告
"""