python+appium(4)

conftest进阶使用

思路:我们平时导包多,而且经常使用某一段代码,一般我们使用封装的思想进行优化,pytest中conftest模块提供了更高效的方法

你可以添加任何想一次性封装的代码,这里吧代码变成变量,需要使用的时候就在函数中声明调用即可

在这里插入图片描述
conftest.py

import pytest
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.support import expected_conditions


# 构建上下文承接的内存对象,去接收 driver
class Context:
    pass


@pytest.fixture
def assert_data():
    def _assert(data, target):
        if data["type"] == "not in":
            assert data["value"] not in target
        if data["type"] == "equal":
            assert data["value"] in target
        if data["type"] == "in":
            for i in target:
                assert data["value"] in i

    return _assert


@pytest.fixture
def driver():
    url = 'http://127.0.0.1:4732/wd/hub'
    caps = {
    
    }
    caps['paltfromName'] = 'Android'
    caps['platformVersion'] = '10'
    caps['deviceName'] = 'MI_PAD_4'
    caps['appPackage'] = 'com.flychord.altas.masterpiano.test'
    caps['appActivity'] = 'com.flychord.piano.module_home.InitializePageActivity'
    caps['noReset'] = True
    setattr(Context, "driver", driver)
    _driver = webdriver.Remote(url, caps)
    return _driver


@pytest.fixture
def by():
    return MobileBy


@pytest.fixture
def wait():
    _driver = getattr(Context, "driver")
    _wait = WebDriverWait(_driver, 10)
    return _wait


@pytest.fixture
def ec():
    return expected_conditions


test01.py

import pytest

@pytest.mark.parametrize("data", [
    {
    
    "data": "测试数据", "assert": {
    
    "type": "not in", "value": "测试数据"}},
    {
    
    "data": "一二三", "assert": {
    
    "type": "equal", "value": "一二三"}},
    {
    
    "data": "四五六", "assert": {
    
    "type": "in", "value": "四五六"}}
])
def test_04(assert_data, by, wait, ec, data):
    elements = wait.until(ec.visibility_of_element_located((by.ID, 'com.zhao.myreader:id/tv_book_name')))
    elements_text = [i.text for i in elements if elements]
    assert_data(data["assert"], elements_text)

yield

一个函数的返回使用yield关键字进行返回,此时这个函数就称之为一个生成器,这个函数的调用就称之为迭代器,是一个可迭代对象

def yield_keys():
    yield 121
    print('**************')

print(yield_keys())

打印

<generator object yield_keys at 0x00000299F8DC4270>

python中有三大系统,生成器、迭代器、装饰器
生成器:生成迭代对象
迭代器:属于迭代对象
所有可以经过for循环的就是迭代对象,迭代器除了可以经过for循环,还可以通过__next__()取值

在这里插入图片描述

next()无法对一个对象多次取值

在这里插入图片描述

使用for循环取值不会触发异常

在这里插入图片描述

在pytest中的使用:
conftest把函数变成一个中间变量,所有在用例中直接调用即可
在这里插入图片描述
运行逻辑:用例运行前先执行前置条件 — 执行yield返回值 — 执行用例中代码 — 执行后置处理

猜你喜欢

转载自blog.csdn.net/qq_36562656/article/details/128387128