UI python 中的basePage 类元素的最全的相关公共方法

本文介绍了BasePage类,一个用于封装Web自动化测试中的常见功能,如元素获取、点击、输入内容、打开浏览器以及处理异常的类,提供了一组全面的方法来支持页面操作和异常截图。
摘要由CSDN通过智能技术生成

basePages 类封装

类相关功能说明

1、获取元素功能
2、点击元素
3、输入内容
4、打开浏览器…

class BasePage():
    """
    获取元素
    点击元素
    输入内容
    """
    def __init__(self):
        # 初始化操作获取浏览器
        self.driver = Driver().get_driver()
        self.locators = read_yaml(configs_path + 'allelements.yaml')[self.__class__.__name__]
        # print(self.locators.items())
        print("当前子类的类名是——————>", self.__class__.__name__)
        for elementname, locator in self.locators.items():  # 遍历字典kv
            setattr(self, elementname, locator)  # 给self设置一个变量elementname的值是locator
        """删除前data的数据 data为int 类型"""
        self.log = MyLog().delete_log(1)
        log.info("删除超过1天的日志信息")

    def __call__(self, f):
        def inner(*args):
            try:
                return f(*args)
            except:
                curtime = strftime("%Y%m%d%H%M")
                self.driver.get_screenshot_as_file('../%s.jpg' % curtime)
                raise

        return inner

    def open_url(self, url):

        """
        :param url: 打开浏览器的URL
        :return:
        """
        self.driver.get(url)
        log.info("打开至url页面")

    def max_windows(self):
        self.driver.maximize_window()
        log.info("页面最大化")

    def take_screenshot(self):  # 保存截图
        """
        :param img_description:   图片描述 格式为 页面名称——功能名
        :return:截图并保存在根目录下的Screenshots文件夹下
        """
        curtime = strftime("%Y-%m-%d-%H-%M-%S")
        screenshots_name = screenshots_path + f'/{curtime}.png'
        try:
            self.driver.save_screenshot(screenshots_name)
        except Exception as e:
            log.exception("网页截图失败")
            log.error("错误类型:", e.__class__.__name__)
            log.error("错误类型:", e)
        else:
            log.info("截图成功,{}截图存放在:{}".format(screenshots_name, screenshots_path))

    def get_element(self, locator):
        """
        元素定位方法
        :param locator: 元素定位器
        :return:
        """
        try:
            ele = WebDriverWait(self.driver, Env.OUTTIME, Env.POLL_FREQUENCY).until(
                EC.visibility_of_element_located(locator))

        except Exception as e:
            log.info('元素定位不到')
            log.error("错误类型:", e.__class__.__name__)
            log.error("错误类型:",traceback.format_exc())
            self.take_screenshot()
            raise
        else:
            log.info("查找可见 {} 成功!".format(locator))
        return ele

    def get_elements(self, locators):
        """
       一组元素定位方法
       :param locator: 元素定位器
       :return:
        """
        try:
            return WebDriverWait(self.driver, Env.OUTTIME, Env.POLL_FREQUENCY).until(
                EC.visibility_of_all_elements_located(locators))
        except Exception as e:
            # 定位不到时,截图,打印日志
            log.info(f'{locators}元素定位不到')
            log.error("错误类型:", e.__class__.__name__)
            log.error("错误类型:",traceback.format_exc())
            log.error(traceback.format_exc())
            self.take_screenshot()

    def element_click(self, locator):
        """
        :param locator: 元素定位
        :return: 返回元素的点击操作
        """
        self.get_element(locator).click()

        log.info(f"该元素{locator}点击成功")

    def input_text(self, locator, text, clear=False):
        """
        1、进行输入内容
        2、先进行清空后输入内容
        :param locator: 要输入内容的元素
        :param text: 输入的内容
        :param clear:默认不需要进行清空,直接输入内容
        :return:
        """
        if clear == True:
            self.get_element(locator).clear()
            self.get_element(locator).send_keys(text)
        else:
            self.get_element(locator).send_keys(text)
            log.info(f"该元素{locator}输入成功")

    def get_element_text(self, locator):
        """
        获取元素的文本
        :param locator: 元素的定位器
        :return:
        """
        return self.get_element(locator).text

    def get_elements_text(self, locators):
        """
        获取元素的文本
        :param locator: 元素的定位器
        :return:
        """
        return [ele.text for ele in self.get_elements(locators)]

    def js_do(self, js):
        return self.driver.execute_script(js)

    def open(self, url, title='', timeout=10):
        u"""打开浏览器,并最大化,判断title是否为预期"""
        self.driver.get(url)
        self.driver.maximize_window()
        try:
            WebDriverWait(self.driver, timeout, 1).until(EC.title_contains(title))
        except TimeoutException:
            print("open %s title error" % url)
        except Exception as msg:
            print("Error:%s" % msg)

    def find_element(self, locator, timeout=10):
        u"""定位元素,参数locator为原则"""
        try:
            element = WebDriverWait(self.driver, timeout, 1).until(EC.presence_of_element_located(locator))
            return element
        except:
            print("%s 页面未找到元素 %s" % (self, locator))

    def find_elements(self, locator, timeout=10):
        u"""定位一组元素"""
        elements = WebDriverWait(self.driver, timeout, 1).until(EC.presence_of_all_elements_located(locator))
        return elements

    def is_text_in_element(self, text, locator, timeout=10):
        u"""判断是否定位到元素"""
        try:
            result = WebDriverWait(self.driver, timeout, 1).until(EC.text_to_be_present_in_element(locator, text))
        except TimeoutException:
            print("元素未定位到:" + str(locator))
            return False
        else:
            return result

    def is_title(self, title, timeout=10):
        u"""判断title完全相等"""
        result = WebDriverWait(self.driver, timeout, 1).until(EC.title_is(title))
        return result

    def is_title_contains(self, title, timeout=10):
        u"""判断是否包含title"""
        result = WebDriverWait(self.driver, timeout, 1).until(EC.title_contains(title))
        return result

    def is_select(self, locator, timeout=10):
        u"""判断元素是否被选中"""
        result = WebDriverWait(self.driver, timeout, 1).until(EC.element_located_to_be_selected(locator))
        return result

    def is_select_be(self, locator, timeout=10, selected=True):
        u"""判断元素的状态"""
        return WebDriverWait(self.driver, timeout, 1).until(EC.element_located_selection_state_to_be(locator, selected))

    def is_alert_present(self, timeout=10):
        u"""判断页面有无alert弹出框,有alert返回alert,无alert返回FALSE"""
        try:
            return WebDriverWait(self.driver, timeout, 1).until(EC.alert_is_present())
        except:
            print("No Alert Present")

    def is_visibility(self, locator, timeout=10):
        u"""判断元素是否可见,可见返回本身,不可见返回FALSE"""
        return WebDriverWait(self.driver, timeout, 1).until(EC.visibility_of_element_located(locator))

    def is_invisibility(self, locator, timeout=10):
        u"""判断元素是否可见,不可见,未找到元素返回True"""
        return WebDriverWait(self.driver, timeout, 1).until(EC.invisibility_of_element_located(locator))

    def is_clickable(self, locator, timeout=10):
        u"""判断元素是否可以点击,可以点击返回本身,不可点击返回FALSE"""
        return WebDriverWait(self.driver, timeout, 1).until(EC.element_to_be_clickable(locator))

    def is_located(self, locator, timeout=10):
        u"""判断元素是否定位到(元素不一定是可见),如果定位到返回Element,未定位到返回FALSE"""
        return WebDriverWait(self.driver, timeout, 1).until(EC.presence_of_element_located(locator))

    def move_is_element(self, locator):
        u"""鼠标悬停操作"""
        element = self.find_element(locator)
        ActionChains(self.driver).move_to_element(element).perform()

    def back(self):
        u"""返回到旧的窗口"""
        self.driver.back()

    def forward(self):
        u"""前进到新窗口"""
        self.driver.forward()

    def close(self):
        u"""关闭窗口"""
        self.driver.close()

    def quit(self):
        u"""关闭driver和所有窗口"""
        self.driver.quit()

    def get_title(self):
        u"""获取当前窗口的title"""
        return self.driver.title

    def get_current_url(self):
        u"""获取当前页面url"""
        return self.driver.current_url

    def get_text(self, locator):
        u"""获取文本内容"""
        return self.find_element(locator).text

    def get_browser_log_level(self):
        u"""获取浏览器错误日志级别"""
        lists = self.driver.get_log('browser')
        list_value = []
        if lists.__len__() != 0:
            for dicts in lists:
                for key, value in dicts.items():
                    list_value.append(value)
        if 'SEVERE' in list_value:
            return "SEVERE"
        elif 'WARNING' in list_value:
            return "WARNING"
        return "SUCCESS"

    def get_attribute(self, locator, name):
        u"""获取属性"""
        return self.find_element(locator).get_attribute(name)

    def get_screen_as_file(self, func):
        """异常自动截图"""

        def inner(*args, **kwargs):
            try:
                func(*args, **kwargs)
            except:
                self.screen()
                raise

        return inner

    def screen(self):
        u"""浏览器页面截图"""
        nowtime = time.strftime("%Y_%m_%d_%H_%M_%S")
        self.driver.get_screenshot_as_file("%s.png" % nowtime)

    def js_input_text(self, locator, value):
        """
        :param js:
        :param locator:元素定位方法
        :param value:输入的值
        :return:
        """
        js = 'arguements[0].value=arguements[1]'
        return self.driver.execute_script(js, locator, value)

    def js_fours_element(self, locator):
        u"""聚焦元素"""
        element = self.find_element(locator)
        self.driver.execute_script("arguments[0].scrollIntoView();", element)

    def js_scroll_top(self):
        u"""滑动到页面顶部"""
        js = "window.scrollTo(0,0)"
        self.driver.execute_script(js)

    def js_scroll_end(self):
        u"""滑动到页面底部"""
        js = "window.scrollTo(0, document.body.scrollHeight)"
        self.driver.execute_script(js)

    def select_by_index(self, locator, index):
        u"""通过所有index,0开始,定位元素"""
        element = self.find_element(locator)
        Select(element).select_by_index(index)

    def select_by_value(self, locator, value):
        u"""通过value定位元素"""
        element = self.find_element(locator)
        Select(element).select_by_value(value)

    def select_by_text(self, locator, text):
        u"""通过text定位元素"""
        element = self.find_element(locator)
        Select(element).select_by_visible_text(text)
以下是使用 Python Playwright 对 CSDN 登录进行 UI 自动化分层设计的最完善示例: 1. 确定测试范围和目标 在开始编写 UI 自动化测试之前,需要先确定测试的范围和目标。在本例,我们的测试目标是验证 CSDN 登录功能是否正常,并确保用户可以成功登录。因此,我们需要编写测试用例来模拟用户登录操作,并验证登录成功后是否可以正常访问 CSDN 的其他页面。 2. 安装 Playwright 首先需要安装 Playwright Python 库,可以使用以下命令进行安装: ```python pip install playwright ``` 3. 创建项目目录结构 在本地创建一个项目目录,例如 "CSDN_Automation",并在该目录下创建以下文件和文件夹: - `main.py`:主程序文件 - `pages` 文件夹:存放页面对象文件 - `tests` 文件夹:存放测试用例文件 4. 创建页面对象 在 `pages` 文件夹下创建一个 `BasePage.py` 文件,该文件定义了所有页面对象的基,用于封装一些公用的方法和属性: ```python from playwright.sync_api import Page class BasePage: def __init__(self, page: Page): self.page = page def navigate(self, url: str): self.page.goto(url) def get_title(self) -> str: return self.page.title() def get_url(self) -> str: return self.page.url() def close(self): self.page.close() ``` 在该基,我们定义了一些公用的方法和属性,包括页面导航、获取页面标题和 URL、关闭页面等。 在 `pages` 文件夹下创建一个 `LoginPage.py` 文件,该文件定义了 CSDN 登录页面的所有元素和操作: ```python from playwright.sync_api import Page from .BasePage import BasePage class LoginPage(BasePage): def __init__(self, page: Page): super().__init__(page) def input_username(self, username: str): self.page.fill("[name='username']", username) def input_password(self, password: str): self.page.fill("[name='password']", password) def click_login_button(self): self.page.click("[data-type='account']") def login(self, username: str, password: str): self.navigate("https://passport.csdn.net/login") self.input_username(username) self.input_password(password) self.click_login_button() ``` 在该页面对象,我们继承了 `BasePage` 基,并定义了 CSDN 登录页面的所有元素和操作,包括输入用户名和密码、点击登录按钮等。通过这样的封装,我们可以在测试用例直接调用 `login` 方法来完成登录操作。 5. 创建测试用例 在 `tests` 文件夹下创建一个 `test_login.py` 文件,该文件定义了 CSDN 登录的测试用例: ```python import pytest from playwright.sync_api import Playwright, Page from pages.LoginPage import LoginPage @pytest.fixture(scope="module") def csdn_login_page(playwright: Playwright) -> Page: with playwright.chromium.launch(headless=False) as browser: with browser.new_context() as context: page = context.new_page() csdn_login_page = LoginPage(page) yield csdn_login_page def test_login_success(csdn_login_page: LoginPage): csdn_login_page.login("your username", "your password") assert "CSDN" in csdn_login_page.get_title() ``` 在该测试用例,我们首先使用 `pytest.fixture` 装饰器定义了一个 `csdn_login_page` 的 fixture,用于创建 `LoginPage` 实例并返回该实例的 `page` 对象。在 `test_login_success` 测试用例,我们调用 `csdn_login_page` 实例的 `login` 方法来完成登录操作,并通过断言验证登录成功后页面标题是否包含 "CSDN"。 6. 运行测试 最后,在项目目录下运行以下命令来执行测试: ```python python -m pytest ``` 这样就完成了基于 Python Playwright 的 CSDN 登录 UI 自动化分层设计的示例。在实际应用,我们可以根据需要增加更多的页面对象和测试用例,从而实现更全面的 UI 自动化测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值