''' -*- coding: utf-8 -*-
@Time : 2019/6/10 0010 10:39
@Author : 无邪
@File : test_data.py
@Software: PyCharm'''
'''测试用例'''
data_error=[{"tel":"","pwd":"1","expected":"手机号码或密码不能为空"},
            {"tel":"1","pwd":"1","expected":"手机号码格式不正确"},
            {"tel":"18438662004","pwd":"1","expected":"密码格式不正确"},
            {"tel":"18438662004","pwd":"123456","expected":"错误的账号信息"},
            {"tel":"18258148335","pwd":"","expected":"手机号码或密码不能为空"},
            {"tel":"","pwd":"","expected":"手机号码或密码不能为空"}
           ]
data_right=[ {"tel":"18258148335","pwd":"148335","expected":"无邪妖君"}]

  

 
-----------------------------------------------------------------------------------------------
''' -*- coding: utf-8 -*-
@Time : 2019/6/10 0010 9:37
@Author : 无邪
@File : base.py
@Software: PyCharm'''
from appium.webdriver import Remote
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.remote.webelement import WebElement
'''这是一个基础信息存放类'''
class Base:
    def __init__(self):
        caps={
            "platformName": "Android",  # 平台名称
            "platformVersion": "5.1.1",  # 系统版本
            "deviceName": "127.0.0.1:62001",  # 设备名称
            'automationName':'uiautomator2',#定位toast必须配置uiautomator2
            # "app":"D:\Future-release-2018.apk",
            "appActivity": ".activity.MainActivity",
            "appPackage": "com.lemon.lemonban"  # 包名
        }
        self.driver=Remote('http://127.0.0.1:4723/wd/hub',caps)
        # return self.driver
    def wait_element(self,located)->WebElement:
        w=WebDriverWait(driver=self.driver,timeout=6)
        return w.until(ec.presence_of_element_located(located))
    def wait_one(self,located)->WebElement:
        """定位tost"""
        w=WebDriverWait(driver=self.driver,timeout=8,poll_frequency=0.01)#默认是0.5秒
        return w.until(ec.presence_of_element_located(located))#located传进来是个元组

  

''' -*- coding: utf-8 -*-
@Time : 2019/6/10 0010 9:35
@Author : 无邪
@File : login.py
@Software: PyCharm'''
# from selenium.webdriver.common.by import By
import time
from appium.webdriver.common.mobileby import MobileBy as By
from  page.base import Base
class Login(Base):
    """登录界面元素定位"""
    login1=(By.ID,"com.lemon.lemonban:id/fragment_my_lemon_avatar_layout")#点击头像
    tel=(By.ID,"com.lemon.lemonban:id/et_mobile")#手机号码输入框
    password=(By.ID,"com.lemon.lemonban:id/et_password")#密码输入框
    login_buttons=(By.ID,"com.lemon.lemonban:id/btn_login")#登录按钮
    button33 = (By.ID, "com.lemon.lemonban:id/navigation_my")#我的柠檬

    def image_login(self):
        """定位点击头像登录"""
        self.button3()#点击我的柠檬
        time.sleep(2)
        self.wait_element(self.login1).click()#点击头像登录
    def phone(self):
        """定位手机号码输入框"""
        return self.wait_element(self.tel)

    def pwd(self):
        """定位密码输入框"""
        return self.wait_element(self.password)

    def login_button(self):
        """点击登陆按钮"""
        self.wait_element(self.login_buttons).click()

    def start_login(self,call,passwd):
        """输入登录信息进行登录"""
        self.phone().send_keys(call)
        self.pwd().send_keys(passwd)

    def button3(self):
        """定位我的柠檬"""
        return self.wait_element(self.button33).click()

    def hint(self,t):
        """定位toast"""
        if  self.wait_one((By.XPATH, "//*[contains(@text,'{}')]".format(t))):
            return self.wait_one((By.XPATH, "//*[contains(@text,'{}')]".format(t))).text
        else:
            return "定位失败"

  

---------------------------------------------------------------------------------------------------------
''' -*- coding: utf-8 -*-
@Time : 2019/6/10 0010 11:13
@Author : 无邪
@File : test_login.py
@Software: PyCharm'''
from page.login import Login
from data.test_data import data_error,data_right
import pytest
import time
class TestLogin:
    """测试登陆"""
    logins = Login()
    time.sleep(2)
    logins.image_login()

    @pytest.mark.wrong
    @pytest.mark.parametrize("data",data_error)
    def test_error_login(self,data):
        """反向用例登陆"""
        self.logins.start_login(data["tel"],data["pwd"])
        time.sleep(2)
        self.logins.login_button()
        # fact_result=self.logins.hint()#实际结果
        fact_result = self.logins.hint(data["expected"])
        print(fact_result)
        try:
            assert (fact_result==data["expected"])
            print("用例比对通过,实际结果{}与预期结果{}一致".format(fact_result, data["expected"]))
        except AssertionError as e:
            print("用例比对失败,实际结果{}与预期结果{}不符".format(fact_result,data["expected"]))
            raise e
    @pytest.mark.parametrize("data",data_right)
    @pytest.mark.right
    def test_right_login(self,data):
        self.logins.start_login(data["tel"],data["pwd"])
        self.logins.login_button()

  

执行结果:

E:\lemon>pytest -m wrong -s
====================================================================== test session starts ======================================================================
platform win32 -- Python 3.6.3, pytest-4.5.0, py-1.8.0, pluggy-0.11.0
rootdir: E:\lemon
plugins: metadata-1.8.0, html-1.20.0, allure-pytest-2.6.3
collected 7 items / 1 deselected / 6 selected

test_login.py 手机号码或密码不能为空
用例比对通过,实际结果手机号码或密码不能为空与预期结果手机号码或密码不能为空一致
.手机号码格式不正确
用例比对通过,实际结果手机号码格式不正确与预期结果手机号码格式不正确一致
.密码格式不正确
用例比对通过,实际结果密码格式不正确与预期结果密码格式不正确一致
.错误的账号信息
用例比对通过,实际结果错误的账号信息与预期结果错误的账号信息一致
.手机号码或密码不能为空
用例比对通过,实际结果手机号码或密码不能为空与预期结果手机号码或密码不能为空一致
.手机号码或密码不能为空
用例比对通过,实际结果手机号码或密码不能为空与预期结果手机号码或密码不能为空一致
.

我的app自动化实战练习一的更多相关文章

  1. 基于UiAutomator2+PageObject模式开展APP自动化测试实战

    前言 在上一篇<APP自动化测试框架-UiAutomator2基础>中,重点介绍了uiautomator2的项目组成.运行原理.环境搭建及元素定位等基础入门知识,本篇将介绍如何基于uiau ...

  2. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

  3. 关于《精通移动App测试实战:技术、工具和案例》图书勘误信息

    首先,对由于我们工作的疏忽向<精通移动App测试实战:技术.工具和案例>读者朋友们表示歉意,同时已将这些问题反馈给了出版社编辑同志,再版时将会统一修正: 其次,勘误信息请参看附件pdf文档 ...

  4. Selenium2学习-035-WebUI自动化实战实例-033-页面快照截图应用之三 -- 区域截图(专业版)

    之前有写过两篇博文讲述了 WebUI 自动化测试脚本中常用的截图方法,敬请参阅如下所示链接: 浏览器显示区域截图 浏览器指定区域截图 那么当需要截取的区域不在浏览器显示窗口范围之内时,之前的方法显然无 ...

  5. Selenium2学习-027-WebUI自动化实战实例-025-JavaScript 在 Selenium 自动化中的应用实例之三(页面滚屏,模拟鼠标拖动滚动条)

    日常的 Web UI 自动化测试过程中,get 或 navigate 到指定的页面后,若想截图的元素或者指定区域范围不在浏览器的显示区域内,则通过截屏则无法获取相应的信息,反而浪费了无畏的图片服务器资 ...

  6. Selenium2学习-018-WebUI自动化实战实例-016-自动化脚本编写过程中的登录验证码问题

    日常的 Web 网站开发的过程中,为提升登录安全或防止用户通过脚本进行黄牛操作(宇宙最贵铁皮天朝魔都的机动车牌照竞拍中),很多网站在登录的时候,添加了验证码验证,而且验证码的实现越来越复杂,对其进行脚 ...

  7. Selenium2学习-016-WebUI自动化实战实例-014-Selenium 窗口选择

    在日常的 WebUI 自动化测试脚本编写过程中,经常需要打开新的页面,或者在多个打开的页面之间进行切换,以对页面元素进行相应的操作,以模拟用户的行为,实现 UI 的自动化测试.在过往的时间中,经常有初 ...

  8. Selenium2学习-014-WebUI自动化实战实例-012-Selenium 操作下拉列表实例-div+{js|jquery}

    之前已经讲过了 Selenium 操作 Select 实现的下拉列表:Selenium2学习-010-WebUI自动化实战实例-008-Selenium 操作下拉列表实例-Select,但是在实际的日 ...

  9. Selenium2学习-010-WebUI自动化实战实例-008-Selenium 操作下拉列表实例-Select

    此文主要讲述用 Java 编写 Selenium 自动化测试脚本编写过程中,对下拉列表框 Select 的操作. 下拉列表是 Web UI 自动化测试过程中使用率非常高的,通常有两种形式的下拉列表,一 ...

随机推荐

  1. 安装ubuntu gnome 16.04后的一些操作

    好吧...其实安装了挺久了,记录一下以防忘记... 1.软件 chrome浏览器 唔..自己去官网下吧.. gnome tweak tool 不用多说,必备 sudo apt-get install  ...

  2. 打印斐波那契(Fibonacci)数列

    需求:打印 Fibonacci数列 思路: 当前项的值等于前两项数值的和 F=(F-1)+F(F-2) 样例: 输入:10 输出:1 1 2 3 5 8 13 21 34 55 辗转相加法实现 #in ...

  3. 各浏览器的userAgent对照表

    IE  Mozilla/4.0 (compatible; MSIE 8.0; Windows NT6.0) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT5 ...

  4. 标准WPS框架下的空间信息处理服务部署方法

    笔者第一篇博客里面曾介绍过将专题图制作功能发布为WPS,但随着后面的研究,才发现那时候发布的不是真正WPS框架下的服务,而只是通过Servlet将其发布为可调用的网络服务,所以今天再具体介绍一下真正的 ...

  5. BestCoder Round #74 (div.1) 1002Shortest Path(hdoj5636)

    哈哈哈哈,我就知道这道题目再扔给我,我还是不会,就是这么菜,哈哈哈 一开始官方题解就没搞懂-然后就看了一下别人的代码,水水过就算了.今天拿到-GG: 题意: 一开始,有一张原图,有一条长度为n的链. ...

  6. USACO Training 3.3 商店购物 By cellur925

    题目传送门 这道题有着浓浓的背包气氛.所以我们可以这样想:可以把每个优惠方案都当做一个物品,每个单买所需要花的钱也当做一个物品.(也就是代码中的p结构体数组)而且基于此题的环境,这题是一个完全背包.另 ...

  7. SOA架构设计和相关案例分析

    一.SOA概念 1.定义: SOA,是一个组件模型,面向服务的体系架构,它将应用程序的不同服务通过这些服务之间定义良好的接口和契约联系起来,不涉及底层编程接口和通讯模型.服务层是SOA的基础,可以直接 ...

  8. JSP | 基础 | JSP行为 | incline && forward

    语法 描述 jsp:include 用于在当前页面中包含静态或动态资源 jsp:forward 从一个JSP文件向另一个文件传递一个包含用户请求的request对象 index.jsp <%@ ...

  9. Appium安装说明

    1.安装Appium前,需要先安装node.js .node.js官方网站:https://nodejs.org/, 这里我以Windows 10为例进行安装,选择Windows installer( ...

  10. Qt容器类之二:迭代器

    一.介绍 遍历一个容器可以使用迭代器(iterators)来完成,迭代器提供了一个统一的方法来访问容器中的项目.Qt的容器类提供了两种类型的迭代器:Java风格迭代器和STL风格迭代器.如果只是想按顺 ...