├── ios ├── __init__.py ├── module │ ├── __init__.py │ ├── base.pyc │ ├── home.pyc │ ├── __init__.pyc │ ├── base.py │ ├── home.py │ └── login.py ├── testcase │ ├── __init__.py │ ├── __init__.pyc │ ├── test_home.py │ └── test_login.py └── __init__.pyc ├── tools ├── __init__.py ├── loggers.pyc ├── __init__.pyc └── loggers.py ├── android ├── __init__.py ├── module │ ├── find.py │ ├── mine.py │ ├── __init__.py │ ├── base.pyc │ ├── __init__.pyc │ ├── news.py │ ├── push.py │ ├── login.py │ ├── home.py │ └── base.py ├── testcase │ ├── __init__.py │ ├── test_news.py │ ├── test_login.py │ ├── test_find.py │ ├── test_push.py │ ├── test_home.py │ └── logs │ │ └── system.log └── __init__.pyc ├── myreport ├── data │ ├── categories.csv │ ├── attachments │ │ ├── aa5d69676c97f51.txt │ │ └── a1afe3d22dcb0c69.txt │ ├── categories.json │ ├── suites.csv │ ├── behaviors.csv │ ├── suites.json │ ├── packages.json │ ├── timeline.json │ ├── behaviors.json │ └── test-cases │ │ └── 531c86dbca320b6.json ├── widgets │ ├── launch.json │ ├── environment.json │ ├── executors.json │ ├── categories.json │ ├── categories-trend.json │ ├── duration-trend.json │ ├── retry-trend.json │ ├── duration.json │ ├── severity.json │ ├── status-chart.json │ ├── suites.json │ ├── history-trend.json │ ├── summary.json │ └── behaviors.json ├── favicon.ico ├── history │ ├── categories-trend.json │ ├── duration-trend.json │ ├── retry-trend.json │ ├── history-trend.json │ └── history.json ├── export │ ├── mail.html │ ├── prometheusData.txt │ └── influxDbData.txt ├── plugins │ ├── screen-diff │ │ ├── styles.css │ │ └── index.js │ ├── packages │ │ └── index.js │ └── behaviors │ │ └── index.js └── index.html ├── config.pyc ├── driver.pyc ├── 失败截图.jpeg ├── 查看元素.png ├── 测试汇总.png ├── 测试进度.png ├── keyconfig.pyc ├── __pycache__ └── conftest.cpython-27-PYTEST.pyc ├── provide └── push.item.json ├── .idea ├── encodings.xml ├── codeStyles │ ├── codeStyleConfig.xml │ └── Project.xml ├── modules.xml ├── misc.xml ├── atxdemo.iml ├── inspectionProfiles │ └── Project_Default.xml └── workspace.xml ├── .gitignore ├── yielddemo.py ├── config.py ├── run.py ├── README.MD ├── driver.py ├── failures ├── logs ├── system.log.2018-12-09 └── system.log └── conftest.py /ios/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tools/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /android/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /android/module/find.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /android/module/mine.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ios/module/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /android/module/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /android/testcase/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ios/testcase/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /myreport/data/categories.csv: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /myreport/widgets/launch.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /myreport/widgets/environment.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /myreport/widgets/executors.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /config.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/config.pyc -------------------------------------------------------------------------------- /driver.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/driver.pyc -------------------------------------------------------------------------------- /失败截图.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/失败截图.jpeg -------------------------------------------------------------------------------- /查看元素.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/查看元素.png -------------------------------------------------------------------------------- /测试汇总.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/测试汇总.png -------------------------------------------------------------------------------- /测试进度.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/测试进度.png -------------------------------------------------------------------------------- /myreport/widgets/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /keyconfig.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/keyconfig.pyc -------------------------------------------------------------------------------- /ios/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/ios/__init__.pyc -------------------------------------------------------------------------------- /tools/loggers.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/tools/loggers.pyc -------------------------------------------------------------------------------- /android/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/android/__init__.pyc -------------------------------------------------------------------------------- /ios/module/base.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/ios/module/base.pyc -------------------------------------------------------------------------------- /ios/module/home.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/ios/module/home.pyc -------------------------------------------------------------------------------- /myreport/data/attachments/aa5d69676c97f51.txt: -------------------------------------------------------------------------------- 1 | test_find.py 32 INFO 测试发现 -------------------------------------------------------------------------------- /myreport/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/myreport/favicon.ico -------------------------------------------------------------------------------- /tools/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/tools/__init__.pyc -------------------------------------------------------------------------------- /android/module/base.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/android/module/base.pyc -------------------------------------------------------------------------------- /ios/module/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/ios/module/__init__.pyc -------------------------------------------------------------------------------- /ios/testcase/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/ios/testcase/__init__.pyc -------------------------------------------------------------------------------- /android/module/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/android/module/__init__.pyc -------------------------------------------------------------------------------- /myreport/history/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { } 3 | }, { 4 | "data" : { 5 | "Product defects" : 2 6 | } 7 | } ] -------------------------------------------------------------------------------- /myreport/widgets/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { } 3 | }, { 4 | "data" : { 5 | "Product defects" : 2 6 | } 7 | } ] -------------------------------------------------------------------------------- /__pycache__/conftest.cpython-27-PYTEST.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xinxi1990/atxdemo/HEAD/__pycache__/conftest.cpython-27-PYTEST.pyc -------------------------------------------------------------------------------- /myreport/data/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "4b4757e66a1912dae1a509f688f20b0f", 3 | "name" : "categories", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /myreport/data/suites.csv: -------------------------------------------------------------------------------- 1 | "Status","Name","Duration in ms","Description" 2 | "passed","testcase.test_find.TestFind.test_find","13057","" 3 | -------------------------------------------------------------------------------- /myreport/history/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { 3 | "duration" : 13057 4 | } 5 | }, { 6 | "data" : { 7 | "duration" : 266774 8 | } 9 | } ] -------------------------------------------------------------------------------- /myreport/widgets/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { 3 | "duration" : 13057 4 | } 5 | }, { 6 | "data" : { 7 | "duration" : 266774 8 | } 9 | } ] -------------------------------------------------------------------------------- /provide/push.item.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"item":"房产"}, 3 | {"item":"二手车"}, 4 | {"item":"本地服务"}, 5 | {"item":"装修建材"}, 6 | {"item":"汽车服务"}, 7 | {"item":"家政服务"} 8 | ] -------------------------------------------------------------------------------- /myreport/data/behaviors.csv: -------------------------------------------------------------------------------- 1 | "Epic","Feature","Story","FAILED","BROKEN","PASSED","SKIPPED","UNKNOWN" 2 | "","初始化类","测试发现","0","0","1","0","0" 3 | "","测试发现","测试发现","0","0","1","0","0" 4 | -------------------------------------------------------------------------------- /myreport/history/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { 3 | "run" : 1, 4 | "retry" : 0 5 | } 6 | }, { 7 | "data" : { 8 | "run" : 14, 9 | "retry" : 0 10 | } 11 | } ] -------------------------------------------------------------------------------- /myreport/widgets/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { 3 | "run" : 1, 4 | "retry" : 0 5 | } 6 | }, { 7 | "data" : { 8 | "run" : 14, 9 | "retry" : 0 10 | } 11 | } ] -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.pyc 4 | keyconfig.py 5 | .pytest_cache 6 | logs/* 7 | .idea/* 8 | data/* 9 | reports/* 10 | screenshot/* 11 | myreportt/* 12 | -------------------------------------------------------------------------------- /myreport/export/mail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Allure Report summary mail 6 | 7 | 8 | Mail body 9 | 10 | 11 | -------------------------------------------------------------------------------- /yielddemo.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | def yt(): 5 | print "第一次打印" 6 | yield 0 7 | print("第二次打印") 8 | 9 | if __name__ == '__main__': 10 | a = yt() 11 | print next(a) 12 | print next(a) 13 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /myreport/widgets/duration.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "uid" : "531c86dbca320b6", 3 | "name" : "test_find.TestFind.test_find", 4 | "time" : { 5 | "start" : 1544459544236, 6 | "stop" : 1544459557293, 7 | "duration" : 13057 8 | }, 9 | "status" : "passed", 10 | "severity" : "normal" 11 | } ] -------------------------------------------------------------------------------- /myreport/widgets/severity.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "uid" : "531c86dbca320b6", 3 | "name" : "test_find.TestFind.test_find", 4 | "time" : { 5 | "start" : 1544459544236, 6 | "stop" : 1544459557293, 7 | "duration" : 13057 8 | }, 9 | "status" : "passed", 10 | "severity" : "normal" 11 | } ] -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /myreport/widgets/status-chart.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "uid" : "531c86dbca320b6", 3 | "name" : "test_find.TestFind.test_find", 4 | "time" : { 5 | "start" : 1544459544236, 6 | "stop" : 1544459557293, 7 | "duration" : 13057 8 | }, 9 | "status" : "passed", 10 | "severity" : "normal" 11 | } ] -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /myreport/widgets/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 1, 3 | "items" : [ { 4 | "uid" : "7d3977dcbf31acd3e26ecbe96342e45e", 5 | "name" : "testcase", 6 | "statistic" : { 7 | "failed" : 0, 8 | "broken" : 0, 9 | "skipped" : 0, 10 | "passed" : 1, 11 | "unknown" : 0, 12 | "total" : 1 13 | } 14 | } ] 15 | } -------------------------------------------------------------------------------- /myreport/data/attachments/a1afe3d22dcb0c69.txt: -------------------------------------------------------------------------------- 1 | conftest.py 27 INFO 自动化测试开始! 2 | driver.py 24 INFO a3f8ca3a 3 | driver.py 33 INFO 连接设备:a3f8ca3a 4 | conftest.py 29 INFO driver初始化 5 | base.py 53 INFO 点击元素:发现 6 | test_find.py 26 INFO 初始化首页模块 -------------------------------------------------------------------------------- /myreport/export/prometheusData.txt: -------------------------------------------------------------------------------- 1 | launch_status_failed 0 2 | launch_status_broken 0 3 | launch_status_passed 1 4 | launch_status_skipped 0 5 | launch_status_unknown 0 6 | launch_time_duration 13057 7 | launch_time_min_duration 13057 8 | launch_time_max_duration 13057 9 | launch_time_sum_duration 13057 10 | launch_retries_retries 0 11 | launch_retries_run 1 12 | -------------------------------------------------------------------------------- /myreport/history/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { 3 | "failed" : 0, 4 | "broken" : 0, 5 | "skipped" : 0, 6 | "passed" : 1, 7 | "unknown" : 0, 8 | "total" : 1 9 | } 10 | }, { 11 | "data" : { 12 | "failed" : 2, 13 | "broken" : 0, 14 | "skipped" : 0, 15 | "passed" : 12, 16 | "unknown" : 0, 17 | "total" : 14 18 | } 19 | } ] -------------------------------------------------------------------------------- /myreport/widgets/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { 3 | "failed" : 0, 4 | "broken" : 0, 5 | "skipped" : 0, 6 | "passed" : 1, 7 | "unknown" : 0, 8 | "total" : 1 9 | } 10 | }, { 11 | "data" : { 12 | "failed" : 2, 13 | "broken" : 0, 14 | "skipped" : 0, 15 | "passed" : 12, 16 | "unknown" : 0, 17 | "total" : 14 18 | } 19 | } ] -------------------------------------------------------------------------------- /myreport/widgets/summary.json: -------------------------------------------------------------------------------- 1 | { 2 | "reportName" : "Allure Report", 3 | "testRuns" : [ ], 4 | "statistic" : { 5 | "failed" : 0, 6 | "broken" : 0, 7 | "skipped" : 0, 8 | "passed" : 1, 9 | "unknown" : 0, 10 | "total" : 1 11 | }, 12 | "time" : { 13 | "start" : 1544459544236, 14 | "stop" : 1544459557293, 15 | "duration" : 13057, 16 | "minDuration" : 13057, 17 | "maxDuration" : 13057, 18 | "sumDuration" : 13057 19 | } 20 | } -------------------------------------------------------------------------------- /.idea/atxdemo.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /android/module/news.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 消息中心 8 | """ 9 | import pytest,os,subprocess 10 | from base import Base 11 | from tools.loggers import JFMlogging 12 | logger = JFMlogging().getloger() 13 | 14 | 15 | good_jobs = "精选活动" 16 | 17 | class News(Base): 18 | def __init__(self, driver): 19 | self.base = Base(driver) 20 | 21 | def news_good(self): 22 | self.base.click(good_jobs,good_jobs) 23 | -------------------------------------------------------------------------------- /myreport/plugins/screen-diff/styles.css: -------------------------------------------------------------------------------- 1 | .screen-diff__switchers { 2 | margin-bottom: 1em; 3 | } 4 | 5 | .screen-diff__switchers label + label { 6 | margin-left: 1em; 7 | } 8 | 9 | .screen-diff__overlay { 10 | position: relative; 11 | cursor: col-resize; 12 | } 13 | 14 | .screen-diff__container { 15 | overflow-x: auto; 16 | } 17 | 18 | .screen-diff__image-over { 19 | top: 0; 20 | left: 0; 21 | bottom: 0; 22 | background: #fff; 23 | position: absolute; 24 | overflow: hidden; 25 | box-shadow: 2px 0 1px -1px #aaa; 26 | } 27 | -------------------------------------------------------------------------------- /myreport/export/influxDbData.txt: -------------------------------------------------------------------------------- 1 | launch_status failed=0 1544459571000000000 2 | launch_status broken=0 1544459571000000000 3 | launch_status passed=1 1544459571000000000 4 | launch_status skipped=0 1544459571000000000 5 | launch_status unknown=0 1544459571000000000 6 | launch_time duration=13057 1544459571000000000 7 | launch_time min_duration=13057 1544459571000000000 8 | launch_time max_duration=13057 1544459571000000000 9 | launch_time sum_duration=13057 1544459571000000000 10 | launch_retries retries=0 1544459571000000000 11 | launch_retries run=1 1544459571000000000 12 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | import os 4 | 5 | pck_name="com.wuba" 6 | lanuch_activity="com.wuba.activity.launch.LaunchActivity" 7 | device_name="a3f8ca3a" 8 | wait_timeout = 15 9 | click_post_delay = 0.5 10 | lanuch_time = 3 11 | bundle_id = "com.taofang.iphone" 12 | ios_device_name="86616cbaa40e52d3f9236ec982dd6f1e933a44bd" 13 | current_path = os.path.abspath(os.path.dirname(__file__)) 14 | screenshot_folder = os.path.join(current_path,"screenshot") 15 | if not os.path.exists(screenshot_folder): 16 | os.mkdir(screenshot_folder) 17 | print "创建截图目录:{}".format(screenshot_folder) -------------------------------------------------------------------------------- /myreport/widgets/behaviors.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 2, 3 | "items" : [ { 4 | "uid" : "24e249ef1a122c78d4aa2ffcf776c293", 5 | "name" : "初始化类", 6 | "statistic" : { 7 | "failed" : 0, 8 | "broken" : 0, 9 | "skipped" : 0, 10 | "passed" : 1, 11 | "unknown" : 0, 12 | "total" : 1 13 | } 14 | }, { 15 | "uid" : "3029ffe839ca74972d760e03c243a066", 16 | "name" : "测试发现", 17 | "statistic" : { 18 | "failed" : 0, 19 | "broken" : 0, 20 | "skipped" : 0, 21 | "passed" : 1, 22 | "unknown" : 0, 23 | "total" : 1 24 | } 25 | } ] 26 | } -------------------------------------------------------------------------------- /android/module/push.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | 5 | """ 6 | @Author : xinxi 7 | @Time : 2018/12/5 18:34 8 | @describe: 测试发布 9 | """ 10 | import pytest,time,allure,sys 11 | reload(sys) 12 | sys.setdefaultencoding("utf-8") 13 | from android.module.base import Base 14 | from tools.loggers import JFMlogging 15 | logger = JFMlogging().getloger() 16 | from config import * 17 | 18 | class Push(): 19 | 20 | def __init__(self, driver): 21 | self.base = Base(driver) 22 | 23 | def push_item(self,kewords): 24 | self.base.click(kewords, kewords) 25 | self.base.back() -------------------------------------------------------------------------------- /myreport/data/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "98d3104e051c652961429bf95fa0b5d6", 3 | "name" : "suites", 4 | "children" : [ { 5 | "name" : "testcase", 6 | "children" : [ { 7 | "name" : "test_find.TestFind.test_find", 8 | "uid" : "531c86dbca320b6", 9 | "parentUid" : "7d3977dcbf31acd3e26ecbe96342e45e", 10 | "status" : "passed", 11 | "time" : { 12 | "start" : 1544459544236, 13 | "stop" : 1544459557293, 14 | "duration" : 13057 15 | }, 16 | "flaky" : false, 17 | "parameters" : [ ] 18 | } ], 19 | "uid" : "7d3977dcbf31acd3e26ecbe96342e45e" 20 | } ] 21 | } -------------------------------------------------------------------------------- /myreport/data/packages.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "83edc06c07f9ae9e47eb6dd1b683e4e2", 3 | "name" : "packages", 4 | "children" : [ { 5 | "name" : "testcase", 6 | "children" : [ { 7 | "name" : "test_find.TestFind.test_find", 8 | "uid" : "531c86dbca320b6", 9 | "parentUid" : "559e15d0a5469c40d1629e36b5ae40ea", 10 | "status" : "passed", 11 | "time" : { 12 | "start" : 1544459544236, 13 | "stop" : 1544459557293, 14 | "duration" : 13057 15 | }, 16 | "flaky" : false, 17 | "parameters" : [ ] 18 | } ], 19 | "uid" : "559e15d0a5469c40d1629e36b5ae40ea" 20 | } ] 21 | } -------------------------------------------------------------------------------- /ios/module/base.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 对元素基本操作封装 8 | """ 9 | 10 | import pytest,time,os,re,yaml,json,sys,xmltodict 11 | import allure 12 | from allure_commons._allure import attach 13 | # from allure.constants import AttachmentType 14 | from allure_commons.types import AttachmentType 15 | import subprocess,base64 16 | sys.path.append("..") 17 | reload(sys) 18 | sys.setdefaultencoding("utf-8") 19 | from tools.loggers import JFMlogging 20 | from config import * 21 | logger = JFMlogging().getloger() 22 | 23 | 24 | 25 | class Base(): 26 | 27 | def __init__(self, driver): 28 | self.d = driver 29 | 30 | 31 | -------------------------------------------------------------------------------- /ios/testcase/test_home.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 测试首页 8 | """ 9 | import pytest,time,allure,sys 10 | reload(sys) 11 | sys.setdefaultencoding("utf-8") 12 | from tools.loggers import JFMlogging 13 | logger = JFMlogging().getloger() 14 | from config import * 15 | 16 | @allure.feature("测试首页") 17 | @pytest.mark.usefixtures('ios_driver_setup') 18 | class TestHome: 19 | 20 | @pytest.fixture() 21 | def init(self,scope="class"): 22 | logger.info("初始化首页模块") 23 | yield self.home 24 | logger.info("结束首页模块") 25 | 26 | @allure.story('测试首页搜索') 27 | def test_home_search(self, init): 28 | logger.info("测试首页搜索") 29 | -------------------------------------------------------------------------------- /ios/testcase/test_login.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 测试登录 8 | """ 9 | import pytest,time,allure 10 | from tools.loggers import JFMlogging 11 | logger = JFMlogging().getloger() 12 | from config import * 13 | from ios.module.home import Home 14 | 15 | 16 | @pytest.mark.usefixtures('ios_driver_setup') 17 | @pytest.mark.run(order=1) 18 | # 指定login先执行 19 | class TestLogin: 20 | 21 | @pytest.fixture() 22 | def init(self,scope="function"): 23 | self.home = Home(self.driver) 24 | self.home.mine_tab() 25 | logger.info("初始化登录模块") 26 | yield 27 | logger.info("结束登录模块") 28 | 29 | def test_login(self): 30 | pass -------------------------------------------------------------------------------- /myreport/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Allure Report 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /myreport/data/timeline.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "ab17fc5a4eb3bca4b216b548c7f9fcbc", 3 | "name" : "timeline", 4 | "children" : [ { 5 | "name" : "xinxideMacBook-Pro.local", 6 | "children" : [ { 7 | "name" : "47579-MainThread", 8 | "children" : [ { 9 | "name" : "test_find.TestFind.test_find", 10 | "uid" : "531c86dbca320b6", 11 | "parentUid" : "47b0369d7f4accff5f57d8cbd334fb75", 12 | "status" : "passed", 13 | "time" : { 14 | "start" : 1544459544236, 15 | "stop" : 1544459557293, 16 | "duration" : 13057 17 | }, 18 | "flaky" : false, 19 | "parameters" : [ ] 20 | } ], 21 | "uid" : "47b0369d7f4accff5f57d8cbd334fb75" 22 | } ], 23 | "uid" : "38e3e4fcaa6be984bb74130f47fd49e3" 24 | } ] 25 | } -------------------------------------------------------------------------------- /android/testcase/test_news.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | @Author : xinxi 5 | @Time : 2018/12/5 18:34 6 | @describe: 测试消息中心 7 | """ 8 | import pytest,time,allure 9 | from android.module.news import News 10 | from android.module.home import Home 11 | from tools.loggers import JFMlogging 12 | logger = JFMlogging().getloger() 13 | from config import * 14 | 15 | @allure.feature("测试消息中心") 16 | @pytest.mark.usefixtures('driver_setup') 17 | class TestNews: 18 | 19 | @pytest.fixture() 20 | def init(self,scope="class"): 21 | self.home = Home(self.driver) 22 | self.home.news_tab() 23 | self.news = News(self.driver) 24 | logger.info("初始化消息模块") 25 | yield self.news 26 | logger.info("结束消息模块") 27 | 28 | @pytest.mark.flaky(reruns=5, reruns_delay=2) 29 | @allure.story('测试精选活动') 30 | def test_news_good(self,init): 31 | init.news_good() 32 | 33 | 34 | -------------------------------------------------------------------------------- /android/testcase/test_login.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 测试登录 8 | """ 9 | import pytest,time,allure 10 | from tools.loggers import JFMlogging 11 | logger = JFMlogging().getloger() 12 | from config import * 13 | from android.module.login import Login 14 | from android.module.home import Home 15 | 16 | 17 | @pytest.mark.usefixtures('driver_setup') 18 | @pytest.mark.run(order=1) 19 | # 指定login先执行 20 | class TestLogin: 21 | 22 | @pytest.fixture() 23 | def init(self,scope="function"): 24 | self.home = Home(self.driver) 25 | self.home.mine_tab() 26 | self.login = Login(self.driver) 27 | logger.info("初始化登录模块") 28 | yield self.login 29 | logger.info("结束登录模块") 30 | 31 | 32 | @allure.story('测试登录') 33 | @pytest.mark.P0 34 | def test_login(self,init): 35 | init.login() 36 | -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 运行入口 8 | """ 9 | 10 | import pytest,os,subprocess 11 | from tools.loggers import JFMlogging 12 | logger = JFMlogging().getloger() 13 | 14 | 15 | def init_env(): 16 | cmd = "python -m uiautomator2 clear-cache" 17 | subprocess.call(cmd, shell=True) 18 | cmd = "python -m uiautomator2 init" 19 | subprocess.call(cmd, shell=True) 20 | logger.info("初始化运行环境!") 21 | 22 | def init_report(): 23 | cmd = "allure generate --clean data -o reports" 24 | subprocess.call(cmd, shell=True) 25 | project_path = os.path.abspath(os.path.dirname(__file__)) 26 | report_path = project_path + "/reports/" + "index.html" 27 | logger.info("报告地址:{}".format(report_path)) 28 | 29 | 30 | init_env() 31 | pytest.main(["-s","--reruns=2", "android/testcase","--alluredir=data"]) 32 | init_report() 33 | 34 | -------------------------------------------------------------------------------- /android/testcase/test_find.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 测试发现 8 | """ 9 | 10 | import pytest,time,allure,sys 11 | reload(sys) 12 | sys.setdefaultencoding("utf-8") 13 | from android.module.home import Home 14 | from tools.loggers import JFMlogging 15 | logger = JFMlogging().getloger() 16 | from config import * 17 | 18 | @allure.feature("测试发现") 19 | @pytest.mark.usefixtures('driver_setup') 20 | class TestFind(): 21 | 22 | @pytest.fixture() 23 | def init(self, scope="class"): 24 | self.home = Home(self.driver) 25 | self.home.find_tab() 26 | logger.info("初始化首页模块") 27 | yield self.home 28 | logger.info("结束首页模块") 29 | 30 | @allure.story('测试发现') 31 | def test_find(self, init): 32 | logger.info("测试发现") 33 | 34 | @allure.story('测试发现') 35 | def test_find(self, init): 36 | logger.info("测试发现") 37 | 38 | -------------------------------------------------------------------------------- /ios/module/home.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 首页 8 | """ 9 | import pytest 10 | from base import Base 11 | from tools.loggers import JFMlogging 12 | logger = JFMlogging().getloger() 13 | 14 | home = "首页" 15 | find = "发现" 16 | push = "发布" 17 | news = "消息" 18 | mine = "我的" 19 | search = "搜索" 20 | more = "更多" 21 | guesslike = "推荐" 22 | searcher = "" 23 | search_edit = "" 24 | search_text = "文员" 25 | 26 | 27 | class Home(Base): 28 | 29 | def __init__(self,driver): 30 | self.driver = driver 31 | 32 | def home_tab(self): 33 | self.driver(name=home).click() 34 | 35 | def find_tab(self): 36 | self.driver(name=find).click() 37 | 38 | def mine_tab(self): 39 | self.driver(name=mine).click() 40 | 41 | def home_more_search(self,kewords): 42 | pass 43 | 44 | def home_more(self): 45 | pass 46 | 47 | def home_guesslike(self): 48 | pass 49 | -------------------------------------------------------------------------------- /ios/module/login.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 登录 8 | """ 9 | import allure 10 | from base import Base 11 | from tools.loggers import JFMlogging 12 | from keyconfig import * 13 | from allure_commons.types import AttachmentType 14 | logger = JFMlogging().getloger() 15 | 16 | head_image = "com.wuba:id/mycenter_head_image" 17 | username_edit = "com.wuba:id/login_username" 18 | password_edit = "com.wuba:id/login_password" 19 | login_btn = "登录" 20 | head_text = "头像" 21 | username_text = "账号" 22 | password_text = "密码" 23 | my_push = "我的发布" 24 | 25 | 26 | class Login(Base): 27 | 28 | def __init__(self,driver): 29 | self.base = Base(driver) 30 | 31 | @allure.story('登录') 32 | def login(self): 33 | self.base.click(head_image,head_text) 34 | self.base.send_keys(username_edit,username,username_text) 35 | self.base.send_keys(password_edit,password,password_text) 36 | self.base.click(login_btn, login_btn) 37 | self.base.assert_exited(my_push) -------------------------------------------------------------------------------- /android/module/login.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 登录 8 | """ 9 | import allure 10 | from base import Base 11 | from tools.loggers import JFMlogging 12 | from keyconfig import * 13 | from allure_commons.types import AttachmentType 14 | logger = JFMlogging().getloger() 15 | 16 | head_image = "com.wuba:id/mycenter_head_image" 17 | username_edit = "com.wuba:id/login_username" 18 | password_edit = "com.wuba:id/login_password" 19 | login_btn = "登录" 20 | head_text = "头像" 21 | username_text = "账号" 22 | password_text = "密码" 23 | my_push = "我的发布" 24 | 25 | 26 | class Login(Base): 27 | 28 | def __init__(self,driver): 29 | self.base = Base(driver) 30 | 31 | @allure.story('登录') 32 | def login(self): 33 | self.base.click(head_image,head_text) 34 | self.base.send_keys(username_edit,username,username_text) 35 | self.base.send_keys(password_edit,password,password_text) 36 | self.base.click(login_btn, login_btn) 37 | self.base.assert_exited(my_push) -------------------------------------------------------------------------------- /android/testcase/test_push.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 测试发布 8 | """ 9 | 10 | import pytest,time,allure,json,sys 11 | reload(sys) 12 | sys.setdefaultencoding("utf-8") 13 | from android.module.news import News 14 | from android.module.home import Home 15 | from android.module.push import Push 16 | from tools.loggers import JFMlogging 17 | logger = JFMlogging().getloger() 18 | from config import * 19 | 20 | item = json.loads(open('./provide/push.item.json', 'r').read()) 21 | 22 | @allure.feature("测试发布") 23 | @pytest.mark.usefixtures('driver_setup') 24 | class TestNews: 25 | 26 | @pytest.fixture(params=item) 27 | def item(self, request): 28 | return request.param 29 | 30 | @pytest.fixture() 31 | def init(self,scope="class"): 32 | self.home = Home(self.driver) 33 | self.home.push_tab() 34 | self.push = Push(self.driver) 35 | logger.info("初始化发布模块") 36 | yield self.push 37 | logger.info("结束发布模块") 38 | 39 | 40 | @allure.story('测试发布参数化' + '\n' + '使用json文件') 41 | def test_push_item(self,init,item): 42 | init.push_item(item['item']) 43 | 44 | 45 | -------------------------------------------------------------------------------- /android/testcase/test_home.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 测试首页 8 | """ 9 | import pytest,time,allure,sys 10 | reload(sys) 11 | sys.setdefaultencoding("utf-8") 12 | from android.module.home import Home 13 | from tools.loggers import JFMlogging 14 | logger = JFMlogging().getloger() 15 | from config import * 16 | 17 | @allure.feature("测试首页") 18 | @pytest.mark.usefixtures('driver_setup') 19 | class TestHome: 20 | 21 | @pytest.fixture() 22 | def init(self,scope="class"): 23 | self.home = Home(self.driver) 24 | logger.info("初始化首页模块") 25 | yield self.home 26 | logger.info("结束首页模块") 27 | 28 | 29 | @allure.story('测试首页搜索') 30 | def test_home_search(self,init): 31 | init.home_search() 32 | 33 | @allure.story('测试首页搜索参数化') 34 | @pytest.mark.parametrize(('kewords'), [(u"司机"), (u"老师"), (u"公寓")]) 35 | def test_home_moresearch(self, init,kewords): 36 | init.home_more_search(kewords) 37 | 38 | @allure.story('测试首页更多') 39 | @pytest.mark.P0 40 | def test_home_more(self, init): 41 | init.home_more() 42 | 43 | @allure.story('测试推荐') 44 | @pytest.mark.P1 45 | def test_home_guesslike(self,init): 46 | init.home_guesslike() 47 | 48 | -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | # 简介 2 | 使用uiautomator2+pytest+allure进行Android的UI自动化测试 3 | 4 | # 环境搭建 5 | 6 | ## pytest框架 7 | pip install pytest==3.7 8 | 9 | ## allure报告 10 | ``` 11 | 命令: 12 | py.test --alluredir=reports 13 | allure generate reports 14 | allure generate reports --clean 15 | allure generate --clean reports -o myreport 16 | 用火狐浏览器打开,chrome会404 17 | ``` 18 | 19 | 20 | ## uiautomator2官方文档 21 | https://github.com/openatx/uiautomator2 22 | 23 | ## 安装atx-agent 24 | pip uninstall uiautomator2
25 | pip install --pre uiautomator2
26 | python -m uiautomator2 init
27 | 28 | 29 | ## 查看页面元素 30 | pip install weditor
31 | python -m weditor
32 | 33 | 34 | ## 运行命令 35 | 36 | 测试单个方法: pytest -k test_home_search --alluredir=reports -s
37 | 测试单个用例:pytest -s testcase/test_find.py
38 | 测试PO级Case: pytest -v -m "P0" --alluredir=reports
39 | 不测试PO级Case: pytest -v -m "not P0" --alluredir=reports
40 | 41 | ## 生成报告 42 | allure generate --clean reports -o myreport 43 | 44 | ## 无线连接 45 | ``` 46 | 手机的ip地址需要和pc电脑的ip地址在一个网段上 47 | d = ut2.connect("192.168.129.93") 48 | ``` 49 | 50 | ## 学习笔记 51 | https://docs.pytest.org/en/latest/example/simple.html 52 | 53 | 54 | ## iOS环境搭建 55 | 查看设备中app列表 56 | ideviceinstaller -u 86616cbaa40e52d3f9236ec982dd6f1e933a44bd -l 57 | 58 | 59 | 60 | 浅谈自动化测试工具 python-uiautomator2 61 | https://testerhome.com/topics/11357 -------------------------------------------------------------------------------- /myreport/data/behaviors.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "b1a8273437954620fa374b796ffaacdd", 3 | "name" : "behaviors", 4 | "children" : [ { 5 | "name" : "初始化类", 6 | "children" : [ { 7 | "name" : "测试发现", 8 | "children" : [ { 9 | "name" : "test_find.TestFind.test_find", 10 | "uid" : "531c86dbca320b6", 11 | "parentUid" : "943cad40cbafd05d39f8d569d0d4dfa7", 12 | "status" : "passed", 13 | "time" : { 14 | "start" : 1544459544236, 15 | "stop" : 1544459557293, 16 | "duration" : 13057 17 | }, 18 | "flaky" : false, 19 | "parameters" : [ ] 20 | } ], 21 | "uid" : "943cad40cbafd05d39f8d569d0d4dfa7" 22 | } ], 23 | "uid" : "24e249ef1a122c78d4aa2ffcf776c293" 24 | }, { 25 | "name" : "测试发现", 26 | "children" : [ { 27 | "name" : "测试发现", 28 | "children" : [ { 29 | "name" : "test_find.TestFind.test_find", 30 | "uid" : "531c86dbca320b6", 31 | "parentUid" : "ff080dcee66f9dd40d78d2246e4ed59a", 32 | "status" : "passed", 33 | "time" : { 34 | "start" : 1544459544236, 35 | "stop" : 1544459557293, 36 | "duration" : 13057 37 | }, 38 | "flaky" : false, 39 | "parameters" : [ ] 40 | } ], 41 | "uid" : "ff080dcee66f9dd40d78d2246e4ed59a" 42 | } ], 43 | "uid" : "3029ffe839ca74972d760e03c243a066" 44 | } ] 45 | } -------------------------------------------------------------------------------- /tools/loggers.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | 5 | import os 6 | import os.path 7 | import socket 8 | import logging 9 | import logging.handlers 10 | logging.basicConfig() 11 | 12 | 13 | def singleton(cls, *args, **kw): 14 | instances = {} 15 | 16 | def _singleton(): 17 | if cls not in instances: 18 | instances[cls] = cls(*args, **kw) 19 | return instances[cls] 20 | return _singleton 21 | 22 | 23 | @singleton 24 | class JFMlogging(object): 25 | logger = logging.getLogger() 26 | 27 | def __init__(self): 28 | host_name = socket.gethostname() 29 | # ip = socket.gethostbyname(host_name) 30 | logging_msg_format = '[%(asctime)s] [%(levelname)s] [' + host_name + '][%(module)s.py - line:%(lineno)d] %(message)s' 31 | logging_date_format = '%Y-%m-%d %H:%M:%S' 32 | log_path = 'logs' # 日志存放目录 33 | logging.basicConfig(level=logging.INFO, format=logging_msg_format, datefmt=logging_date_format) 34 | self.logger.setLevel(logging.INFO) 35 | 36 | if not os.path.exists(log_path): 37 | os.mkdir(log_path) 38 | log_file = os.path.join(log_path, 'system.log') 39 | 40 | fileHandler = logging.handlers.TimedRotatingFileHandler(log_file, 'midnight', 1) 41 | fileHandler.setFormatter(logging.Formatter(logging_msg_format)) 42 | self.logger.addHandler(fileHandler) 43 | 44 | def getloger(self): 45 | return self.logger 46 | -------------------------------------------------------------------------------- /driver.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 创建uiautomator2 8 | """ 9 | import atx,time 10 | import subprocess 11 | import uiautomator2 as ut2 12 | from config import * 13 | from tools.loggers import JFMlogging 14 | logger = JFMlogging().getloger() 15 | 16 | class Driver(): 17 | 18 | def init_driver(self,device_name): 19 | ''' 20 | 初始化driver 21 | is_clear:清除数据 22 | :return: 23 | ''' 24 | try: 25 | logger.info(device_name) 26 | d = ut2.connect(device_name) 27 | # d = ut2.connect("192.168.129.93") 28 | #logger.info("设备信息:{}".format(d.info)) 29 | # 设置全局寻找元素超时时间 30 | d.wait_timeout = wait_timeout # default 20.0 31 | # 设置点击元素延迟时间 32 | d.click_post_delay = click_post_delay 33 | #d.service("uiautomator").stop() 34 | # 停止uiautomator 可能和atx agent冲突 35 | logger.info("连接设备:{}".format(device_name)) 36 | return d 37 | except Exception as e: 38 | logger.info("初始化driver异常!{}".format(e)) 39 | 40 | 41 | 42 | def init_ios_driver(self, device_name): 43 | try: 44 | d = atx.connect("http://localhost:8100") 45 | d.start_app(bundle_id) 46 | time.sleep(5) 47 | return d 48 | except Exception as e: 49 | logger.info("初始化ios端driver异常!{}".format(e)) 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /myreport/plugins/packages/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | allure.api.addTranslation('en', { 4 | tab: { 5 | packages: { 6 | name: 'Packages' 7 | } 8 | } 9 | }); 10 | 11 | allure.api.addTranslation('ru', { 12 | tab: { 13 | packages: { 14 | name: 'Пакеты' 15 | } 16 | } 17 | }); 18 | 19 | allure.api.addTranslation('zh', { 20 | tab: { 21 | packages: { 22 | name: '包' 23 | } 24 | } 25 | }); 26 | 27 | allure.api.addTranslation('de', { 28 | tab: { 29 | packages: { 30 | name: 'Pakete' 31 | } 32 | } 33 | }); 34 | 35 | allure.api.addTranslation('he', { 36 | tab: { 37 | packages: { 38 | name: 'חבילות' 39 | } 40 | } 41 | }); 42 | 43 | allure.api.addTranslation('br', { 44 | tab: { 45 | packages: { 46 | name: 'Pacotes' 47 | } 48 | } 49 | }); 50 | 51 | allure.api.addTab('packages', { 52 | title: 'tab.packages.name', icon: 'fa fa-align-left', 53 | route: 'packages(/)(:testGroup)(/)(:testResult)(/)(:testResultTab)(/)', 54 | onEnter: (function (testGroup, testResult, testResultTab) { 55 | return new allure.components.TreeLayout({ 56 | testGroup: testGroup, 57 | testResult: testResult, 58 | testResultTab: testResultTab, 59 | tabName: 'tab.packages.name', 60 | baseUrl: 'packages', 61 | url: 'data/packages.json' 62 | }); 63 | }) 64 | }); 65 | -------------------------------------------------------------------------------- /android/module/home.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 首页 8 | """ 9 | import pytest 10 | from base import Base 11 | from tools.loggers import JFMlogging 12 | logger = JFMlogging().getloger() 13 | 14 | home = "首页" 15 | find = "发现" 16 | push = "发布" 17 | news = "消息" 18 | mine = "我的" 19 | search = "搜索" 20 | more = "更多" 21 | guesslike = "推荐" 22 | searcher = "com.wuba:id/toolbar_searcher" 23 | search_edit = "com.wuba:id/searcherInputEditText" 24 | search_text = "文员" 25 | 26 | 27 | class Home(Base): 28 | 29 | def __init__(self,driver): 30 | self.base = Base(driver) 31 | 32 | def home_tab(self): 33 | self.base.click(home,home) 34 | 35 | def find_tab(self): 36 | self.base.click(find,find) 37 | 38 | def push_tab(self): 39 | self.base.click(push, push) 40 | 41 | def news_tab(self): 42 | self.base.click(news, news) 43 | 44 | def mine_tab(self): 45 | self.base.click(mine,mine) 46 | 47 | def home_search(self): 48 | self.base.click(searcher,search) 49 | self.base.send_keys(search_edit,search_text,search_text) 50 | 51 | def home_more_search(self,kewords): 52 | self.base.click(searcher, search) 53 | self.base.send_keys(search_edit, kewords, search_text) 54 | self.base.back() 55 | self.base.back() 56 | 57 | def home_more(self): 58 | self.base.click(more,more) 59 | 60 | def home_guesslike(self): 61 | self.base.swip_down_element(guesslike) 62 | self.base.assert_exited(guesslike) 63 | -------------------------------------------------------------------------------- /myreport/data/test-cases/531c86dbca320b6.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "531c86dbca320b6", 3 | "name" : "test_find.TestFind.test_find", 4 | "fullName" : "testcase.test_find.TestFind.test_find", 5 | "historyId" : "497a1938a0520647634d7c6a3bc0b5e1", 6 | "time" : { 7 | "start" : 1544459544236, 8 | "stop" : 1544459557293, 9 | "duration" : 13057 10 | }, 11 | "description" : "", 12 | "descriptionHtml" : "", 13 | "status" : "passed", 14 | "flaky" : false, 15 | "beforeStages" : [ ], 16 | "testStage" : { 17 | "status" : "passed", 18 | "steps" : [ ], 19 | "attachments" : [ { 20 | "uid" : "a1afe3d22dcb0c69", 21 | "name" : "Captured log setup", 22 | "source" : "a1afe3d22dcb0c69.txt", 23 | "type" : "text/plain", 24 | "size" : 351 25 | }, { 26 | "uid" : "aa5d69676c97f51", 27 | "name" : "Captured log call", 28 | "source" : "aa5d69676c97f51.txt", 29 | "type" : "text/plain", 30 | "size" : 52 31 | } ], 32 | "parameters" : [ ], 33 | "stepsCount" : 0, 34 | "attachmentsCount" : 2, 35 | "shouldDisplayMessage" : false, 36 | "hasContent" : true 37 | }, 38 | "afterStages" : [ ], 39 | "labels" : [ { 40 | "name" : "feature", 41 | "value" : "初始化类" 42 | }, { 43 | "name" : "feature", 44 | "value" : "测试发现" 45 | }, { 46 | "name" : "framework", 47 | "value" : "pytest" 48 | }, { 49 | "name" : "host", 50 | "value" : "xinxideMacBook-Pro.local" 51 | }, { 52 | "name" : "language", 53 | "value" : "cpython2" 54 | }, { 55 | "name" : "severity", 56 | "value" : "normal" 57 | }, { 58 | "name" : "story", 59 | "value" : "测试发现" 60 | }, { 61 | "name" : "thread", 62 | "value" : "47579-MainThread" 63 | }, { 64 | "name" : "suite", 65 | "value" : "testcase" 66 | }, { 67 | "name" : "testClass", 68 | "value" : "testcase" 69 | }, { 70 | "name" : "testMethod", 71 | "value" : "test_find.TestFind.test_find" 72 | }, { 73 | "name" : "package", 74 | "value" : "testcase" 75 | }, { 76 | "name" : "resultFormat", 77 | "value" : "allure1" 78 | } ], 79 | "parameters" : [ ], 80 | "links" : [ ], 81 | "hidden" : false, 82 | "retry" : false, 83 | "extra" : { 84 | "severity" : "normal", 85 | "retries" : [ ], 86 | "categories" : [ ], 87 | "tags" : [ ] 88 | }, 89 | "source" : "531c86dbca320b6.json", 90 | "parameterValues" : [ ] 91 | } -------------------------------------------------------------------------------- /failures: -------------------------------------------------------------------------------- 1 | testcase/test_home.py::TestHome::()::test_home_guesslike 2 | testcase/test_home.py::TestHome::()::test_home_guesslike 3 | testcase/test_home.py::TestHome::()::test_home_guesslike 4 | testcase/test_home.py::TestHome::()::test_home_guesslike 5 | testcase/test_home.py::TestHome::()::test_home_guesslike 6 | testcase/test_home.py::TestHome::()::test_home_guesslike 7 | testcase/test_home.py::TestHome::()::test_home_guesslike 8 | testcase/test_home.py::TestHome::()::test_home_guesslike 9 | testcase/test_home.py::TestHome::()::test_home_guesslike 10 | testcase/test_home.py::TestHome::()::test_home_guesslike 11 | testcase/test_home.py::TestHome::()::test_home_guesslike 12 | testcase/test_home.py::TestHome::()::test_home_guesslike 13 | testcase/test_home.py::TestHome::()::test_home_guesslike 14 | testcase/test_home.py::TestHome::()::test_home_guesslike 15 | testcase/test_home.py::TestHome::()::test_home_guesslike 16 | testcase/test_home.py::TestHome::()::test_home_guesslike 17 | testcase/test_home.py::TestHome::()::test_home_guesslike 18 | testcase/test_home.py::TestHome::()::test_home_guesslike 19 | testcase/test_home.py::TestHome::()::test_home_guesslike 20 | testcase/test_home.py::TestHome::()::test_home_guesslike 21 | testcase/test_home.py::TestHome::()::test_home_guesslike 22 | testcase/test_home.py::TestHome::()::test_home_guesslike 23 | testcase/test_home.py::TestHome::()::test_home_guesslike 24 | testcase/test_login.py::TestLogin::()::test_login 25 | testcase/test_login.py::TestLogin::()::test_login 26 | testcase/test_login.py::TestLogin::()::test_login 27 | testcase/test_home.py::TestHome::()::test_home_guesslike 28 | testcase/test_home.py::TestHome::()::test_home_guesslike 29 | testcase/test_home.py::TestHome::()::test_home_guesslike 30 | testcase/test_login.py::TestLogin::()::test_login 31 | testcase/test_login.py::TestLogin::()::test_login 32 | testcase/test_login.py::TestLogin::()::test_login 33 | testcase/test_home.py::TestHome::()::test_home_guesslike 34 | testcase/test_home.py::TestHome::()::test_home_guesslike 35 | testcase/test_home.py::TestHome::()::test_home_guesslike 36 | android/testcase/test_login.py::TestLogin::()::test_login 37 | android/testcase/test_home.py::TestHome::()::test_home_guesslike 38 | android/testcase/test_login.py::TestLogin::()::test_login 39 | android/testcase/test_home.py::TestHome::()::test_home_guesslike 40 | android/testcase/test_home.py::TestHome::()::test_home_guesslike 41 | android/testcase/test_home.py::TestHome::()::test_home_guesslike 42 | android/testcase/test_home.py::TestHome::()::test_home_guesslike 43 | android/testcase/test_login.py::TestLogin::()::test_login 44 | android/testcase/test_login.py::TestLogin::()::test_login 45 | android/testcase/test_login.py::TestLogin::()::test_login 46 | -------------------------------------------------------------------------------- /myreport/plugins/behaviors/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | allure.api.addTranslation('en', { 4 | tab: { 5 | behaviors: { 6 | name: 'Behaviors' 7 | } 8 | }, 9 | widget: { 10 | behaviors: { 11 | name: 'Features by stories', 12 | showAll: 'show all' 13 | } 14 | } 15 | }); 16 | 17 | allure.api.addTranslation('ru', { 18 | tab: { 19 | behaviors: { 20 | name: 'Функциональность' 21 | } 22 | }, 23 | widget: { 24 | behaviors: { 25 | name: 'Функциональность', 26 | showAll: 'показать все' 27 | } 28 | } 29 | }); 30 | 31 | allure.api.addTranslation('zh', { 32 | tab: { 33 | behaviors: { 34 | name: '功能' 35 | } 36 | }, 37 | widget: { 38 | behaviors: { 39 | name: '特性场景', 40 | showAll: '显示所有' 41 | } 42 | } 43 | }); 44 | 45 | allure.api.addTranslation('de', { 46 | tab: { 47 | behaviors: { 48 | name: 'Verhalten' 49 | } 50 | }, 51 | widget: { 52 | behaviors: { 53 | name: 'Features nach Stories', 54 | showAll: 'Zeige alle' 55 | } 56 | } 57 | }); 58 | 59 | allure.api.addTranslation('he', { 60 | tab: { 61 | behaviors: { 62 | name: 'התנהגויות' 63 | } 64 | }, 65 | widget: { 66 | behaviors: { 67 | name: 'תכונות לפי סיפורי משתמש', 68 | showAll: 'הצג הכול' 69 | } 70 | } 71 | }); 72 | 73 | allure.api.addTranslation('br', { 74 | tab: { 75 | behaviors: { 76 | name: 'Comportamentos' 77 | } 78 | }, 79 | widget: { 80 | behaviors: { 81 | name: 'Funcionalidades por história', 82 | showAll: 'Mostrar tudo' 83 | } 84 | } 85 | }); 86 | 87 | allure.api.addTab('behaviors', { 88 | title: 'tab.behaviors.name', icon: 'fa fa-list', 89 | route: 'behaviors(/)(:testGroup)(/)(:testResult)(/)(:testResultTab)(/)', 90 | onEnter: (function (testGroup, testResult, testResultTab) { 91 | return new allure.components.TreeLayout({ 92 | testGroup: testGroup, 93 | testResult: testResult, 94 | testResultTab: testResultTab, 95 | tabName: 'tab.behaviors.name', 96 | baseUrl: 'behaviors', 97 | url: 'data/behaviors.json', 98 | csvUrl: 'data/behaviors.csv' 99 | }); 100 | }) 101 | }); 102 | 103 | allure.api.addWidget('widgets', 'behaviors', allure.components.WidgetStatusView.extend({ 104 | rowTag: 'a', 105 | title: 'widget.behaviors.name', 106 | baseUrl: 'behaviors', 107 | showLinks: true 108 | })); -------------------------------------------------------------------------------- /android/testcase/logs/system.log: -------------------------------------------------------------------------------- 1 | [2018-12-11 00:27:42,040] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:27] 自动化测试开始! 2 | [2018-12-11 00:27:42,040] [INFO] [xinxideMacBook-Pro.local][driver.py - line:24] a3f8ca3a 3 | [2018-12-11 00:27:42,295] [INFO] [xinxideMacBook-Pro.local][driver.py - line:33] 连接设备:a3f8ca3a 4 | [2018-12-11 00:27:42,296] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:29] driver初始化 5 | [2018-12-11 00:27:51,652] [INFO] [xinxideMacBook-Pro.local][base.py - line:53] 点击元素:发现 6 | [2018-12-11 00:27:51,652] [INFO] [xinxideMacBook-Pro.local][test_find.py - line:26] 初始化首页模块 7 | [2018-12-11 00:27:51,655] [INFO] [xinxideMacBook-Pro.local][test_find.py - line:32] 测试发现 8 | [2018-12-11 00:27:51,657] [INFO] [xinxideMacBook-Pro.local][test_find.py - line:28] 结束首页模块 9 | [2018-12-11 00:27:51,658] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:35] 自动化测试结束! 10 | [2018-12-11 00:28:08,890] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:27] 自动化测试开始! 11 | [2018-12-11 00:28:08,891] [INFO] [xinxideMacBook-Pro.local][driver.py - line:24] a3f8ca3a 12 | [2018-12-11 00:28:09,033] [INFO] [xinxideMacBook-Pro.local][driver.py - line:33] 连接设备:a3f8ca3a 13 | [2018-12-11 00:28:09,033] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:29] driver初始化 14 | [2018-12-11 00:28:19,951] [INFO] [xinxideMacBook-Pro.local][base.py - line:53] 点击元素:发现 15 | [2018-12-11 00:28:19,953] [INFO] [xinxideMacBook-Pro.local][test_find.py - line:26] 初始化首页模块 16 | [2018-12-11 00:28:19,957] [INFO] [xinxideMacBook-Pro.local][test_find.py - line:32] 测试发现 17 | [2018-12-11 00:28:19,958] [INFO] [xinxideMacBook-Pro.local][test_find.py - line:28] 结束首页模块 18 | [2018-12-11 00:28:19,959] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:35] 自动化测试结束! 19 | [2018-12-11 00:28:33,380] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:27] 自动化测试开始! 20 | [2018-12-11 00:28:33,381] [INFO] [xinxideMacBook-Pro.local][driver.py - line:24] a3f8ca3a 21 | [2018-12-11 00:28:33,533] [INFO] [xinxideMacBook-Pro.local][driver.py - line:33] 连接设备:a3f8ca3a 22 | [2018-12-11 00:28:33,534] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:29] driver初始化 23 | [2018-12-11 00:28:52,946] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:35] 自动化测试结束! 24 | [2018-12-11 00:29:22,160] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:27] 自动化测试开始! 25 | [2018-12-11 00:29:22,160] [INFO] [xinxideMacBook-Pro.local][driver.py - line:24] a3f8ca3a 26 | [2018-12-11 00:29:22,295] [INFO] [xinxideMacBook-Pro.local][driver.py - line:33] 连接设备:a3f8ca3a 27 | [2018-12-11 00:29:22,296] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:29] driver初始化 28 | [2018-12-11 00:29:35,444] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:35] 自动化测试结束! 29 | [2018-12-11 00:29:51,144] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:27] 自动化测试开始! 30 | [2018-12-11 00:29:51,144] [INFO] [xinxideMacBook-Pro.local][driver.py - line:24] a3f8ca3a 31 | [2018-12-11 00:29:51,284] [INFO] [xinxideMacBook-Pro.local][driver.py - line:33] 连接设备:a3f8ca3a 32 | [2018-12-11 00:29:51,285] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:29] driver初始化 33 | [2018-12-11 00:29:59,787] [INFO] [xinxideMacBook-Pro.local][base.py - line:53] 点击元素:发现 34 | [2018-12-11 00:29:59,787] [INFO] [xinxideMacBook-Pro.local][test_find.py - line:26] 初始化首页模块 35 | [2018-12-11 00:29:59,789] [INFO] [xinxideMacBook-Pro.local][test_find.py - line:32] 测试发现 36 | [2018-12-11 00:29:59,790] [INFO] [xinxideMacBook-Pro.local][test_find.py - line:28] 结束首页模块 37 | [2018-12-11 00:29:59,790] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:35] 自动化测试结束! 38 | -------------------------------------------------------------------------------- /logs/system.log.2018-12-09: -------------------------------------------------------------------------------- 1 | [2018-12-09 23:43:05,377] [INFO] [xinxideMacBook-Pro.local][test_login.py - line:18] 登录测试... 2 | [2018-12-09 23:46:25,346] [INFO] [xinxideMacBook-Pro.local][base.py - line:23] app测试开始! 3 | [2018-12-09 23:46:25,347] [INFO] [xinxideMacBook-Pro.local][driver.py - line:27] a3f8ca3a 4 | [2018-12-09 23:46:25,596] [INFO] [xinxideMacBook-Pro.local][driver.py - line:29] 设备信息:{u'displayRotation': 1, u'displaySizeDpY': 393, u'displaySizeDpX': 816, u'screenOn': True, u'displayWidth': 2004, u'productName': u'sirius', u'currentPackageName': u'com.tencent.qqlive', u'sdkInt': 27, u'displayHeight': 1080, u'naturalOrientation': False} 5 | [2018-12-09 23:46:25,597] [INFO] [xinxideMacBook-Pro.local][driver.py - line:36] 连接设备:a3f8ca3a 6 | [2018-12-09 23:46:25,597] [INFO] [xinxideMacBook-Pro.local][base.py - line:25] driver初始化 7 | [2018-12-09 23:46:25,615] [INFO] [xinxideMacBook-Pro.local][base.py - line:27] app测试结束! 8 | [2018-12-09 23:50:14,652] [INFO] [xinxideMacBook-Pro.local][base.py - line:22] app测试开始! 9 | [2018-12-09 23:50:14,653] [INFO] [xinxideMacBook-Pro.local][driver.py - line:27] a3f8ca3a 10 | [2018-12-09 23:50:14,918] [INFO] [xinxideMacBook-Pro.local][driver.py - line:29] 设备信息:{u'displayRotation': 1, u'displaySizeDpY': 393, u'displaySizeDpX': 816, u'screenOn': True, u'displayWidth': 2004, u'productName': u'sirius', u'currentPackageName': u'com.tencent.qqlive', u'sdkInt': 27, u'displayHeight': 1080, u'naturalOrientation': False} 11 | [2018-12-09 23:50:14,918] [INFO] [xinxideMacBook-Pro.local][driver.py - line:36] 连接设备:a3f8ca3a 12 | [2018-12-09 23:50:14,919] [INFO] [xinxideMacBook-Pro.local][base.py - line:24] driver初始化 13 | [2018-12-09 23:50:14,937] [INFO] [xinxideMacBook-Pro.local][base.py - line:26] app测试结束! 14 | [2018-12-09 23:50:30,927] [INFO] [xinxideMacBook-Pro.local][base.py - line:22] app测试开始! 15 | [2018-12-09 23:50:30,928] [INFO] [xinxideMacBook-Pro.local][driver.py - line:27] a3f8ca3a 16 | [2018-12-09 23:50:31,147] [INFO] [xinxideMacBook-Pro.local][driver.py - line:29] 设备信息:{u'displayRotation': 1, u'displaySizeDpY': 393, u'displaySizeDpX': 816, u'screenOn': True, u'displayWidth': 2004, u'productName': u'sirius', u'currentPackageName': u'com.tencent.qqlive', u'sdkInt': 27, u'displayHeight': 1080, u'naturalOrientation': False} 17 | [2018-12-09 23:50:31,148] [INFO] [xinxideMacBook-Pro.local][driver.py - line:36] 连接设备:a3f8ca3a 18 | [2018-12-09 23:50:31,148] [INFO] [xinxideMacBook-Pro.local][base.py - line:24] driver初始化 19 | [2018-12-09 23:50:31,166] [INFO] [xinxideMacBook-Pro.local][base.py - line:26] app测试结束! 20 | [2018-12-09 23:51:04,920] [INFO] [xinxideMacBook-Pro.local][base.py - line:22] app测试开始! 21 | [2018-12-09 23:51:04,920] [INFO] [xinxideMacBook-Pro.local][driver.py - line:27] a3f8ca3a 22 | [2018-12-09 23:51:05,159] [INFO] [xinxideMacBook-Pro.local][driver.py - line:29] 设备信息:{u'displayRotation': 1, u'displaySizeDpY': 393, u'displaySizeDpX': 816, u'screenOn': True, u'displayWidth': 2004, u'productName': u'sirius', u'currentPackageName': u'com.tencent.qqlive', u'sdkInt': 27, u'displayHeight': 1080, u'naturalOrientation': False} 23 | [2018-12-09 23:51:05,159] [INFO] [xinxideMacBook-Pro.local][driver.py - line:36] 连接设备:a3f8ca3a 24 | [2018-12-09 23:51:05,159] [INFO] [xinxideMacBook-Pro.local][base.py - line:24] driver初始化 25 | [2018-12-09 23:51:05,174] [INFO] [xinxideMacBook-Pro.local][base.py - line:26] app测试结束! 26 | [2018-12-09 23:55:33,644] [INFO] [xinxideMacBook-Pro.local][base.py - line:22] app测试开始! 27 | [2018-12-09 23:55:33,644] [INFO] [xinxideMacBook-Pro.local][driver.py - line:27] a3f8ca3a 28 | [2018-12-09 23:55:33,892] [INFO] [xinxideMacBook-Pro.local][driver.py - line:29] 设备信息:{u'displayRotation': 1, u'displaySizeDpY': 393, u'displaySizeDpX': 816, u'screenOn': True, u'displayWidth': 2004, u'productName': u'sirius', u'currentPackageName': u'com.tencent.qqlive', u'sdkInt': 27, u'displayHeight': 1080, u'naturalOrientation': False} 29 | [2018-12-09 23:55:33,893] [INFO] [xinxideMacBook-Pro.local][driver.py - line:36] 连接设备:a3f8ca3a 30 | [2018-12-09 23:55:33,893] [INFO] [xinxideMacBook-Pro.local][base.py - line:24] driver初始化 31 | [2018-12-09 23:55:33,912] [INFO] [xinxideMacBook-Pro.local][base.py - line:26] app测试结束! 32 | -------------------------------------------------------------------------------- /myreport/plugins/screen-diff/index.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | var settings = allure.getPluginSettings('screen-diff', {diffType: 'diff'}); 3 | 4 | function renderImage(src) { 5 | return '
' + 6 | '' + 7 | '
'; 8 | } 9 | 10 | function renderDiffContent(type, data) { 11 | function findImage(name) { 12 | if (data.testStage && data.testStage.attachments) { 13 | return data.testStage.attachments.filter(function (attachment) { 14 | return attachment.name === name; 15 | })[0]; 16 | } 17 | return null; 18 | } 19 | 20 | var diffImage = findImage('diff'); 21 | var actualImage = findImage('actual'); 22 | var expectedImage = findImage('expected'); 23 | 24 | if (!diffImage && !actualImage && !expectedImage) { 25 | return 'Diff, actual and expected image have not been provided.'; 26 | } 27 | 28 | if (type === 'diff') { 29 | if (!diffImage) { 30 | return renderImage(actualImage.source); 31 | } 32 | return renderImage(diffImage.source); 33 | } 34 | if (type === 'overlay') { 35 | return '
' + 36 | '' + 37 | '
' + 38 | '' + 39 | '
' + 40 | '
'; 41 | } 42 | } 43 | 44 | var ScreenDiffView = Backbone.Marionette.View.extend({ 45 | className: 'pane__section', 46 | events: { 47 | 'click [name="screen-diff-type"]': 'onDiffTypeChange', 48 | 'mousemove .screen-diff__overlay': 'onOverlayMove' 49 | }, 50 | templateContext: function () { 51 | return { 52 | diffType: settings.get('diffType') 53 | } 54 | }, 55 | template: function (data) { 56 | var testType = data.labels.filter(function (label) { 57 | return label.name === 'testType' 58 | })[0]; 59 | 60 | if (!testType || testType.value !== 'screenshotDiff') { 61 | return ''; 62 | } 63 | 64 | return '

Screen Diff

' + 65 | '
' + 66 | '
' + 67 | '' + 68 | '' + 69 | '
' + 70 | renderDiffContent(data.diffType, data) + 71 | '
'; 72 | }, 73 | adjustImageSize: function (event) { 74 | var overImage = this.$(event.target); 75 | overImage.width(overImage.width()); 76 | }, 77 | onRender: function () { 78 | const diffType = settings.get('diffType'); 79 | this.$('[name="screen-diff-type"][value="' + diffType + '"]').prop('checked', true); 80 | if (diffType === 'overlay') { 81 | this.$('.screen-diff__image-over img').on('load', this.adjustImageSize.bind(this)); 82 | } 83 | }, 84 | onOverlayMove: function (event) { 85 | var pageX = event.pageX; 86 | var containerScroll = this.$('.screen-diff__container').scrollLeft(); 87 | var elementX = event.currentTarget.getBoundingClientRect().left; 88 | var delta = pageX - elementX + containerScroll; 89 | this.$('.screen-diff__image-over').width(delta); 90 | }, 91 | onDiffTypeChange: function (event) { 92 | settings.save('diffType', event.target.value); 93 | this.render(); 94 | } 95 | }); 96 | allure.api.addTestResultBlock(ScreenDiffView, {position: 'before'}); 97 | })(); 98 | -------------------------------------------------------------------------------- /conftest.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 创建driver 8 | """ 9 | import os,sys,subprocess,pytest,time,allure 10 | import base64,atx 11 | from android.module.base import Base 12 | import uiautomator2 as ut2 13 | import uiautomator2.ext.htmlreport as htmlreport 14 | from driver import Driver 15 | from config import * 16 | from allure_commons._allure import attach 17 | from allure_commons.types import AttachmentType 18 | sys.path.append('..') 19 | from tools.loggers import JFMlogging 20 | logger = JFMlogging().getloger() 21 | 22 | 23 | # 当设置autouse为True时, 24 | # 在一个session内的所有的test都会自动调用这个fixture 25 | @pytest.fixture() 26 | def driver_setup(request): 27 | logger.info("自动化测试开始!") 28 | request.instance.driver = Driver().init_driver(device_name) 29 | logger.info("driver初始化") 30 | request.instance.driver.app_start(pck_name, lanuch_activity, stop=True) 31 | time.sleep(lanuch_time) 32 | allow(request.instance.driver) 33 | def driver_teardown(): 34 | logger.info("自动化测试结束!") 35 | request.instance.driver.app_stop(pck_name) 36 | request.addfinalizer(driver_teardown) 37 | 38 | 39 | @pytest.hookimpl(tryfirst=True, hookwrapper=True) 40 | def pytest_runtest_makereport(item, call): 41 | ''' 42 | hook pytest失败 43 | :param item: 44 | :param call: 45 | :return: 46 | ''' 47 | # execute all other hooks to obtain the report object 48 | outcome = yield 49 | rep = outcome.get_result() 50 | # we only look at actual failing test calls, not setup/teardown 51 | if rep.when == "call" and rep.failed: 52 | mode = "a" if os.path.exists("failures") else "w" 53 | with open("failures", mode) as f: 54 | # let's also access a fixture for the fun of it 55 | if "tmpdir" in item.fixturenames: 56 | extra = " (%s)" % item.funcargs["tmpdir"] 57 | else: 58 | extra = "" 59 | f.write(rep.nodeid + extra + "\n") 60 | pic_info = adb_screen_shot() 61 | with allure.step('添加失败截图...'): 62 | allure.attach("失败截图", pic_info, allure.attach_type.JPG) 63 | 64 | 65 | def allow(driver): 66 | driver.watcher("允许").when(text="允许").click(text="允许") 67 | driver.watcher("跳过 >").when(text="跳过 >").click(text="跳过 >") 68 | driver.watcher("不要啦").when(text="不要啦").click(text="不要啦") 69 | 70 | 71 | def screen_shot(driver): 72 | ''' 73 | 截图操作 74 | pic_name:截图名称 75 | :return: 76 | ''' 77 | try: 78 | fail_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) 79 | fail_pic = str(fail_time) + "截图" 80 | pic_name = os.path.join(screenshot_folder, fail_pic) 81 | driver.screenshot("{}.jpg".format(pic_name)) 82 | logger.info('截图:{}'.format(pic_name)) 83 | f = open(pic_name, 'rb') # 二进制方式打开图文件 84 | base64_str = base64.b64encode(f.read()) # 读取文件内容,转换为base64编码 85 | f.close() 86 | return base64_str 87 | except Exception as e: 88 | logger.info("{}截图失败!{}".format(pic_name, e)) 89 | 90 | 91 | def adb_screen_shot(): 92 | ''' 93 | adb截图 94 | :return: 95 | ''' 96 | file_info = '' 97 | fail_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) 98 | fail_pic = str(fail_time) + "截图.jpg" 99 | pic_name = os.path.join(screenshot_folder, fail_pic) 100 | cmd = 'adb shell /system/bin/screencap -p /sdcard/screenshot.jpg' 101 | subprocess.call(cmd,shell=True) 102 | cmd = 'adb pull /sdcard/screenshot.jpg {}'.format(pic_name) 103 | subprocess.call(cmd, shell=True) 104 | with open(pic_name, 'rb') as r: 105 | file_info = r.read() 106 | return file_info 107 | 108 | 109 | 110 | # 当设置autouse为True时, 111 | # 在一个session内的所有的test都会自动调用这个fixture 112 | # @pytest.fixture(autouse=True) 113 | # def ios_driver_setup(request): 114 | # logger.info("ios自动化测试开始!") 115 | # request.instance.driver = Driver().init_ios_driver(ios_device_name) 116 | # logger.info("driver初始化") 117 | # ios_allow(request.instance.driver) 118 | # def driver_teardown(): 119 | # logger.info("ios自动化测试结束!") 120 | # request.instance.driver.stop_app() 121 | # request.addfinalizer(driver_teardown) 122 | 123 | 124 | def ios_allow(driver): 125 | elem = driver(name="允许") 126 | if elem.exists: 127 | elem.click() 128 | if elem.exists: 129 | elem.click() 130 | elem = driver(xpath='//XCUIElementTypeButton[@name="upgradeClose"]') 131 | if elem.exists: 132 | elem.click() 133 | logger.info("关闭升级") 134 | -------------------------------------------------------------------------------- /android/module/base.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | @Author : xinxi 6 | @Time : 2018/12/5 18:34 7 | @describe: 对元素基本操作封装 8 | """ 9 | 10 | import pytest,time,os,re,yaml,json,sys,xmltodict 11 | import allure 12 | from allure_commons._allure import attach 13 | # from allure.constants import AttachmentType 14 | from allure_commons.types import AttachmentType 15 | import subprocess,base64 16 | sys.path.append("..") 17 | reload(sys) 18 | sys.setdefaultencoding("utf-8") 19 | from tools.loggers import JFMlogging 20 | from config import * 21 | logger = JFMlogging().getloger() 22 | 23 | 24 | 25 | class Base(): 26 | 27 | def __init__(self, driver): 28 | self.d = driver 29 | self.width = self.get_windowsize()[0] 30 | self.height = self.get_windowsize()[1] 31 | 32 | def click(self, element, logtext): 33 | ''' 34 | 元素点击 35 | driver: 操作对象 36 | element:元素名称 37 | logtext:打印log的文案 38 | xpath使用方法 39 | 1.包含 40 | d.xpath(u"//android.widget.TextView[contains(@text,'购买 ¥')]").click() 41 | 2.全匹配 42 | d.xpath(u"//android.widget.TextView[@text='购买 ¥4.99']").click() 43 | 3.匹配开始字符 44 | d.xpath(u"//android.widget.TextView[starts-with(@text,'购买 ¥')]").click() 45 | :return: 46 | ''' 47 | if str(element).startswith("com"): 48 | self.d(resourceId=element).click() 49 | elif re.findall("//", str(element)): 50 | self.d.xpath(element).click() 51 | else: 52 | self.d(text=element).click() 53 | logger.info("点击元素:{}".format(logtext)) 54 | 55 | 56 | 57 | def send_keys(self,element,sendtext,logtext): 58 | ''' 59 | 文本输入 60 | driver: 操作对象 61 | sendtext:输入的文案 62 | element:元素名称 63 | logtext:打印log的文案 64 | :return: 65 | ''' 66 | self.d(resourceId=element).set_text(sendtext) 67 | logger.info(logtext) 68 | 69 | 70 | def click_web(self,element,logtext): 71 | ''' 72 | 通过文字,点击web页面中的元素 73 | element=u"文化艺术" 74 | :return: 75 | ''' 76 | 77 | self.d(description=element).click() 78 | logger.info("点击元素:{}".format(logtext)) 79 | 80 | 81 | def double_click(self,x,y,time=0.5): 82 | ''' 83 | 双击 84 | :return: 85 | ''' 86 | self.d.double_click(x, y,time) 87 | logger.info("点击坐标:{},{}".format(x,y)) 88 | 89 | def get_windowsize(self): 90 | ''' 91 | 获取屏幕尺寸 92 | :return: 93 | ''' 94 | window_size = self.d.window_size() 95 | width = int(window_size[0]) 96 | height = int(window_size[1]) 97 | return width, height 98 | 99 | def swip_down(self, time=0.5): 100 | ''' 101 | 向上滑动 102 | :return: 103 | ''' 104 | self.d.drag(self.width / 2, self.height * 3 / 4, self.width / 2, self.height / 4, time) 105 | logger.info("向下滑动") 106 | 107 | 108 | def swip_up(self, time=0.5): 109 | ''' 110 | 向下滑动 111 | :return: 112 | ''' 113 | self.d.drag(self.width / 2, self.height / 4, self.width / 2, self.height * 3 / 4, time) 114 | logger.info("向上滑动") 115 | 116 | 117 | def swip_down_element(self,element): 118 | ''' 119 | 向下滑动到某个元素 120 | :return: 121 | ''' 122 | is_find = False 123 | max_count = 5 124 | while max_count > 0: 125 | if self.find_elements(element): 126 | logger.info("向下滑动到:{}".format(element)) 127 | else: 128 | self.swip_down() 129 | max_count -= 1; 130 | logger.info("向下滑动") 131 | 132 | 133 | def back(self): 134 | ''' 135 | 模拟物理键返回 136 | :return: 137 | ''' 138 | self.d.press("back") 139 | logger.info("点击返回") 140 | 141 | 142 | def find_elements(self,element,timeout=5): 143 | ''' 144 | 查找元素是否存在当前页面 145 | :return: 146 | ''' 147 | is_exited = False 148 | try: 149 | while timeout > 0: 150 | xml = self.d.dump_hierarchy() 151 | if re.findall(element,xml): 152 | is_exited = True 153 | logger.info("查询到{}".format(element)) 154 | break 155 | else: 156 | timeout -=1 157 | except Exception as e: 158 | logger.info("{}查找失败!{}".format(element,e)) 159 | finally: 160 | return is_exited 161 | 162 | 163 | # def assert_exited(self, element): 164 | # ''' 165 | # 断言当前页面存在要查找的元素,存在则判断成功 166 | # :param driver: 167 | # :return: 168 | # ''' 169 | # if self.find_elements(element): 170 | # logger.info("断言{}元素存在,成功!".format(element)) 171 | # assert True 172 | # else: 173 | # logger.info("断言{}元素存在,失败!".format(element)) 174 | # assert False 175 | 176 | def assert_exited(self, element): 177 | ''' 178 | 断言当前页面存在要查找的元素,存在则判断成功 179 | :param driver: 180 | :return: 181 | ''' 182 | assert self.find_elements(element) == True,"断言{}元素存在,失败!".format(element) 183 | logger.info("断言{}元素存在,成功!".format(element)) -------------------------------------------------------------------------------- /myreport/history/history.json: -------------------------------------------------------------------------------- 1 | { 2 | "49f47524c5450a947c2202f388db6524" : { 3 | "statistic" : { 4 | "failed" : 0, 5 | "broken" : 0, 6 | "skipped" : 0, 7 | "passed" : 1, 8 | "unknown" : 0, 9 | "total" : 1 10 | }, 11 | "items" : [ { 12 | "uid" : "ec71b6f590f41169", 13 | "status" : "passed", 14 | "time" : { 15 | "start" : 1544454671474, 16 | "stop" : 1544454677965, 17 | "duration" : 6491 18 | } 19 | } ] 20 | }, 21 | "efd11c894cdc97fcce498aa752d4c273" : { 22 | "statistic" : { 23 | "failed" : 0, 24 | "broken" : 0, 25 | "skipped" : 0, 26 | "passed" : 1, 27 | "unknown" : 0, 28 | "total" : 1 29 | }, 30 | "items" : [ { 31 | "uid" : "1105852210cd524a", 32 | "status" : "passed", 33 | "time" : { 34 | "start" : 1544454547036, 35 | "stop" : 1544454555209, 36 | "duration" : 8173 37 | } 38 | } ] 39 | }, 40 | "8cb30af1e519194066c71f5bc7ea6567" : { 41 | "statistic" : { 42 | "failed" : 0, 43 | "broken" : 0, 44 | "skipped" : 0, 45 | "passed" : 1, 46 | "unknown" : 0, 47 | "total" : 1 48 | }, 49 | "items" : [ { 50 | "uid" : "acd752a20bc3e730", 51 | "status" : "passed", 52 | "time" : { 53 | "start" : 1544454497681, 54 | "stop" : 1544454505900, 55 | "duration" : 8219 56 | } 57 | } ] 58 | }, 59 | "6f2936a77e3a16a5ed062c23669572fe" : { 60 | "statistic" : { 61 | "failed" : 0, 62 | "broken" : 0, 63 | "skipped" : 0, 64 | "passed" : 1, 65 | "unknown" : 0, 66 | "total" : 1 67 | }, 68 | "items" : [ { 69 | "uid" : "c9921c819a865eed", 70 | "status" : "passed", 71 | "time" : { 72 | "start" : 1544454538908, 73 | "stop" : 1544454546942, 74 | "duration" : 8034 75 | } 76 | } ] 77 | }, 78 | "43ed2f544696eb56bfa218634033ed73" : { 79 | "statistic" : { 80 | "failed" : 0, 81 | "broken" : 0, 82 | "skipped" : 0, 83 | "passed" : 1, 84 | "unknown" : 0, 85 | "total" : 1 86 | }, 87 | "items" : [ { 88 | "uid" : "84cc77f3b32d4eaa", 89 | "status" : "passed", 90 | "time" : { 91 | "start" : 1544454555321, 92 | "stop" : 1544454561923, 93 | "duration" : 6602 94 | } 95 | } ] 96 | }, 97 | "30a5dd955d40b0a49e74a47d2620854e" : { 98 | "statistic" : { 99 | "failed" : 0, 100 | "broken" : 0, 101 | "skipped" : 0, 102 | "passed" : 1, 103 | "unknown" : 0, 104 | "total" : 1 105 | }, 106 | "items" : [ { 107 | "uid" : "c09d8480754afc3e", 108 | "status" : "passed", 109 | "time" : { 110 | "start" : 1544454664602, 111 | "stop" : 1544454671355, 112 | "duration" : 6753 113 | } 114 | } ] 115 | }, 116 | "cf6e7fac3712db30f5a09d7a38b6bbbd" : { 117 | "statistic" : { 118 | "failed" : 0, 119 | "broken" : 0, 120 | "skipped" : 0, 121 | "passed" : 1, 122 | "unknown" : 0, 123 | "total" : 1 124 | }, 125 | "items" : [ { 126 | "uid" : "7cc7dcc35fe6a04b", 127 | "status" : "passed", 128 | "time" : { 129 | "start" : 1544454530818, 130 | "stop" : 1544454538795, 131 | "duration" : 7977 132 | } 133 | } ] 134 | }, 135 | "e4edfefa98b163dbb1d9d2e648335ca0" : { 136 | "statistic" : { 137 | "failed" : 0, 138 | "broken" : 0, 139 | "skipped" : 0, 140 | "passed" : 1, 141 | "unknown" : 0, 142 | "total" : 1 143 | }, 144 | "items" : [ { 145 | "uid" : "5860b241cf5d2e1b", 146 | "status" : "passed", 147 | "time" : { 148 | "start" : 1544454514222, 149 | "stop" : 1544454522470, 150 | "duration" : 8248 151 | } 152 | } ] 153 | }, 154 | "bb3a0849ab92ec7d1e3c26074fa8baeb" : { 155 | "statistic" : { 156 | "failed" : 0, 157 | "broken" : 0, 158 | "skipped" : 0, 159 | "passed" : 1, 160 | "unknown" : 0, 161 | "total" : 1 162 | }, 163 | "items" : [ { 164 | "uid" : "d821399e32050989", 165 | "status" : "passed", 166 | "time" : { 167 | "start" : 1544454522583, 168 | "stop" : 1544454530698, 169 | "duration" : 8115 170 | } 171 | } ] 172 | }, 173 | "424c0eb3ed7a7edf26c4c15660404a84" : { 174 | "statistic" : { 175 | "failed" : 0, 176 | "broken" : 0, 177 | "skipped" : 0, 178 | "passed" : 1, 179 | "unknown" : 0, 180 | "total" : 1 181 | }, 182 | "items" : [ { 183 | "uid" : "d482c6b69815b49b", 184 | "status" : "passed", 185 | "time" : { 186 | "start" : 1544454506067, 187 | "stop" : 1544454514120, 188 | "duration" : 8053 189 | } 190 | } ] 191 | }, 192 | "497a1938a0520647634d7c6a3bc0b5e1" : { 193 | "statistic" : { 194 | "failed" : 0, 195 | "broken" : 0, 196 | "skipped" : 0, 197 | "passed" : 1, 198 | "unknown" : 0, 199 | "total" : 1 200 | }, 201 | "items" : [ { 202 | "uid" : "531c86dbca320b6", 203 | "status" : "passed", 204 | "time" : { 205 | "start" : 1544459544236, 206 | "stop" : 1544459557293, 207 | "duration" : 13057 208 | } 209 | } ] 210 | }, 211 | "f9578f93a985c036800afaca57e6e257" : { 212 | "statistic" : { 213 | "failed" : 1, 214 | "broken" : 0, 215 | "skipped" : 0, 216 | "passed" : 0, 217 | "unknown" : 0, 218 | "total" : 1 219 | }, 220 | "items" : [ { 221 | "uid" : "f7baf1f4205bdcad", 222 | "status" : "failed", 223 | "statusDetails" : "AssertionError: ", 224 | "time" : { 225 | "start" : 1544454568380, 226 | "stop" : 1544454657131, 227 | "duration" : 88751 228 | } 229 | } ] 230 | }, 231 | "3e73226834e78092a3727f3ebe85eada" : { 232 | "statistic" : { 233 | "failed" : 0, 234 | "broken" : 0, 235 | "skipped" : 0, 236 | "passed" : 1, 237 | "unknown" : 0, 238 | "total" : 1 239 | }, 240 | "items" : [ { 241 | "uid" : "10cc6bed2ef232d2", 242 | "status" : "passed", 243 | "time" : { 244 | "start" : 1544454562064, 245 | "stop" : 1544454568217, 246 | "duration" : 6153 247 | } 248 | } ] 249 | }, 250 | "59d464324fac86733c83dc1cdb4d9cfe" : { 251 | "statistic" : { 252 | "failed" : 0, 253 | "broken" : 0, 254 | "skipped" : 0, 255 | "passed" : 1, 256 | "unknown" : 0, 257 | "total" : 1 258 | }, 259 | "items" : [ { 260 | "uid" : "a942a48fbd3c1a52", 261 | "status" : "passed", 262 | "time" : { 263 | "start" : 1544454658069, 264 | "stop" : 1544454664443, 265 | "duration" : 6374 266 | } 267 | } ] 268 | }, 269 | "7740b77787667323ebdec098f8ecfa0b" : { 270 | "statistic" : { 271 | "failed" : 1, 272 | "broken" : 0, 273 | "skipped" : 0, 274 | "passed" : 0, 275 | "unknown" : 0, 276 | "total" : 1 277 | }, 278 | "items" : [ { 279 | "uid" : "8f37ed817438dd60", 280 | "status" : "failed", 281 | "statusDetails" : "UiObjectNotFoundError: -32002 Client error: <> data: , method: None", 282 | "time" : { 283 | "start" : 1544454411191, 284 | "stop" : 1544454496904, 285 | "duration" : 85713 286 | } 287 | } ] 288 | } 289 | } -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 78 | -------------------------------------------------------------------------------- /logs/system.log: -------------------------------------------------------------------------------- 1 | [2018-12-11 00:32:24,238] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:27] 自动化测试开始! 2 | [2018-12-11 00:32:24,238] [INFO] [xinxideMacBook-Pro.local][driver.py - line:24] a3f8ca3a 3 | [2018-12-11 00:32:24,383] [INFO] [xinxideMacBook-Pro.local][driver.py - line:33] 连接设备:a3f8ca3a 4 | [2018-12-11 00:32:24,384] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:29] driver初始化 5 | [2018-12-11 00:32:37,289] [INFO] [xinxideMacBook-Pro.local][base.py - line:53] 点击元素:发现 6 | [2018-12-11 00:32:37,290] [INFO] [xinxideMacBook-Pro.local][test_find.py - line:26] 初始化首页模块 7 | [2018-12-11 00:32:37,292] [INFO] [xinxideMacBook-Pro.local][test_find.py - line:32] 测试发现 8 | [2018-12-11 00:32:37,294] [INFO] [xinxideMacBook-Pro.local][test_find.py - line:28] 结束首页模块 9 | [2018-12-11 00:32:37,294] [INFO] [xinxideMacBook-Pro.local][conftest.py - line:35] 自动化测试结束! 10 | [2018-12-11 12:00:30,575] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 11 | [2018-12-11 12:00:30,576] [INFO] [bogon][driver.py - line:24] a3f8ca3a 12 | [2018-12-11 12:00:30,913] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 13 | [2018-12-11 12:00:30,914] [INFO] [bogon][conftest.py - line:29] driver初始化 14 | [2018-12-11 12:00:40,183] [INFO] [bogon][base.py - line:53] 点击元素:发现 15 | [2018-12-11 12:00:40,184] [INFO] [bogon][test_find.py - line:26] 初始化首页模块 16 | [2018-12-11 12:00:40,187] [INFO] [bogon][test_find.py - line:32] 测试发现 17 | [2018-12-11 12:00:40,189] [INFO] [bogon][test_find.py - line:28] 结束首页模块 18 | [2018-12-11 12:00:40,189] [INFO] [bogon][conftest.py - line:35] 自动化测试结束! 19 | [2018-12-11 12:00:51,308] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 20 | [2018-12-11 12:00:51,308] [INFO] [bogon][driver.py - line:24] a3f8ca3a 21 | [2018-12-11 12:00:51,453] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 22 | [2018-12-11 12:00:51,454] [INFO] [bogon][conftest.py - line:29] driver初始化 23 | [2018-12-11 12:00:58,687] [INFO] [bogon][base.py - line:53] 点击元素:发现 24 | [2018-12-11 12:00:58,690] [INFO] [bogon][test_find.py - line:26] 初始化首页模块 25 | [2018-12-11 12:00:58,692] [INFO] [bogon][test_find.py - line:32] 测试发现 26 | [2018-12-11 12:00:58,694] [INFO] [bogon][test_find.py - line:28] 结束首页模块 27 | [2018-12-11 12:00:58,694] [INFO] [bogon][conftest.py - line:35] 自动化测试结束! 28 | [2018-12-11 12:13:02,819] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 29 | [2018-12-11 12:13:02,819] [INFO] [bogon][driver.py - line:24] a3f8ca3a 30 | [2018-12-11 12:13:03,014] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 31 | [2018-12-11 12:13:03,014] [INFO] [bogon][conftest.py - line:29] driver初始化 32 | [2018-12-11 12:13:12,088] [INFO] [bogon][base.py - line:53] 点击元素:发现 33 | [2018-12-11 12:13:12,089] [INFO] [bogon][test_find.py - line:26] 初始化首页模块 34 | [2018-12-11 12:13:12,092] [INFO] [bogon][test_find.py - line:32] 测试发现 35 | [2018-12-11 12:13:12,093] [INFO] [bogon][test_find.py - line:28] 结束首页模块 36 | [2018-12-11 12:13:12,094] [INFO] [bogon][conftest.py - line:35] 自动化测试结束! 37 | [2018-12-11 12:13:43,903] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 38 | [2018-12-11 12:13:43,903] [INFO] [bogon][driver.py - line:24] a3f8ca3a 39 | [2018-12-11 12:13:44,067] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 40 | [2018-12-11 12:13:44,068] [INFO] [bogon][conftest.py - line:29] driver初始化 41 | [2018-12-11 12:13:48,027] [INFO] [bogon][conftest.py - line:35] 自动化测试结束! 42 | [2018-12-11 12:14:26,557] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 43 | [2018-12-11 12:14:26,557] [INFO] [bogon][driver.py - line:24] a3f8ca3a 44 | [2018-12-11 12:14:26,707] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 45 | [2018-12-11 12:14:26,708] [INFO] [bogon][conftest.py - line:29] driver初始化 46 | [2018-12-11 12:14:30,693] [INFO] [bogon][test_find.py - line:35] 测试发现1 47 | [2018-12-11 12:14:30,695] [INFO] [bogon][conftest.py - line:35] 自动化测试结束! 48 | [2018-12-11 12:15:02,733] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 49 | [2018-12-11 12:15:02,734] [INFO] [bogon][driver.py - line:24] a3f8ca3a 50 | [2018-12-11 12:15:02,887] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 51 | [2018-12-11 12:15:02,888] [INFO] [bogon][conftest.py - line:29] driver初始化 52 | [2018-12-11 12:15:06,863] [INFO] [bogon][test_find.py - line:35] 测试发现1 53 | [2018-12-11 12:15:06,865] [INFO] [bogon][conftest.py - line:35] 自动化测试结束! 54 | [2018-12-11 12:16:55,432] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 55 | [2018-12-11 12:16:55,432] [INFO] [bogon][driver.py - line:24] a3f8ca3a 56 | [2018-12-11 12:16:55,577] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 57 | [2018-12-11 12:16:55,578] [INFO] [bogon][conftest.py - line:29] driver初始化 58 | [2018-12-11 12:16:59,708] [INFO] [bogon][test_find.py - line:35] 测试发现1 59 | [2018-12-11 12:16:59,709] [INFO] [bogon][conftest.py - line:35] 自动化测试结束! 60 | [2018-12-11 13:16:22,954] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 61 | [2018-12-11 13:16:22,955] [INFO] [bogon][driver.py - line:24] a3f8ca3a 62 | [2018-12-11 13:16:23,282] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 63 | [2018-12-11 13:16:23,283] [INFO] [bogon][conftest.py - line:29] driver初始化 64 | [2018-12-11 13:16:27,875] [INFO] [bogon][test_find.py - line:38] 测试发现2 65 | [2018-12-11 13:16:27,877] [INFO] [bogon][conftest.py - line:35] 自动化测试结束! 66 | [2018-12-11 13:16:28,006] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 67 | [2018-12-11 13:16:28,006] [INFO] [bogon][driver.py - line:24] a3f8ca3a 68 | [2018-12-11 13:16:28,152] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 69 | [2018-12-11 13:16:28,153] [INFO] [bogon][conftest.py - line:29] driver初始化 70 | [2018-12-11 13:16:32,023] [INFO] [bogon][test_find.py - line:35] 测试发现1 71 | [2018-12-11 13:16:32,025] [INFO] [bogon][conftest.py - line:35] 自动化测试结束! 72 | [2018-12-11 13:18:33,470] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 73 | [2018-12-11 13:18:33,470] [INFO] [bogon][driver.py - line:24] a3f8ca3a 74 | [2018-12-11 13:18:33,632] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 75 | [2018-12-11 13:18:33,633] [INFO] [bogon][conftest.py - line:29] driver初始化 76 | [2018-12-11 13:18:37,554] [INFO] [bogon][test_find.py - line:38] 测试发现2 77 | [2018-12-11 13:18:37,555] [INFO] [bogon][conftest.py - line:35] 自动化测试结束! 78 | [2018-12-11 13:18:37,811] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 79 | [2018-12-11 13:18:37,812] [INFO] [bogon][driver.py - line:24] a3f8ca3a 80 | [2018-12-11 13:18:37,932] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 81 | [2018-12-11 13:18:37,933] [INFO] [bogon][conftest.py - line:29] driver初始化 82 | [2018-12-11 13:18:41,809] [INFO] [bogon][test_find.py - line:35] 测试发现1 83 | [2018-12-11 13:18:41,810] [INFO] [bogon][conftest.py - line:35] 自动化测试结束! 84 | [2018-12-11 14:02:24,978] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 85 | [2018-12-11 14:02:24,979] [INFO] [bogon][driver.py - line:24] a3f8ca3a 86 | [2018-12-11 14:02:25,219] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 87 | [2018-12-11 14:02:25,220] [INFO] [bogon][conftest.py - line:29] driver初始化 88 | [2018-12-11 14:02:44,966] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 89 | [2018-12-11 14:03:29,522] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 90 | [2018-12-11 14:03:29,522] [INFO] [bogon][driver.py - line:24] a3f8ca3a 91 | [2018-12-11 14:03:29,662] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 92 | [2018-12-11 14:03:29,663] [INFO] [bogon][conftest.py - line:29] driver初始化 93 | [2018-12-11 14:03:49,194] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 94 | [2018-12-11 14:04:31,280] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 95 | [2018-12-11 14:04:31,280] [INFO] [bogon][driver.py - line:24] a3f8ca3a 96 | [2018-12-11 14:04:31,413] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 97 | [2018-12-11 14:04:31,414] [INFO] [bogon][conftest.py - line:29] driver初始化 98 | [2018-12-11 14:04:51,062] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 99 | [2018-12-11 14:05:44,107] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 100 | [2018-12-11 14:05:44,107] [INFO] [bogon][driver.py - line:24] a3f8ca3a 101 | [2018-12-11 14:05:44,243] [INFO] [bogon][driver.py - line:33] 连接设备:a3f8ca3a 102 | [2018-12-11 14:05:44,244] [INFO] [bogon][conftest.py - line:29] driver初始化 103 | [2018-12-11 14:05:59,219] [INFO] [bogon][base.py - line:53] 点击元素:发现 104 | [2018-12-11 14:05:59,220] [INFO] [bogon][test_find.py - line:26] 初始化首页模块 105 | [2018-12-11 14:05:59,223] [INFO] [bogon][test_find.py - line:36] 测试发现 106 | [2018-12-11 14:05:59,224] [INFO] [bogon][test_find.py - line:28] 结束首页模块 107 | [2018-12-11 14:05:59,224] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 108 | [2018-12-11 15:19:03,678] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 109 | [2018-12-11 15:19:03,678] [INFO] [bogon][driver.py - line:24] a3f8ca3a 110 | [2018-12-11 15:19:03,679] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 111 | [2018-12-11 15:19:03,680] [INFO] [bogon][conftest.py - line:29] driver初始化 112 | [2018-12-11 15:19:15,671] [INFO] [bogon][base.py - line:53] 点击元素:发现 113 | [2018-12-11 15:19:15,672] [INFO] [bogon][test_find.py - line:26] 初始化首页模块 114 | [2018-12-11 15:19:15,673] [INFO] [bogon][test_find.py - line:36] 测试发现 115 | [2018-12-11 15:19:15,675] [INFO] [bogon][test_find.py - line:28] 结束首页模块 116 | [2018-12-11 15:19:15,675] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 117 | [2018-12-11 15:21:37,556] [INFO] [bogon][run.py - line:20] 初始化运行环境! 118 | [2018-12-11 15:21:39,111] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 119 | [2018-12-11 15:21:39,111] [INFO] [bogon][driver.py - line:24] a3f8ca3a 120 | [2018-12-11 15:21:39,112] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 121 | [2018-12-11 15:21:39,112] [INFO] [bogon][conftest.py - line:29] driver初始化 122 | [2018-12-11 15:21:52,963] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 123 | [2018-12-11 15:22:31,487] [INFO] [bogon][run.py - line:20] 初始化运行环境! 124 | [2018-12-11 15:22:33,001] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 125 | [2018-12-11 15:22:33,002] [INFO] [bogon][driver.py - line:24] a3f8ca3a 126 | [2018-12-11 15:22:33,003] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 127 | [2018-12-11 15:22:33,003] [INFO] [bogon][conftest.py - line:29] driver初始化 128 | [2018-12-11 15:22:41,080] [INFO] [bogon][base.py - line:53] 点击元素:我的 129 | [2018-12-11 15:22:41,209] [INFO] [bogon][test_login.py - line:27] 初始化登录模块 130 | [2018-12-11 15:22:42,919] [INFO] [bogon][base.py - line:53] 点击元素:头像 131 | [2018-12-11 15:22:43,350] [INFO] [bogon][base.py - line:67] 账号 132 | [2018-12-11 15:22:44,076] [INFO] [bogon][base.py - line:67] 密码 133 | [2018-12-11 15:22:45,599] [INFO] [bogon][base.py - line:53] 点击元素:登录 134 | [2018-12-11 15:22:47,048] [INFO] [bogon][base.py - line:173] 断言我的发布元素存在,失败! 135 | [2018-12-11 15:22:47,120] [INFO] [bogon][test_login.py - line:29] 结束登录模块 136 | [2018-12-11 15:22:47,120] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 137 | [2018-12-11 15:22:49,950] [INFO] [bogon][run.py - line:27] 报告地址:/Users/xinxi/PycharmProjects/atxdemo/reports/index.html 138 | [2018-12-11 15:23:30,151] [INFO] [bogon][run.py - line:20] 初始化运行环境! 139 | [2018-12-11 15:23:31,709] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 140 | [2018-12-11 15:23:31,709] [INFO] [bogon][driver.py - line:24] a3f8ca3a 141 | [2018-12-11 15:23:31,710] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 142 | [2018-12-11 15:23:31,710] [INFO] [bogon][conftest.py - line:29] driver初始化 143 | [2018-12-11 15:23:41,195] [INFO] [bogon][base.py - line:53] 点击元素:消息 144 | [2018-12-11 15:23:41,428] [INFO] [bogon][test_news.py - line:24] 初始化消息模块 145 | [2018-12-11 15:23:43,136] [INFO] [bogon][base.py - line:53] 点击元素:精选活动 146 | [2018-12-11 15:23:43,138] [INFO] [bogon][test_news.py - line:26] 结束消息模块 147 | [2018-12-11 15:23:43,138] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 148 | [2018-12-11 15:23:43,379] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 149 | [2018-12-11 15:23:43,379] [INFO] [bogon][driver.py - line:24] a3f8ca3a 150 | [2018-12-11 15:23:43,380] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 151 | [2018-12-11 15:23:43,380] [INFO] [bogon][conftest.py - line:29] driver初始化 152 | [2018-12-11 15:23:50,718] [INFO] [bogon][base.py - line:53] 点击元素:发布 153 | [2018-12-11 15:23:50,970] [INFO] [bogon][test_push.py - line:35] 初始化发布模块 154 | [2018-12-11 15:23:52,550] [INFO] [bogon][base.py - line:53] 点击元素:装修建材 155 | [2018-12-11 15:23:52,778] [INFO] [bogon][base.py - line:139] 点击返回 156 | [2018-12-11 15:23:52,780] [INFO] [bogon][test_push.py - line:37] 结束发布模块 157 | [2018-12-11 15:23:52,780] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 158 | [2018-12-11 15:23:53,099] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 159 | [2018-12-11 15:23:53,099] [INFO] [bogon][driver.py - line:24] a3f8ca3a 160 | [2018-12-11 15:23:53,099] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 161 | [2018-12-11 15:23:53,099] [INFO] [bogon][conftest.py - line:29] driver初始化 162 | [2018-12-11 15:24:02,184] [INFO] [bogon][base.py - line:53] 点击元素:发布 163 | [2018-12-11 15:24:02,385] [INFO] [bogon][test_push.py - line:35] 初始化发布模块 164 | [2018-12-11 15:24:04,030] [INFO] [bogon][base.py - line:53] 点击元素:房产 165 | [2018-12-11 15:24:04,247] [INFO] [bogon][base.py - line:139] 点击返回 166 | [2018-12-11 15:24:04,248] [INFO] [bogon][test_push.py - line:37] 结束发布模块 167 | [2018-12-11 15:24:04,249] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 168 | [2018-12-11 15:24:04,426] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 169 | [2018-12-11 15:24:04,427] [INFO] [bogon][driver.py - line:24] a3f8ca3a 170 | [2018-12-11 15:24:04,428] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 171 | [2018-12-11 15:24:04,428] [INFO] [bogon][conftest.py - line:29] driver初始化 172 | [2018-12-11 15:24:12,942] [INFO] [bogon][base.py - line:53] 点击元素:发布 173 | [2018-12-11 15:24:13,121] [INFO] [bogon][test_push.py - line:35] 初始化发布模块 174 | [2018-12-11 15:24:14,677] [INFO] [bogon][base.py - line:53] 点击元素:本地服务 175 | [2018-12-11 15:24:14,896] [INFO] [bogon][base.py - line:139] 点击返回 176 | [2018-12-11 15:24:14,898] [INFO] [bogon][test_push.py - line:37] 结束发布模块 177 | [2018-12-11 15:24:14,898] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 178 | [2018-12-11 15:24:15,033] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 179 | [2018-12-11 15:24:15,034] [INFO] [bogon][driver.py - line:24] a3f8ca3a 180 | [2018-12-11 15:24:15,035] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 181 | [2018-12-11 15:24:15,035] [INFO] [bogon][conftest.py - line:29] driver初始化 182 | [2018-12-11 15:24:23,287] [INFO] [bogon][base.py - line:53] 点击元素:发布 183 | [2018-12-11 15:24:23,434] [INFO] [bogon][test_push.py - line:35] 初始化发布模块 184 | [2018-12-11 15:24:25,013] [INFO] [bogon][base.py - line:53] 点击元素:汽车服务 185 | [2018-12-11 15:24:25,247] [INFO] [bogon][base.py - line:139] 点击返回 186 | [2018-12-11 15:24:25,249] [INFO] [bogon][test_push.py - line:37] 结束发布模块 187 | [2018-12-11 15:24:25,249] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 188 | [2018-12-11 15:24:25,392] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 189 | [2018-12-11 15:24:25,393] [INFO] [bogon][driver.py - line:24] a3f8ca3a 190 | [2018-12-11 15:24:25,393] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 191 | [2018-12-11 15:24:25,393] [INFO] [bogon][conftest.py - line:29] driver初始化 192 | [2018-12-11 15:24:34,137] [INFO] [bogon][base.py - line:53] 点击元素:发布 193 | [2018-12-11 15:24:34,317] [INFO] [bogon][test_push.py - line:35] 初始化发布模块 194 | [2018-12-11 15:24:35,942] [INFO] [bogon][base.py - line:53] 点击元素:二手车 195 | [2018-12-11 15:24:36,195] [INFO] [bogon][base.py - line:139] 点击返回 196 | [2018-12-11 15:24:36,195] [INFO] [bogon][test_push.py - line:37] 结束发布模块 197 | [2018-12-11 15:24:36,196] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 198 | [2018-12-11 15:24:36,510] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 199 | [2018-12-11 15:24:36,510] [INFO] [bogon][driver.py - line:24] a3f8ca3a 200 | [2018-12-11 15:24:36,511] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 201 | [2018-12-11 15:24:36,511] [INFO] [bogon][conftest.py - line:29] driver初始化 202 | [2018-12-11 15:24:44,950] [INFO] [bogon][base.py - line:53] 点击元素:发布 203 | [2018-12-11 15:24:45,310] [INFO] [bogon][test_push.py - line:35] 初始化发布模块 204 | [2018-12-11 15:24:46,834] [INFO] [bogon][base.py - line:53] 点击元素:家政服务 205 | [2018-12-11 15:24:47,057] [INFO] [bogon][base.py - line:139] 点击返回 206 | [2018-12-11 15:24:47,058] [INFO] [bogon][test_push.py - line:37] 结束发布模块 207 | [2018-12-11 15:24:47,058] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 208 | [2018-12-11 15:24:47,265] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 209 | [2018-12-11 15:24:47,266] [INFO] [bogon][driver.py - line:24] a3f8ca3a 210 | [2018-12-11 15:24:47,266] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 211 | [2018-12-11 15:24:47,266] [INFO] [bogon][conftest.py - line:29] driver初始化 212 | [2018-12-11 15:24:56,225] [INFO] [bogon][base.py - line:53] 点击元素:发现 213 | [2018-12-11 15:24:56,225] [INFO] [bogon][test_find.py - line:26] 初始化首页模块 214 | [2018-12-11 15:24:56,227] [INFO] [bogon][test_find.py - line:36] 测试发现 215 | [2018-12-11 15:24:56,228] [INFO] [bogon][test_find.py - line:28] 结束首页模块 216 | [2018-12-11 15:24:56,229] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 217 | [2018-12-11 15:24:56,396] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 218 | [2018-12-11 15:24:56,396] [INFO] [bogon][driver.py - line:24] a3f8ca3a 219 | [2018-12-11 15:24:56,397] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 220 | [2018-12-11 15:24:56,397] [INFO] [bogon][conftest.py - line:29] driver初始化 221 | [2018-12-11 15:25:05,878] [INFO] [bogon][base.py - line:53] 点击元素:我的 222 | [2018-12-11 15:25:06,096] [INFO] [bogon][test_login.py - line:27] 初始化登录模块 223 | [2018-12-11 15:25:07,720] [INFO] [bogon][base.py - line:53] 点击元素:头像 224 | [2018-12-11 15:25:22,989] [INFO] [bogon][test_login.py - line:29] 结束登录模块 225 | [2018-12-11 15:25:22,990] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 226 | [2018-12-11 15:25:23,207] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 227 | [2018-12-11 15:25:23,207] [INFO] [bogon][driver.py - line:24] a3f8ca3a 228 | [2018-12-11 15:25:23,208] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 229 | [2018-12-11 15:25:23,208] [INFO] [bogon][conftest.py - line:29] driver初始化 230 | [2018-12-11 15:25:43,202] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 231 | [2018-12-11 15:25:43,385] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 232 | [2018-12-11 15:25:43,385] [INFO] [bogon][driver.py - line:24] a3f8ca3a 233 | [2018-12-11 15:25:43,385] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 234 | [2018-12-11 15:25:43,386] [INFO] [bogon][conftest.py - line:29] driver初始化 235 | [2018-12-11 15:25:52,798] [INFO] [bogon][base.py - line:53] 点击元素:我的 236 | [2018-12-11 15:25:52,930] [INFO] [bogon][test_login.py - line:27] 初始化登录模块 237 | [2018-12-11 15:25:54,727] [INFO] [bogon][base.py - line:53] 点击元素:头像 238 | [2018-12-11 15:26:10,971] [INFO] [bogon][test_login.py - line:29] 结束登录模块 239 | [2018-12-11 15:26:10,972] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 240 | [2018-12-11 15:26:11,202] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 241 | [2018-12-11 15:26:11,203] [INFO] [bogon][driver.py - line:24] a3f8ca3a 242 | [2018-12-11 15:26:11,204] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 243 | [2018-12-11 15:26:11,205] [INFO] [bogon][conftest.py - line:29] driver初始化 244 | [2018-12-11 15:26:15,451] [INFO] [bogon][test_home.py - line:24] 初始化首页模块 245 | [2018-12-11 15:26:18,971] [INFO] [bogon][base.py - line:105] 向下滑动 246 | [2018-12-11 15:26:18,971] [INFO] [bogon][base.py - line:130] 向下滑动 247 | [2018-12-11 15:26:24,849] [INFO] [bogon][base.py - line:105] 向下滑动 248 | [2018-12-11 15:26:24,851] [INFO] [bogon][base.py - line:130] 向下滑动 249 | [2018-12-11 15:26:30,072] [INFO] [bogon][base.py - line:105] 向下滑动 250 | [2018-12-11 15:26:30,072] [INFO] [bogon][base.py - line:130] 向下滑动 251 | [2018-12-11 15:26:34,541] [INFO] [bogon][base.py - line:105] 向下滑动 252 | [2018-12-11 15:26:34,544] [INFO] [bogon][base.py - line:130] 向下滑动 253 | [2018-12-11 15:26:39,188] [INFO] [bogon][base.py - line:105] 向下滑动 254 | [2018-12-11 15:26:39,188] [INFO] [bogon][base.py - line:130] 向下滑动 255 | [2018-12-11 15:26:41,652] [INFO] [bogon][base.py - line:173] 断言推荐元素存在,失败! 256 | [2018-12-11 15:26:41,661] [INFO] [bogon][test_home.py - line:26] 结束首页模块 257 | [2018-12-11 15:26:41,661] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 258 | [2018-12-11 15:26:41,856] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 259 | [2018-12-11 15:26:41,856] [INFO] [bogon][driver.py - line:24] a3f8ca3a 260 | [2018-12-11 15:26:41,857] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 261 | [2018-12-11 15:26:41,857] [INFO] [bogon][conftest.py - line:29] driver初始化 262 | [2018-12-11 15:26:46,079] [INFO] [bogon][test_home.py - line:24] 初始化首页模块 263 | [2018-12-11 15:26:49,634] [INFO] [bogon][base.py - line:105] 向下滑动 264 | [2018-12-11 15:26:49,634] [INFO] [bogon][base.py - line:130] 向下滑动 265 | [2018-12-11 15:26:54,444] [INFO] [bogon][base.py - line:105] 向下滑动 266 | [2018-12-11 15:26:54,445] [INFO] [bogon][base.py - line:130] 向下滑动 267 | [2018-12-11 15:26:59,770] [INFO] [bogon][base.py - line:105] 向下滑动 268 | [2018-12-11 15:26:59,771] [INFO] [bogon][base.py - line:130] 向下滑动 269 | [2018-12-11 15:27:04,844] [INFO] [bogon][base.py - line:105] 向下滑动 270 | [2018-12-11 15:27:04,844] [INFO] [bogon][base.py - line:130] 向下滑动 271 | [2018-12-11 15:27:10,003] [INFO] [bogon][base.py - line:105] 向下滑动 272 | [2018-12-11 15:27:10,003] [INFO] [bogon][base.py - line:130] 向下滑动 273 | [2018-12-11 15:27:12,983] [INFO] [bogon][base.py - line:173] 断言推荐元素存在,失败! 274 | [2018-12-11 15:27:12,995] [INFO] [bogon][test_home.py - line:26] 结束首页模块 275 | [2018-12-11 15:27:12,996] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 276 | [2018-12-11 15:27:13,158] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 277 | [2018-12-11 15:27:13,158] [INFO] [bogon][driver.py - line:24] a3f8ca3a 278 | [2018-12-11 15:27:13,159] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 279 | [2018-12-11 15:27:13,159] [INFO] [bogon][conftest.py - line:29] driver初始化 280 | [2018-12-11 15:27:17,411] [INFO] [bogon][test_home.py - line:24] 初始化首页模块 281 | [2018-12-11 15:27:20,966] [INFO] [bogon][base.py - line:105] 向下滑动 282 | [2018-12-11 15:27:20,966] [INFO] [bogon][base.py - line:130] 向下滑动 283 | [2018-12-11 15:27:26,795] [INFO] [bogon][base.py - line:105] 向下滑动 284 | [2018-12-11 15:27:26,796] [INFO] [bogon][base.py - line:130] 向下滑动 285 | [2018-12-11 15:27:30,994] [INFO] [bogon][base.py - line:105] 向下滑动 286 | [2018-12-11 15:27:30,994] [INFO] [bogon][base.py - line:130] 向下滑动 287 | [2018-12-11 15:27:35,397] [INFO] [bogon][base.py - line:105] 向下滑动 288 | [2018-12-11 15:27:35,398] [INFO] [bogon][base.py - line:130] 向下滑动 289 | [2018-12-11 15:27:39,698] [INFO] [bogon][base.py - line:105] 向下滑动 290 | [2018-12-11 15:27:39,698] [INFO] [bogon][base.py - line:130] 向下滑动 291 | [2018-12-11 15:27:41,748] [INFO] [bogon][base.py - line:173] 断言推荐元素存在,失败! 292 | [2018-12-11 15:27:41,757] [INFO] [bogon][test_home.py - line:26] 结束首页模块 293 | [2018-12-11 15:27:41,757] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 294 | [2018-12-11 15:27:41,983] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 295 | [2018-12-11 15:27:41,983] [INFO] [bogon][driver.py - line:24] a3f8ca3a 296 | [2018-12-11 15:27:41,983] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 297 | [2018-12-11 15:27:41,984] [INFO] [bogon][conftest.py - line:29] driver初始化 298 | [2018-12-11 15:27:46,310] [INFO] [bogon][test_home.py - line:24] 初始化首页模块 299 | [2018-12-11 15:27:49,423] [INFO] [bogon][base.py - line:53] 点击元素:搜索 300 | [2018-12-11 15:27:49,844] [INFO] [bogon][base.py - line:67] 文员 301 | [2018-12-11 15:27:49,909] [INFO] [bogon][base.py - line:139] 点击返回 302 | [2018-12-11 15:27:50,151] [INFO] [bogon][base.py - line:139] 点击返回 303 | [2018-12-11 15:27:50,152] [INFO] [bogon][test_home.py - line:26] 结束首页模块 304 | [2018-12-11 15:27:50,152] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 305 | [2018-12-11 15:27:50,355] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 306 | [2018-12-11 15:27:50,355] [INFO] [bogon][driver.py - line:24] a3f8ca3a 307 | [2018-12-11 15:27:50,355] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 308 | [2018-12-11 15:27:50,355] [INFO] [bogon][conftest.py - line:29] driver初始化 309 | [2018-12-11 15:27:54,801] [INFO] [bogon][test_home.py - line:24] 初始化首页模块 310 | [2018-12-11 15:27:58,727] [INFO] [bogon][base.py - line:53] 点击元素:搜索 311 | [2018-12-11 15:27:59,681] [INFO] [bogon][base.py - line:67] 文员 312 | [2018-12-11 15:27:59,683] [INFO] [bogon][test_home.py - line:26] 结束首页模块 313 | [2018-12-11 15:27:59,683] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 314 | [2018-12-11 15:27:59,840] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 315 | [2018-12-11 15:27:59,841] [INFO] [bogon][driver.py - line:24] a3f8ca3a 316 | [2018-12-11 15:27:59,841] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 317 | [2018-12-11 15:27:59,841] [INFO] [bogon][conftest.py - line:29] driver初始化 318 | [2018-12-11 15:28:04,210] [INFO] [bogon][test_home.py - line:24] 初始化首页模块 319 | [2018-12-11 15:28:08,258] [INFO] [bogon][base.py - line:53] 点击元素:搜索 320 | [2018-12-11 15:28:08,890] [INFO] [bogon][base.py - line:67] 文员 321 | [2018-12-11 15:28:08,948] [INFO] [bogon][base.py - line:139] 点击返回 322 | [2018-12-11 15:28:09,179] [INFO] [bogon][base.py - line:139] 点击返回 323 | [2018-12-11 15:28:09,180] [INFO] [bogon][test_home.py - line:26] 结束首页模块 324 | [2018-12-11 15:28:09,181] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 325 | [2018-12-11 15:28:09,319] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 326 | [2018-12-11 15:28:09,320] [INFO] [bogon][driver.py - line:24] a3f8ca3a 327 | [2018-12-11 15:28:09,321] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 328 | [2018-12-11 15:28:09,321] [INFO] [bogon][conftest.py - line:29] driver初始化 329 | [2018-12-11 15:28:13,620] [INFO] [bogon][test_home.py - line:24] 初始化首页模块 330 | [2018-12-11 15:28:17,883] [INFO] [bogon][base.py - line:53] 点击元素:搜索 331 | [2018-12-11 15:28:18,610] [INFO] [bogon][base.py - line:67] 文员 332 | [2018-12-11 15:28:18,732] [INFO] [bogon][base.py - line:139] 点击返回 333 | [2018-12-11 15:28:18,924] [INFO] [bogon][base.py - line:139] 点击返回 334 | [2018-12-11 15:28:18,925] [INFO] [bogon][test_home.py - line:26] 结束首页模块 335 | [2018-12-11 15:28:18,926] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 336 | [2018-12-11 15:28:19,061] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 337 | [2018-12-11 15:28:19,061] [INFO] [bogon][driver.py - line:24] a3f8ca3a 338 | [2018-12-11 15:28:19,062] [INFO] [bogon][driver.py - line:34] 连接设备:a3f8ca3a 339 | [2018-12-11 15:28:19,062] [INFO] [bogon][conftest.py - line:29] driver初始化 340 | [2018-12-11 15:28:23,350] [INFO] [bogon][test_home.py - line:24] 初始化首页模块 341 | [2018-12-11 15:28:27,848] [INFO] [bogon][base.py - line:53] 点击元素:更多 342 | [2018-12-11 15:28:27,851] [INFO] [bogon][test_home.py - line:26] 结束首页模块 343 | [2018-12-11 15:28:27,852] [INFO] [bogon][conftest.py - line:34] 自动化测试结束! 344 | [2018-12-11 15:28:30,741] [INFO] [bogon][run.py - line:27] 报告地址:/Users/xinxi/PycharmProjects/atxdemo/reports/index.html 345 | [2018-12-11 20:44:19,683] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 346 | [2018-12-11 20:44:19,685] [INFO] [bogon][driver.py - line:25] a3f8ca3a 347 | [2018-12-11 20:44:19,687] [INFO] [bogon][driver.py - line:35] 连接设备:a3f8ca3a 348 | [2018-12-11 20:44:19,687] [INFO] [bogon][conftest.py - line:29] driver初始化 349 | [2018-12-11 20:45:02,569] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 350 | [2018-12-11 20:45:02,569] [INFO] [bogon][driver.py - line:25] a3f8ca3a 351 | [2018-12-11 20:45:02,570] [INFO] [bogon][driver.py - line:35] 连接设备:a3f8ca3a 352 | [2018-12-11 20:45:02,570] [INFO] [bogon][conftest.py - line:29] driver初始化 353 | [2018-12-11 20:45:40,006] [INFO] [bogon][conftest.py - line:27] 自动化测试开始! 354 | [2018-12-11 20:45:40,006] [INFO] [bogon][driver.py - line:25] a3f8ca3a 355 | [2018-12-11 20:45:40,007] [INFO] [bogon][driver.py - line:35] 连接设备:a3f8ca3a 356 | [2018-12-11 20:45:40,007] [INFO] [bogon][conftest.py - line:29] driver初始化 357 | [2018-12-11 20:46:02,860] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 358 | [2018-12-11 20:46:06,258] [INFO] [bogon][driver.py - line:49] 初始化ios端driver异常!global name 'time' is not defined 359 | [2018-12-11 20:46:06,259] [INFO] [bogon][conftest.py - line:116] driver初始化 360 | [2018-12-11 20:46:26,584] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 361 | [2018-12-11 20:46:32,465] [INFO] [bogon][conftest.py - line:116] driver初始化 362 | [2018-12-11 20:47:04,548] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 363 | [2018-12-11 20:47:10,674] [INFO] [bogon][conftest.py - line:116] driver初始化 364 | [2018-12-11 20:48:11,829] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 365 | [2018-12-11 20:48:17,801] [INFO] [bogon][conftest.py - line:116] driver初始化 366 | [2018-12-11 20:49:27,504] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 367 | [2018-12-11 20:49:33,268] [INFO] [bogon][conftest.py - line:116] driver初始化 368 | [2018-12-11 20:49:36,585] [INFO] [bogon][conftest.py - line:119] ios自动化测试结束! 369 | [2018-12-11 20:50:46,330] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 370 | [2018-12-11 20:50:54,041] [INFO] [bogon][conftest.py - line:116] driver初始化 371 | [2018-12-11 20:51:49,340] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 372 | [2018-12-11 20:52:00,144] [INFO] [bogon][conftest.py - line:116] driver初始化 373 | [2018-12-11 20:52:14,607] [INFO] [bogon][test_home.py - line:22] 初始化首页模块 374 | [2018-12-11 20:52:14,628] [INFO] [bogon][conftest.py - line:119] ios自动化测试结束! 375 | [2018-12-11 21:05:07,872] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 376 | [2018-12-11 21:05:11,597] [INFO] [bogon][driver.py - line:49] 初始化ios端driver异常!HTTPConnectionPool(host='localhost', port=8100): Max retries exceeded with url: /session/5BC56C4F-0D82-4136-A468-2D46ACD3BAD8 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused',)) 377 | [2018-12-11 21:05:11,597] [INFO] [bogon][conftest.py - line:116] driver初始化 378 | [2018-12-11 21:05:50,837] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 379 | [2018-12-11 21:05:51,864] [INFO] [bogon][driver.py - line:49] 初始化ios端driver异常!HTTPConnectionPool(host='localhost', port=8100): Max retries exceeded with url: /session (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused',)) 380 | [2018-12-11 21:05:51,864] [INFO] [bogon][conftest.py - line:116] driver初始化 381 | [2018-12-11 21:06:01,446] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 382 | [2018-12-11 21:06:02,471] [INFO] [bogon][driver.py - line:49] 初始化ios端driver异常!HTTPConnectionPool(host='localhost', port=8100): Max retries exceeded with url: /session (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused',)) 383 | [2018-12-11 21:06:02,472] [INFO] [bogon][conftest.py - line:116] driver初始化 384 | [2018-12-11 21:06:24,721] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 385 | [2018-12-11 21:06:25,743] [INFO] [bogon][driver.py - line:49] 初始化ios端driver异常!HTTPConnectionPool(host='localhost', port=8100): Max retries exceeded with url: /session (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused',)) 386 | [2018-12-11 21:06:25,744] [INFO] [bogon][conftest.py - line:116] driver初始化 387 | [2018-12-11 21:06:38,686] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 388 | [2018-12-11 21:06:39,709] [INFO] [bogon][driver.py - line:49] 初始化ios端driver异常!HTTPConnectionPool(host='localhost', port=8100): Max retries exceeded with url: /session (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused',)) 389 | [2018-12-11 21:06:39,710] [INFO] [bogon][conftest.py - line:116] driver初始化 390 | [2018-12-11 21:07:21,095] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 391 | [2018-12-11 21:08:30,029] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 392 | [2018-12-11 21:08:31,058] [INFO] [bogon][driver.py - line:49] 初始化ios端driver异常!HTTPConnectionPool(host='localhost', port=8100): Max retries exceeded with url: /session (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused',)) 393 | [2018-12-11 21:08:31,058] [INFO] [bogon][conftest.py - line:116] driver初始化 394 | [2018-12-11 21:08:57,636] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 395 | [2018-12-11 21:08:58,662] [INFO] [bogon][driver.py - line:49] 初始化ios端driver异常!HTTPConnectionPool(host='localhost', port=8100): Max retries exceeded with url: /session (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused',)) 396 | [2018-12-11 21:08:58,662] [INFO] [bogon][conftest.py - line:116] driver初始化 397 | [2018-12-11 21:09:25,076] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 398 | [2018-12-11 21:09:26,098] [INFO] [bogon][driver.py - line:49] 初始化ios端driver异常!HTTPConnectionPool(host='localhost', port=8100): Max retries exceeded with url: /session (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused',)) 399 | [2018-12-11 21:09:26,099] [INFO] [bogon][conftest.py - line:116] driver初始化 400 | [2018-12-11 21:11:56,896] [INFO] [bogon][conftest.py - line:114] ios自动化测试开始! 401 | [2018-12-11 21:11:58,129] [INFO] [bogon][driver.py - line:49] 初始化ios端driver异常!('Connection aborted.', error(54, 'Connection reset by peer')) 402 | [2018-12-11 21:11:58,129] [INFO] [bogon][conftest.py - line:116] driver初始化 403 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 60 | 61 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 331 | 332 | 333 | 334 | 352 | 353 | 371 | 372 | 390 | 391 | 406 | 407 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 1544365908126 449 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 515 | 516 | 518 | 519 | 520 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 851 | 852 | 853 | 854 | 855 | 856 | --------------------------------------------------------------------------------