QCD_py
into master
@@ -0,0 +1,502 @@ | |||
# 一:pytest介绍 | |||
## 1、安装pytest | |||
pip install pytest | |||
## 2、对比pytest和unittest | |||
![image-20220907152714097](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220907152714097.png) | |||
pytest运行顺序,按用例定义的方法顺序执行。而unittest按ascii码执行。 | |||
## 3、pytest的运行方式 | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220907154337517.png" alt="image-20220907154337517" style="zoom:50%;" />、<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220907154431976.png" alt="image-20220907154431976" style="zoom:50%;" /> | |||
## 4、测试用例规范 | |||
### 用例的规则 | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220907154459771.png" alt="image-20220907154459771" style="zoom:50%;" /> | |||
```python | |||
""" | |||
pytest默认的编写规范 | |||
1、用例文件 以test开头 | |||
2、以test开头的函数会当成一条测试用例 | |||
3、以Test开头的类,会当成测试用例类,类中有不能init方法 | |||
测试类中,以test开头的函数会当成一条测试用例 | |||
""" | |||
import pytest | |||
def test_demo(): | |||
assert 1==100 | |||
class TestDemo: | |||
def test_demo1(self): | |||
assert 100 == 100 | |||
if __name__ == '__ | |||
``` | |||
### 自定义查找规则 | |||
在运行的文件的同级别创建一个==pytest.ini==文件,里面输入以下代码 | |||
![image-20220907160948608](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220907160948608.png) | |||
规则可自行定义,类、函数、文件按照规则运行用例 | |||
## 5、前置和后置 | |||
### 方式一:==setup_class、teardown_class、setup、teardown== | |||
```python | |||
lass TestDemo: | |||
@classmethod | |||
def setup_class(cls): | |||
"""类级别的前置方法""" | |||
print("类级别的前置方法") | |||
def setup(self): | |||
"""用例级别的前置方法""" | |||
print("用例级别的前置方法") | |||
def teardown(self): | |||
"""用例级别的后置方法""" | |||
print("用例级别的后置方法") | |||
@classmethod | |||
def teardown_class(cls): | |||
"""类级别的后置方法""" | |||
print("类级别的后置方法") | |||
def test_demo1(self): | |||
print("---------") | |||
assert 100 == 100 | |||
if __name__ == '__main__': | |||
pytest.main() | |||
``` | |||
### ==方式二:pytest.fixture定义前后置更高级的使用== | |||
注:在同一个文件里面,pytest用例执行的顺序,是按照用例文件中代码的前后顺序执行的;多个文件是根据文件名按ASCII码排序。 | |||
在定义前后置方法的时候(设置@pytest.fixture(scope="class",==autouse=True==) )表示为自动执行,不用在用例方法上加了。 (一般项目中很少使用,不好管控用例了) | |||
第一:新建一个conftest.py 用来存放前置后置方法 ==【注:文件名必须叫做 conftest.py】== 可方便用例文件中直接使用,不需要导入 | |||
```python | |||
""" | |||
coding:utf-8 | |||
@Software:用来专门定义类前置、后置,用例级别前置后置方法 【注:文件名必须叫做 conftest.py】 | |||
@Time:2022/9/7 18:42 | |||
""" | |||
import pytest | |||
@pytest.fixture(scope="class") # 定义夹具,根据类运行 | |||
def case_cls(): | |||
"""定义类级别的前置和后置""" | |||
print("-----类级别的前置代码在编写") | |||
yield # 用yield隔开,用来区分前置和后置代码 【注:yield是一个关键字,它不是单独存在的,要写在fixture标记的固件中】 | |||
print("-----类级别的后置代码在编写") | |||
@pytest.fixture(scope="function") #定义夹具,根据方法运行 | |||
def case_login(): | |||
"""定义用例级别的前置和后置""" | |||
print("-----用例级别的前置代码在编写") | |||
yield #用yield隔开,用来区分前置和后置代码 【注:yield是一个关键字,它不是单独存在的,要写在fixture标记的固件中】 | |||
print("-----用例级别的后置代码在编写") | |||
``` | |||
第二步:类和方法使用前置后置 | |||
```python | |||
""" | |||
coding:utf-8 | |||
@Software: | |||
@Time:2022/9/7 18:22 | |||
""" | |||
import pytest | |||
class TestFixture: | |||
#会先去conftest.py固定的文件中找有没有case_login这个方法,如果有运行前后置,如果没有则报错 | |||
def test_01(self,case_login):#表示test_01方法运行了case_login方法,调用了用例级别前后置 | |||
print('----test01-----') | |||
assert 1 ==1 | |||
def test_02(self,case_cls):#表示test_01方法运行了case_cls方法,调用了类级别前后置 | |||
print('----test02-----') | |||
assert 1 ==1 | |||
if __name__ == '__main__': | |||
pytest.main() | |||
``` | |||
scope参数为session:所有测试.py文件执行前执行一次 | |||
scope参数为module:每一个测试.py文件执行前都会执行一次conftest文件中的fixture | |||
scope参数为class:每一个测试文件中的测试类执行前都会执行一次conftest文件中的 | |||
scope参数为function:所有文件的测试用例执行前都会执行一次conftest文件中的fixture | |||
#### ==yield与fixture之间的使用:== fixture中不能用return只能与yield联合使用 | |||
用yield隔开,用来区分前置和后置代码 【注:yield是一个关键字,它不是单独存在的,要写在fixture标记的固件中】 | |||
还可用yield用来返回数据,可返回多个参数以,分隔;例如: | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20221011143907318.png" alt="image-20221011143907318" style="zoom:80%;" /> | |||
## 6、用例打标记 | |||
### 1、单条用例加标签: pytest.mark.标签名 | |||
![image-20220908163521676](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220908163521676.png) | |||
![image-20220908164126027](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220908164126027.png) | |||
![image-20220908181457895](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220908181457895.png) | |||
```python | |||
""" | |||
coding:utf-8 | |||
@Software:用例打标记 | |||
@Time:2022/9/8 16:45 | |||
""" | |||
import pytest | |||
class TestLogin: | |||
@pytest.mark.smoking # 引入标记smoking | |||
def test_login_success(self): | |||
"""登录成功: 正向用例""" | |||
assert "登录成功" == "登录成功" | |||
@pytest.mark.sysTest #引入标记sysTest | |||
def test_login_pwd(self): | |||
"""密码错误: 反向用例""" | |||
assert "密码错误" == "密码未输入" | |||
@pytest.mark.sysTest #引入标记sysTest | |||
def test_login_account(self): | |||
"""密码错误: 反向用例""" | |||
assert "账号错误" == "账号未输入" | |||
``` | |||
```python | |||
if __name__ == '__main__': | |||
pytest.main(['-v', '-m sysTest']) # -v 展示用例详细信息 -m仅执行指定标签的用例 此处的-m后面跟标签的名称 | |||
``` | |||
自定义了两个标签,在实际项目中,可用标签来运行,如定义smoking标签来运行冒烟测试用例,定义sysTest来运行系统测试用例 | |||
```python | |||
[pytest] | |||
markers = | |||
smoking | |||
sysTest | |||
``` | |||
### 2、类标记的方式pytest.mark.标签名 | |||
![image-20220908163507602](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220908163507602.png) | |||
### 3、跳过用例 pytest.mark.skip | |||
![image-20220908163828902](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220908163828902.png) | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220908163847161.png" alt="image-20220908163847161" style="zoom: 67%;" /> | |||
```python | |||
class TestDemo: | |||
a=100 | |||
@pytest.mark.skip #跳过此用例 | |||
def test_demo1(self): | |||
print("11111") | |||
assert 99 == 99 | |||
@pytest.mark.skipif(a==99,reason='a不等于99才执行该用例') #a=99条件满足才会跳过此用例 | |||
def test_demo2(self): | |||
print("222") | |||
assert 99 == 99 | |||
``` | |||
## 7、用例运行方式 | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220909143549908.png" alt="image-20220909143549908" style="zoom: 67%;" /> | |||
## 8、断言 | |||
pytest中断言,直接用关键字assert关键字 | |||
可用unittest中的断言,也可自己封装 | |||
## 9、测试报告allure | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220909175443443.png" alt="image-20220909175443443" style="zoom: 67%;" /> | |||
一般采用allure,报告页面很好看。 | |||
### allure的安装与使用 | |||
#### 1)安装 | |||
https://github.com/allure-framework/allure2/releases | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220909180328532.png" alt="image-20220909180328532" style="zoom:67%;" /> | |||
#### 2)添加环境变量 | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220909182609363.png" alt="image-20220909182609363" style="zoom: 50%;" /> | |||
#### 3)安装依赖包 | |||
#### pip install allure-pytest | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220909182839090.png" alt="image-20220909182839090" style="zoom: 67%;" /> | |||
![image-20220909182828078](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220909182828078.png) | |||
#### 4)执行测试,生成报告 | |||
执行用例的时候加上参数 --alluredir=报告数据存放的路径 | |||
```python | |||
import pytest | |||
#执行的用例文件,生成allureReports文件 | |||
pytest.main(['testcases/test_01register.py','--alluredir=allureReports']) | |||
``` | |||
#### 5)查看allure报告 | |||
进入项目路径,然后输入: ==allure serve 报告数据存放的路径== | |||
![image-20220909191701331](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220909191701331.png) | |||
#### 6)allure报告展示失败截图 | |||
import allure | |||
加入 | |||
#----------------将错误截图添加到allure报告中--------- | |||
with open(file_path,"rb") as f: | |||
file = f.read() | |||
allure.attach(file,"失败截图",allure.attachment_type.PNG) | |||
```python | |||
def error_save_screenshot(self, desc=None): | |||
""" | |||
错误截图 | |||
:return: | |||
""" | |||
i_date = time.strftime("%Y-%m-%d_%H%M%S_") | |||
filename = i_date + desc + '.png' | |||
file_path = os.path.join(ERROR_IMAGE_DIR, filename) | |||
try: | |||
self.driver.save_screenshot(file_path) | |||
except Exception as e: | |||
my_log.error("【{}】--操作进行截图--失败".format(desc)) | |||
my_log.exception(e) | |||
raise e | |||
else: | |||
#----------------将错误截图添加到allure报告中--------- | |||
with open(file_path,"rb") as f: | |||
file = f.read() | |||
allure.attach(file,"失败截图",allure.attachment_type.PNG) | |||
my_log.info("【{}】--操作进行截图--成功".format(desc)) | |||
my_log.info("图片名为{}".format(file_path)) | |||
``` | |||
#### 7)allure报告中显示用例标题、用例描述 | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20221025182400829.png" alt="image-20221025182400829" style="zoom:67%;" /> | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20221025181256967.png" alt="image-20221025181256967" style="zoom: 50%;" />、<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20221025181316599.png" alt="image-20221025181316599" style="zoom:50%;" /> | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20221025181332321.png" alt="image-20221025181332321" style="zoom: 50%;" />、<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20221025181851055.png" alt="image-20221025181851055" style="zoom:50%;" /> | |||
## 10、重运行机制 | |||
pip install pytest-rerunfailures | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220909192057616.png" alt="image-20220909192057616" style="zoom:67%;" /> | |||
```python | |||
import pytest | |||
if __name__ == '__main__': | |||
#执行用例,生成allure报告, 通过reruns指定失败重运行的次数, --reruns-delay指定失败之后重运行间隔的时间 | |||
pytest.main(['test_demo.py', | |||
'--reruns', '3', #重运行3次 | |||
'--reruns-delay', '5', #5s运行一次 | |||
'--alluredir=allureReports' | |||
]) | |||
``` | |||
## 11、参数化(数据驱动)等同于unittest中的ddt | |||
方法一:@pytest.mark.parametrize('定义一个接每条用例的名称',用例列表) | |||
![image-20220909155823482](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220909155823482.png) | |||
<img src="C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20220910200820751.png" alt="image-20220910200820751" style="zoom:67%;" /> | |||
## 12、修改用pytest运行方式 | |||
![image-20221011191204836](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20221011191204836.png) | |||
## 13、pytest.main()参数 | |||
pytest.main()是pytest单元测试框架的运行入口 | |||
main() 命令行可传入参数: | |||
-s: 显示程序中的print/logging输出 | |||
-v: 丰富信息模式, 输出更详细的用例执行信息 | |||
-q: 安静模式, 不输出环境信息 | |||
-x: 出现一条测试用例失败就退出测试 | |||
-k:可以使用and、not、or等逻辑运算符,匹配范围(文件名、类名、函数名) | |||
https://blog.csdn.net/weixin_44688529/article/details/124946250 | |||
# 14、数据驱动和关键字驱动 | |||
数据驱动:就是测试数据管理的一种形式,主要用于在进行自动化测试读取输入、输出的数据;然后通过变更传给自动化用例代码中;将测试数据与代码进行分离;易维护。 | |||
常用的数据驱动有excel、yaml、json、py、txt、csv、数据库里的数据等 | |||
excel:上手简单、技术门槛低;但不易于数据的维护管理 | |||
yaml:使用灵活,方便管理;技术门槛较高 | |||
关键字驱动:关键字的驱动的思想:就是函数的调用, 把反复常用的代码封装关键字,通过外部方法调用关键字来降低代码冗余。(其实就是面向编程思维)。 | |||
注:单接口的自动化测试可何用 excel数据驱动来实现 | |||
关联接口的自动化测试可用全局变量的形式来实现 | |||
注:一般情况下企业中都是数据驱动+关键字驱动一起使用。 | |||
# 15、pytest插件 | |||
pytest-html 生成 html格式的自动化测试报告 | |||
==pytest-xdist 测试用例分布式执行。多cpu分发== | |||
pytest-ordering 用于改变测试用例的执行顺序 | |||
pytest-rerunfailures 用例失败后重运行 | |||
allure-pytest 用于生成美观的测试报告 | |||
一键安装这些插件。可以用requirements.txt或者pipenv | |||
![image-20230222120049003](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20230222120049003.png) | |||
执行pip install -r requirements.txt | |||
![image-20230222120101783](C:\Users\liaoqin\AppData\Roaming\Typora\typora-user-images\image-20230222120101783.png) | |||
## 1)requirements.txt一键安装 | |||
第一步:将本地安装的python相关环境导出 | |||
首先要导出环境,windows如下: | |||
进入python的安装路径D:\program\python37\Scripts | |||
执行命令pip3 freeze > requirements.txt | |||
然后在这个安装路径就生成了requirements.txt | |||
第二步:将导出的requirements.txt环境在本地安装执行 | |||
1、在c盘的用户目录下新建一个pip文件夹,如:C:\Users\Administrator\pip | |||
2、在pip文件夹中,新建一个pip.ini文件 | |||
内容如下: | |||
[global] | |||
index-url = https://pypi.tuna.tsinghua.edu.cn/simple | |||
[install] | |||
trusted-host = pypi.tuna.tsinghua.edu.cn | |||
3、在要运行的python项目下新建一个requirements.txt文件。 | |||
4、requirements.txt里放一键部署环境的安装包(就是第一步导出的文件) | |||
5、在pycharm的Terminal终端执行:pip install -r requirements.txt | |||
参考:https://zhuanlan.zhihu.com/p/548926498 | |||
## 2)pipenv一键安装 | |||
``` | |||
python版本要求:3.9.5 | |||
安装pipenv: pip install pipenv(必须在项目根目录下) | |||
创建虚拟环境:pipenv install (必须在项目根目录下执行) | |||
激活已存在的虚拟环境(如果不存在会创建一个):pipenv shell (必须在项目根目录下执行) | |||
查看项目虚拟环境路径: pipenv --venv | |||
退出虚拟环境:exit | |||
注意:使用pipenv install会自动安装Pipfile里面的依赖包,该依赖包仅安装在虚拟环境里,不安装在测试机。 | |||
``` | |||
```` | |||
python版本为其他版本的安装办法: | |||
1)首先在项目根目录下打开命令窗口,移除虚拟环境:pipenv --rm | |||
2)更改项目根目录下的Pipfile文件 | |||
``` | |||
# 如下所示,3.9更改为3.7 | |||
[requires] | |||
python_version = "3.7" | |||
``` | |||
3)更改项目根目录下的Pipfile.lock文件 | |||
``` | |||
# 如下所示,3.9更改为3.7 | |||
"requires": { | |||
"python_version": "3.7" | |||
}, | |||
``` | |||
4)安装虚拟环境,同时安装依赖包:pipenv install | |||
5)激活虚拟环境:pipenv shell | |||
6)运行框架:python run.py | |||
```` |
@@ -0,0 +1,425 @@ | |||
""" | |||
coding:utf-8 | |||
@Software: | |||
封装一个所有页面的父类,在父类中封装一些页面常用的操作方法。 | |||
例如:查找元素、点击元素、输入内容、上传、错误截图、等待元素可见、等待元素可点击、等待元素存在、获取元素的属性、iframe切换、滑动操作等 | |||
优势:让页面继承base_page的好处,获取父类的方法。 | |||
@Time:2022/10/17 18:14 | |||
@Author:liaoqin | |||
""" | |||
import time,os,allure | |||
import pyautogui | |||
from selenium.webdriver import ActionChains | |||
from selenium.webdriver.remote.webdriver import WebDriver | |||
from selenium.webdriver.support import expected_conditions as EC | |||
from selenium.webdriver.support.wait import WebDriverWait | |||
from common.handle_log import my_log | |||
from common.handle_path import ERROR_IMAGE_DIR | |||
class BasePage: | |||
def __init__(self,driver:WebDriver):#driver:WebDriver声明 driver类型,方便后面使用driver时有提示信息 | |||
self.driver = driver | |||
def get_element(self,loc,desc=None): | |||
""" | |||
查找元素 | |||
:param loc:元素定位器 loc = ('id', 'kw') | |||
:param desc: 元素的描述 | |||
:return: | |||
""" | |||
try: | |||
ele = self.wait_element_visibility(loc,desc)#self.driver.find_element(*loc) | |||
except Exception as e: | |||
my_log.error("查找元素--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("查找元素--【{}】--成功".format(desc)) | |||
return ele | |||
def click_element(self, loc, desc=None): | |||
""" | |||
点击元素 | |||
:param loc:元素定位器 | |||
:param desc: 元素的描述 | |||
:return: | |||
""" | |||
try: | |||
ele = self.wait_element_clickable(loc) | |||
ele.click() | |||
except Exception as e: | |||
my_log.error("点击元素--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("点击元素--【{}】--成功".format(desc)) | |||
return ele | |||
def clear_input(self,loc,desc): | |||
""" | |||
清空输入框 | |||
:param loc:input框元素的定位器 | |||
:param desc:元素的描述 | |||
:return: | |||
""" | |||
try: | |||
self.driver.find_element(*loc).clear() | |||
except Exception as e: | |||
my_log.error("清空输入框--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("清空输入框--【{}】--成功".format(desc)) | |||
def double_click(self,loc,desc=None): | |||
""" | |||
双击元素 | |||
:param loc:元素定位器 loc = ('id', 'kw') | |||
:param desc: 元素的描述 | |||
:return: | |||
""" | |||
action = ActionChains(self.driver) | |||
try: | |||
ele = self.wait_element_clickable(loc) | |||
except Exception as e: | |||
my_log.error("双击元素--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("定位双击元素--【{}】--成功".format(desc)) | |||
action.double_click(ele).perform() #双击执行操作命令 | |||
return ele | |||
def input_send_keys(self, loc, value, desc=None): | |||
""" | |||
输入框,输入 | |||
:param loc: input框元素的定位器 | |||
:param value: 输入的值 | |||
:param desc: 元素的描述 | |||
:return: | |||
""" | |||
try: | |||
self.driver.find_element(*loc).send_keys(value) | |||
except Exception as e: | |||
my_log.error("往输入框--【{}】--输入值失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("往输入框--【{}】--输入值成功".format(desc)) | |||
def get_element_text(self, loc, desc=None): | |||
""" | |||
获取元素的文本 | |||
:param loc: 元素的定位器 | |||
:param desc: 元素的描述 | |||
:return: | |||
""" | |||
try: | |||
text = self.driver.find_element(*loc).text | |||
except Exception as e: | |||
my_log.error("查找元素--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("查找元素--【{}】--成功".format(desc)) | |||
return text | |||
def get_element_attribute(self, loc, attr, desc=None): | |||
""" | |||
获取元素的属性 | |||
:param loc: 元素的定位器 | |||
:param attr: 属性名 | |||
:param desc: 元素的描述 | |||
:return: | |||
""" | |||
try: | |||
res = self.driver.find_element(*loc).get_attribute(attr) | |||
except Exception as e: | |||
my_log.error("获取元素--【{}】--的属性失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("获取元素--【{}】--的属性成功".format(desc)) | |||
return res | |||
def wait_element_visibility(self, loc, desc=None, timeout=10): | |||
""" | |||
等待元素可见 | |||
:param loc: 元素的定位器 | |||
:param desc: 元素的描述 | |||
:return: | |||
""" | |||
try: | |||
ele = WebDriverWait(self.driver, timeout, 0.5).until( | |||
EC.visibility_of_element_located(loc) | |||
) | |||
except Exception as e: | |||
my_log.error("等待元素可见--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("等待元素可见--【{}】--成功".format(desc)) | |||
return ele | |||
def wait_element_presence(self, loc, desc=None, timeout=10): | |||
""" | |||
等待元素存在 | |||
:param loc: 元素的定位器 | |||
:param desc: 元素的描述 | |||
:return: | |||
""" | |||
try: | |||
ele = WebDriverWait(self.driver, timeout, 0.5).until( | |||
EC.presence_of_element_located(loc) | |||
) | |||
except Exception as e: | |||
my_log.error("等待元素可见--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("等待元素可见--【{}】--成功".format(desc)) | |||
return ele | |||
def wait_element_clickable(self, loc, desc=None, timeout=10): | |||
""" | |||
等待元素可点击 | |||
:param loc: 元素的定位器 | |||
:param desc: 元素的描述 | |||
:return: | |||
""" | |||
try: | |||
ele = WebDriverWait(self.driver, timeout, 0.5).until( | |||
EC.element_to_be_clickable(loc) | |||
) | |||
except Exception as e: | |||
my_log.error("等待元素可见--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("等待元素可见--【{}】--成功".format(desc)) | |||
return ele | |||
def switch_to_iframe_loc(self, loc, desc=None): | |||
""" | |||
通过frame标签的定位表达式,进行iframe切换 | |||
:param loc: 元素的定位器 | |||
:param desc: 元素的描述 | |||
:return: | |||
""" | |||
try: | |||
WebDriverWait(self.driver, 20, 0.5).until( | |||
EC.frame_to_be_available_and_switch_to_it(loc) | |||
) | |||
except Exception as e: | |||
my_log.error("等待iframe可见并进行切换--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("等待iframe可见并进行切换--【{}】--成功".format(desc)) | |||
def switch_to_iframe_name(self, name, desc=None): | |||
""" | |||
通过frame标签的name属性,进行iframe切换 | |||
:param name iframe标签的name属性 | |||
:param desc: 元素的描述 | |||
:return: | |||
""" | |||
try: | |||
self.driver.switch_to.frame(name) | |||
except Exception as e: | |||
my_log.error("切换iframe--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("切换iframe--【{}】--成功".format(desc)) | |||
def error_save_screenshot(self, desc=None): | |||
""" | |||
错误截图 | |||
:return: | |||
""" | |||
i_date = time.strftime("%Y-%m-%d_%H%M%S_") | |||
filename = i_date + desc + '.png' | |||
file_path = os.path.join(ERROR_IMAGE_DIR, filename) | |||
try: | |||
self.driver.save_screenshot(file_path) | |||
except Exception as e: | |||
my_log.error("【{}】--操作进行截图--失败".format(desc)) | |||
my_log.exception(e) | |||
raise e | |||
else: | |||
#----------------将错误截图添加到allure报告中--------- | |||
with open(file_path,"rb") as f: | |||
file = f.read() | |||
allure.attach(file,"失败截图",allure.attachment_type.PNG) | |||
my_log.info("【{}】--操作进行截图--成功".format(desc)) | |||
my_log.info("图片名为{}".format(file_path)) | |||
def upload_input(self,desc, loc, *filePath): | |||
""" | |||
常用input定位标签进行多文件上传 | |||
:param desc: 元素的描述 | |||
:param loc: 元素定位器 | |||
:param *filePath: 一个或多个上传的文件路径 | |||
:return: | |||
""" | |||
try: | |||
for i in filePath: | |||
input_ele = self.get_element(*loc) | |||
input_ele.send_keys(i) | |||
except Exception as e: | |||
my_log.error("文件上传--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("文件上传--【{}】--成功".format(desc)) | |||
def upload_pyautogui(self,desc, *filePath): | |||
""" | |||
采用pyautogui插件进行多文件上传 (解决系统原生组件) | |||
:param desc: 元素的描述 | |||
:param *filePath: 一个或多个上传的文件路径 | |||
:return: | |||
""" | |||
try: | |||
for i in filePath: | |||
pyautogui.write('"{}" '.format(i)) | |||
except Exception as e: | |||
my_log.error("文件上传--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
pyautogui.press('enter', 1) | |||
my_log.info("文件上传--【{}】--成功".format(desc)) | |||
def execute_js_to_return(self, desc, js): | |||
""" | |||
执行js脚本并返回内容 | |||
:param desc:元素描述 | |||
:param js:执行的js脚本命令 | |||
:return: | |||
""" | |||
try: | |||
ele = self.driver.execute_script("return {}".format(js)) | |||
time.sleep(1) | |||
except Exception as e: | |||
my_log.error("js脚本执行--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("js脚本执行--【{}】--成功".format(desc)) | |||
return ele | |||
def execute_js(self, desc, js): | |||
""" | |||
执行js脚本 | |||
:param desc:元素描述 | |||
:param js:执行的js脚本命令 | |||
:return: | |||
""" | |||
try: | |||
self.driver.execute_script(js) | |||
time.sleep(1) | |||
except Exception as e: | |||
my_log.error("js脚本执行--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
my_log.info("js脚本执行--【{}】--成功".format(desc)) | |||
def move_to_element(self,desc,loc, timeout=10): | |||
""" | |||
悬停 | |||
:param timeout: | |||
:param desc: | |||
:param loc: | |||
:return: | |||
""" | |||
try: | |||
action = ActionChains(self.driver) | |||
ele = self.wait_element_visibility(loc, timeout=timeout) | |||
except Exception as e: | |||
my_log.error("悬停--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
action.move_to_element(ele).perform() | |||
my_log.info("悬停--【{}】--成功".format(desc)) | |||
def mouse_drag_and_drop(self, loc1, loc2,desc): | |||
""" | |||
鼠标从指定元素滑动到另一个指定元素 | |||
:param loc1:被拖拽的对象元素 | |||
:param loc2:停放的元素 | |||
:param desc:元素描述 | |||
:return: | |||
""" | |||
try: | |||
action = ActionChains(self.driver) | |||
ele1 = self.get_element(loc1) | |||
ele2 = self.get_element(loc2) | |||
# #点击被拖拽的对象元素,按下鼠标 | |||
action.click_and_hold(ele1) | |||
# 移动到某元素上 | |||
action.move_to_element(ele2) | |||
except Exception as e: | |||
my_log.error("拖动--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
# 释放鼠标 | |||
action.release() | |||
#执行 | |||
action.perform() | |||
my_log.info("拖动--【{}】--成功".format(desc)) | |||
def mouse_x_to_y(self, xoffset, yoffset,desc): | |||
""" | |||
鼠标滑动,从x轴到y轴 | |||
:param xoffset:x轴 | |||
:param yoffset:y轴 | |||
:param desc:元素描述 | |||
:return: | |||
""" | |||
try: | |||
action = ActionChains(self.driver) | |||
# 1、按下鼠标 | |||
action.click_and_hold('定位到的元素') | |||
# 2、移动鼠标到指定位置 | |||
action.move_by_offset(xoffset, yoffset) # 向左移动200px, y轴不动 | |||
except Exception as e: | |||
my_log.error("拖动--【{}】--失败".format(desc)) | |||
my_log.exception(e) | |||
self.error_save_screenshot(desc) | |||
raise e | |||
else: | |||
# 释放鼠标 | |||
# 3、释放鼠标 | |||
action.release() | |||
my_log.info("拖动--【{}】--成功".format(desc)) | |||
@@ -0,0 +1,18 @@ | |||
""" | |||
coding:utf-8 | |||
@Software: | |||
@Time:2022/8/17 14:33 | |||
@Author:liaoqin | |||
""" | |||
import os | |||
from configparser import ConfigParser | |||
from common.handle_path import CONF_DIR | |||
class Config(ConfigParser): | |||
"""在创建对象时直接加载配置文件的内容""" | |||
def __init__(self,conf_file): | |||
super().__init__() #继承ConfigParser父类的方法 | |||
self.read(conf_file,encoding="utf-8") | |||
conf = Config(os.path.join(CONF_DIR,'config.ini')) |
@@ -0,0 +1,50 @@ | |||
""" | |||
coding:utf-8 | |||
@Software:日志收集器 | |||
为避免程序中创建多个日志收集器而导致日志重复记录,使用时就只需导入 这个日志收集器 | |||
@Time:2022/8/15 17:20 | |||
@Author:liaoqin | |||
""" | |||
import logging,os | |||
from common.handle_path import LOG_DIR | |||
from common.handle_conf import conf | |||
class Log: | |||
def create_log(self,name,fh_level,sh_level,level,filename): | |||
# 1、创建日志收集器 | |||
log = logging.getLogger(name) | |||
# 2、设置日志收集器收集日志的等级 | |||
log.setLevel(level) | |||
# 3、设置日志输出渠道 | |||
# 3.1、创建一个日志输出的渠道(输出到文件) | |||
fh = logging.FileHandler(filename, encoding='utf-8') | |||
fh.setLevel(fh_level) # 设置输出等级 | |||
log.addHandler(fh) # 将输出渠道绑定到日志收集器上 | |||
"""输出到控制台""" | |||
# 3.2、创建一个日志输出的渠道(输出到控制台) | |||
sh = logging.StreamHandler() | |||
sh.setLevel(sh_level) # 设置输出等级 | |||
log.addHandler(sh) # 将输出渠道绑定到日志收集器上 | |||
# 4、设置日志输出的等级,格式 【时间,文件,行号,等级,信息】 | |||
formats = '%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s :%(message)s' | |||
# 创建格式对象 | |||
log_format = logging.Formatter(formats) | |||
# 为输出渠道设置输出格式 | |||
sh.setFormatter(log_format) | |||
fh.setFormatter(log_format) | |||
# 返回一个日志收集器 | |||
return log | |||
my_log = Log().create_log( | |||
name = conf.get("logging","name"), | |||
fh_level = conf.get("logging","fh_level"), | |||
sh_level = conf.get("logging","sh_level"), | |||
level = conf.get("logging","level"), | |||
filename = os.path.join(LOG_DIR,conf.get("logging","filename")) | |||
) | |||
# if __name__ == '__main__': | |||
# log = create_log('login_case', 'DEBUG', 'DEBUG', level="DEBUG", filename='20220815_log.log') | |||
# log.debug('---1111') |
@@ -0,0 +1,28 @@ | |||
""" | |||
coding:utf-8 | |||
@Software:封装路径的模块 | |||
@Time:2022/8/17 20:11 | |||
@Author:liaoqin | |||
""" | |||
import os | |||
#项目的根目录的绝对路径 | |||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | |||
#用例数据所在目录 | |||
DATA_DIR = os.path.join(BASE_DIR,"datas") | |||
#配置文件所在目录 | |||
CONF_DIR = os.path.join(BASE_DIR,"conf") | |||
#日志文件所在目录 | |||
LOG_DIR = os.path.join(BASE_DIR,"logs") | |||
#报告所在路径 | |||
REPORT_DIR = os.path.join(BASE_DIR,"reports") | |||
#用例模块所在目录 | |||
CASE_DIR = os.path.join(BASE_DIR,"testcases") | |||
#错误文件截图所在目录 | |||
ERROR_IMAGE_DIR = os.path.join(BASE_DIR,"error_image") |
@@ -0,0 +1,20 @@ | |||
[logging] | |||
name = test_log | |||
fh_level = DEBUG | |||
sh_level = DEBUG | |||
level = DEBUG | |||
filename = log.log | |||
[server_info] | |||
server_url = http://api.lemonban.com/futureloan | |||
headers = {"X-Lemonban-Media-Type": "lemonban.v2"} | |||
[test_login] | |||
mobile_phone = 13888887788 | |||
pwd = 12345678 | |||
admin_mobile= 18600879898 | |||
admin_pwd = 12345678 | |||
[mysql] | |||
host = api.lemonban.com | |||
port = 3306 | |||
user = future | |||
password = 123456 | |||
database = futureloan |
@@ -0,0 +1,18 @@ | |||
""" | |||
coding:utf-8 | |||
@Software: | |||
@Time:2022/10/12 11:15 | |||
@Author:liaoqin | |||
""" | |||
class LoginData: | |||
success_case_data = [ | |||
{"mobile": "18684720553", "pwd": "python", "expected": "登录成功"} | |||
] | |||
error_case_data = [ | |||
{"mobile": "186", "pwd": "111", "expected": "请输入正确的手机号"}, | |||
{"mobile": "1860045454545", "pwd": "11", "expected": "请输入正确的手机号"}, | |||
{"mobile": "wqeq", "pwd": "111", "expected": "请输入正确的手机号"} | |||
] | |||
error_alert_data = [ | |||
{"mobile": "18611458781", "pwd": "111", "expected": "此账号没有经过授权,请联系管理员!"} | |||
] |
@@ -0,0 +1,14 @@ | |||
""" | |||
coding:utf-8 | |||
@Software: | |||
@Time:2022/10/12 21:16 | |||
@Author:liaoqin | |||
""" | |||
class LoginKeTangPaiData: | |||
student_success_case_data = [ | |||
{"mobile": "403483118@qq.com", "pwd": "liaoqin96", "expected": "登录成功"} | |||
] | |||
teacher_success_case_data = [ | |||
{"mobile": "408848063@qq.com", "pwd": "nmb_python", "expected": "登录成功"} | |||
] | |||
@@ -0,0 +1,22 @@ | |||
""" | |||
coding:utf-8 | |||
@Software: | |||
@Time:2022/10/13 14:08 | |||
@Author:liaoqin | |||
""" | |||
from selenium.webdriver.common.by import By | |||
class ClassRoomLocator: | |||
#我的课堂---学生 | |||
sign_in_loc = (By.XPATH,"//span[text()='立即签到']") | |||
sign_in_code_loc = (By.XPATH,'//input[@placeholder="请输入数字"]') | |||
sure_sign_in_loc = (By.XPATH,'//div[@aria-label="签到"]//span[text()="确定"]') | |||
layui_layer_content_loc = (By.XPATH,'//div[@role="alert"]//p') | |||
#我的课堂---老师 | |||
teacher_sign_in_loc = (By.XPATH,'//span[text()="考勤"]') | |||
teacher_create_sign_in_loc = (By.XPATH,'//span[text()="新建考勤"]') | |||
teacher_create_num_loc = (By.XPATH,'//p[text()="数字考勤"]') | |||
teacher_sure_num_sign_in_loc = (By.XPATH,'//div[@aria-label="新建考勤"]//span[text()="确定"]') | |||
teacher_sure_num_sign_in_time_loc = (By.XPATH,'//div[@aria-label="考勤时间设置"]//span[text()="确定"]') | |||
teacher_sign_in_code_loc = (By.XPATH,'//div[@class="sign-in"]//input[@class="el-input__inner"]') |
@@ -0,0 +1,12 @@ | |||
""" | |||
coding:utf-8 | |||
@Software: | |||
@Time:2022/10/12 11:36 | |||
@Author:liaoqin | |||
""" | |||
from selenium.webdriver.common.by import By | |||
class IndexKeTangPaiLocator: | |||
myClass_loc = (By.XPATH, "//li[text()='我的课堂']") | |||
join_class_link_loc = (By.XPATH,'//div[@class="header-info"]//h3[@title="pythonUI自动化"]') |
@@ -0,0 +1,11 @@ | |||
""" | |||
coding:utf-8 | |||
@Software: | |||
@Time:2022/10/12 11:36 | |||
@Author:liaoqin | |||
""" | |||
from selenium.webdriver.common.by import By | |||
class IndexLocator: | |||
myAccount_loc = (By.XPATH, '//a[contains(text(),"我的帐户")]') |
@@ -0,0 +1,15 @@ | |||
""" | |||
coding:utf-8 | |||
@Software: | |||
@Time:2022/10/12 21:22 | |||
@Author:liaoqin | |||
""" | |||
from selenium.webdriver.common.by import By | |||
class LoginKeTangPaiLocator: | |||
mobile_loc = (By.XPATH,'//input[@placeholder="请输入邮箱/手机号/账号"]') | |||
pwd_loc = (By.XPATH,'//input[@placeholder="请输入密码"]') | |||
login_btn_loc = (By.XPATH,'//div[@class="margin-top"]//button') | |||
#不方便扫码 | |||
forward_btn_loc= (By.XPATH,'//a[@class="btn-inconvenient"]') |
@@ -0,0 +1,20 @@ | |||
""" | |||
coding:utf-8 | |||
@Software:元素定位层:用来存放元素定位,与测试用例层的代码进行分离;尽量一个页面一个 | |||
@Time:2022/10/12 11:19 | |||
@Author:liaoqin | |||
""" | |||
from selenium.webdriver.common.by import By | |||
class LoginLocator: | |||
#1、手机号 | |||
mobile_loc = (By.XPATH, '//input[@placeholder="手机号"]') | |||
# 2、输入密码 | |||
pwd_loc = (By.XPATH, '//input[@placeholder="密码"]') | |||
# 3、点击登录 | |||
login_btn_loc = (By.XPATH, '//button[text()="登录"]') | |||
#页面上登录失败错误提示 | |||
form_error_info_btn_loc = (By.XPATH, '//div[@class="form-error-info"]') | |||
#页面上登录失败弹框提示 | |||
layui_layer_content_loc = (By.XPATH, '//div[@class="layui-layer-content"]') |
@@ -0,0 +1,169 @@ | |||
2022-10-18 19:24:16,761 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-18 19:24:16,762 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-18 19:24:16,860 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-18 19:24:16,860 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-18 19:24:16,970 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-18 19:24:17,008 - [base_page.py-->line:62] - INFO :点击元素--【None】--成功 | |||
2022-10-18 19:24:18,073 - [test_login_ddt.py-->line:33] - INFO :【登录成功--用例】------》执行成功 | |||
2022-10-18 19:24:22,496 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-18 19:24:22,496 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-18 19:24:22,578 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-18 19:24:22,578 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-18 19:24:22,679 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-18 19:24:22,716 - [base_page.py-->line:62] - INFO :点击元素--【None】--成功 | |||
2022-10-18 19:24:22,733 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-10-18 19:24:22,746 - [test_login_ddt.py-->line:48] - ERROR :【请输入正确的手机号1--用例】------》执行失败 | |||
2022-10-18 19:24:22,747 - [test_login_ddt.py-->line:49] - ERROR :assert '请输入正确的手机号' == '请输入正确的手机号1' | |||
- 请输入正确的手机号1 | |||
? - | |||
+ 请输入正确的手机号 | |||
Traceback (most recent call last): | |||
File "D:\pythonProject\QCD_webUI\testcases\test_login_ddt.py", line 46, in test_login_fail | |||
assert res == expected | |||
AssertionError: assert '请输入正确的手机号' == '请输入正确的手机号1' | |||
- 请输入正确的手机号1 | |||
? - | |||
+ 请输入正确的手机号 | |||
2022-10-18 19:24:23,208 - [base_page.py-->line:268] - INFO :【请输入正确的手机号1】--操作进行截图--成功 | |||
2022-10-18 19:24:23,209 - [base_page.py-->line:269] - INFO :图片名为D:\pythonProject\QCD_webUI\error_image\2022-10-18_192422_请输入正确的手机号1.png | |||
2022-10-18 19:24:27,675 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-18 19:24:27,675 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-18 19:24:27,768 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-18 19:24:27,768 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-18 19:24:27,874 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-18 19:24:27,913 - [base_page.py-->line:62] - INFO :点击元素--【None】--成功 | |||
2022-10-18 19:24:27,934 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-10-18 19:24:27,948 - [test_login_ddt.py-->line:53] - INFO :【请输入正确的手机号--用例】------》执行成功 | |||
2022-10-18 19:24:32,050 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-18 19:24:32,051 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-18 19:24:32,134 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-18 19:24:32,134 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-18 19:24:32,242 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-18 19:24:32,285 - [base_page.py-->line:62] - INFO :点击元素--【None】--成功 | |||
2022-10-18 19:24:32,307 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-10-18 19:24:32,318 - [test_login_ddt.py-->line:53] - INFO :【请输入正确的手机号--用例】------》执行成功 | |||
2022-10-18 19:24:36,423 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-18 19:24:36,424 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-18 19:24:36,552 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-18 19:24:36,552 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-18 19:24:36,657 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-18 19:24:36,707 - [base_page.py-->line:62] - INFO :点击元素--【None】--成功 | |||
2022-10-18 19:24:37,316 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败弹框提示】--成功 | |||
2022-10-18 19:24:37,327 - [test_login_ddt.py-->line:73] - INFO :【此账号没有经过授权,请联系管理员!--用例】------》执行成功 | |||
2022-10-31 16:33:35,543 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:35,544 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:35,715 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:35,716 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:35,925 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-31 16:33:36,003 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-10-31 16:33:38,970 - [test_login_ddt.py-->line:36] - INFO :【登录成功--用例】------》执行成功 | |||
2022-10-31 16:33:45,378 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:45,378 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:45,467 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:45,468 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:45,592 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-31 16:33:45,639 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-10-31 16:33:45,669 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-10-31 16:33:45,689 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 | |||
2022-10-31 16:33:50,180 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:50,180 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:50,365 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:50,366 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:50,552 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-31 16:33:50,626 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-10-31 16:33:50,659 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-10-31 16:33:50,679 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 | |||
2022-10-31 16:33:56,669 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:56,671 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:56,860 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:56,861 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:57,674 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-31 16:33:57,745 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-10-31 16:33:57,797 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-10-31 16:33:57,820 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 | |||
2022-10-31 16:34:02,659 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:34:02,660 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:34:02,822 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:34:02,822 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:34:02,955 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-31 16:34:03,029 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-10-31 16:34:03,662 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败弹框提示】--成功 | |||
2022-10-31 16:34:03,677 - [test_login_ddt.py-->line:79] - INFO :【此账号没有经过授权,请联系管理员!--用例】------》执行成功 | |||
2022-11-01 15:12:28,672 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:28,672 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:28,864 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:28,864 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:29,015 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:12:29,090 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:12:30,151 - [test_login_ddt.py-->line:36] - INFO :【登录成功--用例】------》执行成功 | |||
2022-11-01 15:12:34,941 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:34,942 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:35,091 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:35,092 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:35,262 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:12:35,318 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:12:35,350 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-11-01 15:12:35,374 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 | |||
2022-11-01 15:12:39,952 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:39,952 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:40,104 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:40,105 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:40,216 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:12:40,267 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:12:40,308 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-11-01 15:12:40,324 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 | |||
2022-11-01 15:12:44,456 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:44,456 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:44,571 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:44,572 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:44,723 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:12:44,783 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:12:44,813 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-11-01 15:12:44,832 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 | |||
2022-11-01 15:12:49,058 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:49,059 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:49,207 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:49,207 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:49,332 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:12:49,400 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:12:50,010 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败弹框提示】--成功 | |||
2022-11-01 15:12:50,022 - [test_login_ddt.py-->line:79] - INFO :【此账号没有经过授权,请联系管理员!--用例】------》执行成功 | |||
2022-11-01 15:13:24,260 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:24,261 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:24,322 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:24,322 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:24,394 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:13:24,425 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:13:25,138 - [test_login_ddt.py-->line:36] - INFO :【登录成功--用例】------》执行成功 | |||
2022-11-01 15:13:28,976 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:28,976 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:29,032 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:29,032 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:29,099 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:13:29,130 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:13:29,147 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-11-01 15:13:29,156 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 | |||
2022-11-01 15:13:32,904 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:32,905 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:32,966 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:32,967 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:33,033 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:13:33,063 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:13:33,080 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-11-01 15:13:33,095 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 | |||
2022-11-01 15:13:36,922 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:36,923 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:36,981 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:36,981 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:37,047 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:13:37,077 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:13:37,094 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-11-01 15:13:37,105 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 | |||
2022-11-01 15:13:41,878 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:41,878 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:41,937 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:41,937 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:42,001 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:13:42,031 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:13:42,168 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败弹框提示】--成功 | |||
2022-11-01 15:13:42,178 - [test_login_ddt.py-->line:79] - INFO :【此账号没有经过授权,请联系管理员!--用例】------》执行成功 |
@@ -0,0 +1,28 @@ | |||
""" | |||
coding:utf-8 | |||
@Software: | |||
@Time:2022/10/13 21:57 | |||
@Author:liaoqin | |||
""" | |||
from selenium import webdriver | |||
class TestKeyWords(object): | |||
#初始化 | |||
def __init__(self,browser_type): | |||
self.open_browser(browser_type) | |||
#调用浏览器 | |||
def open_browser(self,browser_type): | |||
#定义全局变量 | |||
global driver | |||
if browser_type == 'chrome': | |||
driver = webdriver.Chrome() | |||
driver.get('https://blog.csdn.net/') | |||
elif browser_type == 'firefox': | |||
driver = webdriver.Firefox() | |||
else: | |||
print('type error') | |||
if __name__ == '__main__': | |||
TestKeyWords('chrome') |
@@ -0,0 +1,77 @@ | |||
""" | |||
coding:utf-8 | |||
@Software:课程页面 | |||
@Time:2022/10/12 21:49 | |||
@Author:liaoqin | |||
""" | |||
import time | |||
from selenium.webdriver.remote.webdriver import WebDriver | |||
from selenium.webdriver.support.wait import WebDriverWait | |||
from selenium.webdriver.support import expected_conditions as EC | |||
from locator.class_room_locator import ClassRoomLocator | |||
class ClassRoomPage: | |||
def __init__(self,driver:WebDriver): | |||
self.driver = driver | |||
def check_work(self): | |||
"""点击考勤""" | |||
ele = WebDriverWait(self.driver, 5, 1).until( | |||
EC.element_to_be_clickable(ClassRoomLocator.sign_in_loc) | |||
) | |||
ele.click() | |||
def sure_signIn(self,signInCode): | |||
"""输入考勤,确定签到""" | |||
ele = WebDriverWait(self.driver, 5, 1).until( | |||
EC.visibility_of_element_located(ClassRoomLocator.sign_in_code_loc) | |||
) | |||
ele.send_keys(signInCode) | |||
self.driver.find_element(*ClassRoomLocator.sure_sign_in_loc).click() | |||
# 加显示等待 | |||
ele1 = WebDriverWait(self.driver, 5, 0.5).until( | |||
EC.visibility_of_element_located(ClassRoomLocator.layui_layer_content_loc) | |||
) | |||
res = ele1.text | |||
return res | |||
def teacher_sing_in(self): | |||
"""点击考勤,生成考勤码""" | |||
#1、老师点击:考勤 | |||
time.sleep(3) | |||
ele = WebDriverWait(self.driver, 20, 0.5).until( | |||
EC.element_to_be_clickable(ClassRoomLocator.teacher_sign_in_loc) | |||
) | |||
ele.click() | |||
#2、新建考勤 | |||
ele1 = WebDriverWait(self.driver, 5, 0.5).until( | |||
EC.element_to_be_clickable(ClassRoomLocator.teacher_create_sign_in_loc) | |||
) | |||
ele1.click() | |||
#3、点击数据考勤 | |||
ele2 = WebDriverWait(self.driver, 5, 0.5).until( | |||
EC.element_to_be_clickable(ClassRoomLocator.teacher_create_num_loc) | |||
) | |||
ele2.click() | |||
#4、确定生成数据考勤 | |||
ele3 = WebDriverWait(self.driver, 5, 0.5).until( | |||
EC.element_to_be_clickable(ClassRoomLocator.teacher_sure_num_sign_in_loc) | |||
) | |||
ele3.click() | |||
#5、考勤时间设置 | |||
ele4 = WebDriverWait(self.driver, 5, 0.5).until( | |||
EC.element_to_be_clickable(ClassRoomLocator.teacher_sure_num_sign_in_time_loc) | |||
) | |||
ele4.click() | |||
WebDriverWait(self.driver, 5, 0.5).until( | |||
EC.visibility_of_element_located(ClassRoomLocator.teacher_sign_in_code_loc) | |||
) | |||
time.sleep(3) | |||
js = 'document.getElementsByClassName("el-input__inner")[1].value;' | |||
#js返回值给pyhton接收时,需要加return | |||
code = self.driver.execute_script("return {}".format(js)) | |||
#code = self.driver.execute_script(js) | |||
time.sleep(1) | |||
print("考勤码为:",code) | |||
return code |
@@ -0,0 +1,33 @@ | |||
""" | |||
coding:utf-8 | |||
@Software: | |||
@Time:2022/10/12 21:34 | |||
@Author:liaoqin | |||
""" | |||
from selenium.webdriver.remote.webdriver import WebDriver | |||
from locator.index_ketangpai_locator import IndexKeTangPaiLocator | |||
from selenium.webdriver.support.wait import WebDriverWait | |||
from selenium.webdriver.support import expected_conditions as EC | |||
class IndexKeTangPaiPage: | |||
def __init__(self,driver:WebDriver ): | |||
self.driver = driver | |||
def is_login_success(self): | |||
"""检验登录是否成功""" | |||
try: | |||
res = WebDriverWait(self.driver,5,1).until( | |||
EC.visibility_of_element_located(IndexKeTangPaiLocator.myClass_loc) | |||
) | |||
except: | |||
res = "登录失败" | |||
else: | |||
res = "登录成功" | |||
return res | |||
def join_class(self): | |||
"""点击课堂码,进入课堂""" | |||
ele = WebDriverWait(self.driver,5,1).until( | |||
EC.element_to_be_clickable(IndexKeTangPaiLocator.join_class_link_loc) | |||
) | |||
ele.click() |
@@ -0,0 +1,22 @@ | |||
""" | |||
coding:utf-8 | |||
@Software: | |||
@Time:2022/10/12 11:17 | |||
@Author:liaoqin | |||
""" | |||
from selenium.webdriver.remote.webdriver import WebDriver | |||
from locator.index_locator import IndexLocator | |||
class IndexPage: | |||
def __init__(self,driver:WebDriver ): | |||
self.driver = driver | |||
def is_login_success(self): | |||
try: | |||
res = self.driver.find_element(*IndexLocator.myAccount_loc) | |||
except: | |||
res = "登录失败" | |||
else: | |||
res = "登录成功" | |||
return res |
@@ -0,0 +1,24 @@ | |||
""" | |||
coding:utf-8 | |||
@Software:课堂派登录页面 | |||
@Time:2022/10/12 21:20 | |||
@Author:liaoqin | |||
""" | |||
from selenium.webdriver.remote.webdriver import WebDriver | |||
from locator.login_ketangpai_locator import LoginKeTangPaiLocator | |||
class LoginKeTangPaiPage: | |||
def __init__(self,driver:WebDriver): | |||
self.driver = driver | |||
def login(self,mobile,pwd): | |||
"""登录""" | |||
#1、输入账号 | |||
self.driver.find_element(*LoginKeTangPaiLocator.mobile_loc).send_keys(mobile) | |||
# 2、输入密码 | |||
self.driver.find_element(*LoginKeTangPaiLocator.pwd_loc).send_keys(pwd) | |||
# 3、点击登录 | |||
self.driver.find_element(*LoginKeTangPaiLocator.login_btn_loc).click() | |||
#4、点击不方便扫码 | |||
self.driver.find_element(*LoginKeTangPaiLocator.forward_btn_loc).click() |
@@ -0,0 +1,35 @@ | |||
""" | |||
coding:utf-8 | |||
@Software:页面对象类:只写查找元素及操作动作 | |||
@Time:2022/10/11 15:08 | |||
@Author:liaoqin | |||
""" | |||
from locator.login_locator import LoginLocator | |||
from common.base_page import BasePage | |||
class LoginPage(BasePage): | |||
def login(self,mobile,pwd): | |||
"""登录""" | |||
# 1、输入账号 | |||
# self.driver.find_element(*LoginLocator.mobile_loc).send_keys(mobile) | |||
self.get_element(LoginLocator.mobile_loc,"登录页面_账号输入框").send_keys(mobile) | |||
# 2、输入密码 | |||
# self.driver.find_element(*LoginLocator.pwd_loc).send_keys(pwd) | |||
self.get_element(LoginLocator.pwd_loc,"登录页面_密码输入框").send_keys(pwd) | |||
# 3、点击登录 | |||
# self.driver.find_element(*LoginLocator.login_btn_loc).click() | |||
self.click_element(LoginLocator.login_btn_loc,'登录页面_登录按钮') | |||
def get_error_text(self): | |||
"""获取页面上登录失败错误提示""" | |||
# 加显示等待 | |||
res = self.wait_element_visibility(LoginLocator.form_error_info_btn_loc,'登录页面_登录失败错误提示') | |||
return res.text | |||
def get_alert_info(self): | |||
"""获取登录失败弹框提示""" | |||
res = self.wait_element_visibility(LoginLocator.layui_layer_content_loc,'登录页面_登录失败弹框提示') | |||
return res.text |
@@ -0,0 +1 @@ | |||
{"uuid": "c0a962d1-31a4-4f80-b150-46016899b58b", "befores": [{"name": "case", "status": "passed", "start": 1667286762515, "stop": 1667286762515}], "start": 1667286762515, "stop": 1667286767009} |
@@ -0,0 +1 @@ | |||
{"name": "test_login_alert_fail[case0]", "status": "broken", "statusDetails": {"message": "TypeError: __init__() got an unexpected keyword argument 'is_headers'", "trace": "@pytest.fixture(scope=\"function\")\n def login_fixture():\n #用例前置\n> driver = webdriver.Chrome(is_headers=False)\nE TypeError: __init__() got an unexpected keyword argument 'is_headers'\n\ntestcases\\conftest.py:41: TypeError"}, "description": "登录失败--此账号没有经过授权,请联系管理员!", "parameters": [{"name": "case", "value": "{'mobile': '18611458781', 'pwd': '111', 'expected': '此账号没有经过授权,请联系管理员!'}"}], "start": 1667286647796, "stop": 1667286647796, "uuid": "fef195c9-8f7e-4cd8-b49e-37741b08e823", "historyId": "79906ae4b91b185b0ea29785301e04ac", "testCaseId": "8b848752bf4ac3b5ac7d380bf9668e8d", "fullName": "testcases.test_login_ddt.TestLogin#test_login_alert_fail", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "18384-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1,8 @@ | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:214 等待元素可见--【None】--成功 | |||
INFO test_log:base_page.py:62 点击元素--【登录页面_登录按钮】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_登录失败弹框提示】--成功 | |||
INFO test_log:test_login_ddt.py:79 【此账号没有经过授权,请联系管理员!--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"uuid": "85a011bb-eab6-40de-be30-7496d6860edb", "befores": [{"name": "case", "status": "passed", "start": 1667205221196, "stop": 1667205221197}], "start": 1667205221196, "stop": 1667205227872} |
@@ -0,0 +1 @@ | |||
{"uuid": "f35c8b3c-b3a3-48f9-83ce-49a4288912d8", "befores": [{"name": "case", "status": "passed", "start": 1667205227875, "stop": 1667205227875}], "start": 1667205227875, "stop": 1667205233940} |
@@ -0,0 +1 @@ | |||
{"uuid": "139d106d-c2b8-4391-acac-1fdc5ebaeca5", "befores": [{"name": "case", "status": "passed", "start": 1667286767012, "stop": 1667286767012}], "start": 1667286767012, "stop": 1667286772205} |
@@ -0,0 +1 @@ | |||
{"name": "请输入正确的手机号", "status": "passed", "description": "登录失败--此账号没有经过授权,请联系管理员!", "attachments": [{"name": "log", "source": "2453cb86-9621-4fef-bb97-27b9092e820e-attachment.txt", "type": "text/plain"}, {"name": "stderr", "source": "71cbe848-56dd-4356-8c32-0ec65c4096f9-attachment.txt", "type": "text/plain"}], "parameters": [{"name": "case", "value": "{'mobile': '186', 'pwd': '111', 'expected': '请输入正确的手机号'}"}], "start": 1667205225348, "stop": 1667205225690, "uuid": "e10d289e-92fd-4fca-84f8-058553aba7c0", "historyId": "8ab3a0b6e9c809f712f35a72c445b2da", "testCaseId": "007630122853f6ac4ea2f284b8c09793", "fullName": "testcases.test_login_ddt.TestLogin#test_login_fail", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "15068-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1 @@ | |||
{"uuid": "5b134127-75b3-493f-ad51-1f4cb239c938", "befores": [{"name": "case", "status": "passed", "start": 1667286647707, "stop": 1667286647707}], "start": 1667286647707, "stop": 1667286647759} |
@@ -0,0 +1 @@ | |||
{"name": "请输入正确的手机号", "status": "passed", "description": "登录失败--此账号没有经过授权,请联系管理员!", "attachments": [{"name": "log", "source": "23feab0c-0501-41f2-abaf-1bd0fdd2fe6e-attachment.txt", "type": "text/plain"}, {"name": "stderr", "source": "8da5dc98-5dfb-4ed8-a15d-a1aa97d9cee7-attachment.txt", "type": "text/plain"}], "parameters": [{"name": "case", "value": "{'mobile': 'wqeq', 'pwd': '111', 'expected': '请输入正确的手机号'}"}], "start": 1667286816900, "stop": 1667286817106, "uuid": "983dfb39-3f15-415e-8bc0-f15681384a93", "historyId": "815b0c5e2b778516245092332f3043a4", "testCaseId": "007630122853f6ac4ea2f284b8c09793", "fullName": "testcases.test_login_ddt.TestLogin#test_login_fail", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "17400-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1,7 @@ | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:214 等待元素可见--【None】--成功 | |||
INFO test_log:base_page.py:62 点击元素--【登录页面_登录按钮】--成功 | |||
INFO test_log:test_login_ddt.py:36 【登录成功--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"name": "登录成功", "status": "passed", "description": "登录成功", "attachments": [{"name": "log", "source": "0dff4bb2-dcb8-4c92-bce8-857a5456a971-attachment.txt", "type": "text/plain"}, {"name": "stderr", "source": "46719b61-de72-4598-8478-7b97305d2358-attachment.txt", "type": "text/plain"}], "parameters": [{"name": "case", "value": "{'mobile': '18684720553', 'pwd': 'python', 'expected': '登录成功'}"}], "start": 1667205215394, "stop": 1667205218971, "uuid": "882d85e0-c201-46d4-876f-6300441b9cbb", "historyId": "6284ae4c3adb54a796d0c3e86b808086", "testCaseId": "4f4e1a9d30341c741830d94fdf6be8df", "fullName": "testcases.test_login_ddt.TestLogin#test_login_success", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "15068-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1 @@ | |||
{"uuid": "6354b277-d834-4ef6-a0a7-1098812c86a7", "children": ["fef195c9-8f7e-4cd8-b49e-37741b08e823"], "befores": [{"name": "login_fixture", "status": "broken", "statusDetails": {"message": "TypeError: __init__() got an unexpected keyword argument 'is_headers'\n", "trace": " File \"D:\\program\\python37\\lib\\site-packages\\pluggy\\_callers.py\", line 39, in _multicall\n res = hook_impl.function(*args)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 1111, in pytest_fixture_setup\n result = call_fixture_func(fixturefunc, request, kwargs)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 883, in call_fixture_func\n fixture_result = next(generator)\n File \"D:\\pythonProject\\QCD_webUI\\testcases\\conftest.py\", line 41, in login_fixture\n driver = webdriver.Chrome(is_headers=False)\n"}, "start": 1667286647797, "stop": 1667286647797}], "start": 1667286647797, "stop": 1667286647804} |
@@ -0,0 +1 @@ | |||
{"name": "test_login_success[case0]", "status": "broken", "statusDetails": {"message": "TypeError: __init__() got an unexpected keyword argument 'is_headers'", "trace": "@pytest.fixture(scope=\"function\")\n def login_fixture():\n #用例前置\n> driver = webdriver.Chrome(is_headers=False)\nE TypeError: __init__() got an unexpected keyword argument 'is_headers'\n\ntestcases\\conftest.py:40: TypeError"}, "description": "登录成功", "parameters": [{"name": "case", "value": "{'mobile': '18684720553', 'pwd': 'python', 'expected': '登录成功'}"}], "start": 1667286724052, "stop": 1667286724052, "uuid": "6c700aa0-65bf-4386-9ad4-b47576bcb4a9", "historyId": "6284ae4c3adb54a796d0c3e86b808086", "testCaseId": "4f4e1a9d30341c741830d94fdf6be8df", "fullName": "testcases.test_login_ddt.TestLogin#test_login_success", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "4084-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1,8 @@ | |||
2022-10-31 16:33:50,180 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:50,180 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:50,365 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:50,366 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:50,552 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-31 16:33:50,626 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-10-31 16:33:50,659 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-10-31 16:33:50,679 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1,8 @@ | |||
2022-10-31 16:34:02,659 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:34:02,660 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:34:02,822 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:34:02,822 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:34:02,955 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-31 16:34:03,029 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-10-31 16:34:03,662 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败弹框提示】--成功 | |||
2022-10-31 16:34:03,677 - [test_login_ddt.py-->line:79] - INFO :【此账号没有经过授权,请联系管理员!--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"uuid": "dec544ba-f965-4afb-887c-9204b9bc1427", "children": ["75a19b11-cac6-4105-88b0-9dae206876c6"], "befores": [{"name": "login_fixture", "status": "broken", "statusDetails": {"message": "TypeError: __init__() got an unexpected keyword argument 'is_headers'\n", "trace": " File \"D:\\program\\python37\\lib\\site-packages\\pluggy\\_callers.py\", line 39, in _multicall\n res = hook_impl.function(*args)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 1111, in pytest_fixture_setup\n result = call_fixture_func(fixturefunc, request, kwargs)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 883, in call_fixture_func\n fixture_result = next(generator)\n File \"D:\\pythonProject\\QCD_webUI\\testcases\\conftest.py\", line 40, in login_fixture\n driver = webdriver.Chrome(is_headers=False)\n"}, "start": 1667286724107, "stop": 1667286724107}], "start": 1667286724107, "stop": 1667286724113} |
@@ -0,0 +1 @@ | |||
{"uuid": "4ac81760-4ccd-4955-bd87-ae88ac843c86", "befores": [{"name": "case", "status": "passed", "start": 1667205240056, "stop": 1667205240056}], "start": 1667205240056, "stop": 1667205245829} |
@@ -0,0 +1,8 @@ | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:214 等待元素可见--【None】--成功 | |||
INFO test_log:base_page.py:62 点击元素--【登录页面_登录按钮】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
INFO test_log:test_login_ddt.py:58 【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"name": "test_login_fail[case2]", "status": "broken", "statusDetails": {"message": "TypeError: __init__() got an unexpected keyword argument 'is_headers'", "trace": "@pytest.fixture(scope=\"function\")\n def login_fixture():\n #用例前置\n> driver = webdriver.Chrome(is_headers=False)\nE TypeError: __init__() got an unexpected keyword argument 'is_headers'\n\ntestcases\\conftest.py:40: TypeError"}, "description": "登录失败--此账号没有经过授权,请联系管理员!", "parameters": [{"name": "case", "value": "{'mobile': 'wqeq', 'pwd': '111', 'expected': '请输入正确的手机号'}"}], "start": 1667286724098, "stop": 1667286724098, "uuid": "f862a0f9-9e69-4464-8d6b-5b8585b8a1ef", "historyId": "815b0c5e2b778516245092332f3043a4", "testCaseId": "007630122853f6ac4ea2f284b8c09793", "fullName": "testcases.test_login_ddt.TestLogin#test_login_fail", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "4084-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1 @@ | |||
{"uuid": "f29517fe-da96-45b2-b4db-f1365128f9fa", "children": ["f862a0f9-9e69-4464-8d6b-5b8585b8a1ef"], "befores": [{"name": "login_fixture", "status": "broken", "statusDetails": {"message": "TypeError: __init__() got an unexpected keyword argument 'is_headers'\n", "trace": " File \"D:\\program\\python37\\lib\\site-packages\\pluggy\\_callers.py\", line 39, in _multicall\n res = hook_impl.function(*args)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 1111, in pytest_fixture_setup\n result = call_fixture_func(fixturefunc, request, kwargs)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 883, in call_fixture_func\n fixture_result = next(generator)\n File \"D:\\pythonProject\\QCD_webUI\\testcases\\conftest.py\", line 40, in login_fixture\n driver = webdriver.Chrome(is_headers=False)\n"}, "start": 1667286724099, "stop": 1667286724099}], "start": 1667286724099, "stop": 1667286724105} |
@@ -0,0 +1,7 @@ | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:214 等待元素可见--【None】--成功 | |||
INFO test_log:base_page.py:62 点击元素--【登录页面_登录按钮】--成功 | |||
INFO test_log:test_login_ddt.py:36 【登录成功--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"uuid": "7b1f67ae-dbb1-4f4f-a4b1-f2151a05447f", "befores": [{"name": "case", "status": "passed", "start": 1667286724107, "stop": 1667286724107}], "start": 1667286724107, "stop": 1667286724114} |
@@ -0,0 +1 @@ | |||
{"uuid": "2c130e5e-df0b-4c29-b926-8060389b4d40", "befores": [{"name": "case", "status": "passed", "start": 1667286752421, "stop": 1667286752421}], "start": 1667286752421, "stop": 1667286757692} |
@@ -0,0 +1 @@ | |||
{"name": "此账号没有经过授权,请联系管理员!", "status": "passed", "description": "登录失败--此账号没有经过授权,请联系管理员!", "attachments": [{"name": "log", "source": "a1044d7d-00e0-4364-b644-772518e4eaae-attachment.txt", "type": "text/plain"}, {"name": "stderr", "source": "fdf6c1d9-44e6-4f10-91e1-4a65c26b2ef5-attachment.txt", "type": "text/plain"}], "parameters": [{"name": "case", "value": "{'mobile': '18611458781', 'pwd': '111', 'expected': '此账号没有经过授权,请联系管理员!'}"}], "start": 1667286821860, "stop": 1667286822179, "uuid": "41c3bc8f-cc6b-4f67-9101-e2dc2397ab5d", "historyId": "79906ae4b91b185b0ea29785301e04ac", "testCaseId": "8b848752bf4ac3b5ac7d380bf9668e8d", "fullName": "testcases.test_login_ddt.TestLogin#test_login_alert_fail", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "17400-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1,8 @@ | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:214 等待元素可见--【None】--成功 | |||
INFO test_log:base_page.py:62 点击元素--【登录页面_登录按钮】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
INFO test_log:test_login_ddt.py:58 【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1,8 @@ | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:214 等待元素可见--【None】--成功 | |||
INFO test_log:base_page.py:62 点击元素--【登录页面_登录按钮】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
INFO test_log:test_login_ddt.py:58 【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"uuid": "7710be85-c3b1-4eea-a230-53dd26b94178", "befores": [{"name": "case", "status": "passed", "start": 1667286647797, "stop": 1667286647797}], "start": 1667286647797, "stop": 1667286647804} |
@@ -0,0 +1 @@ | |||
{"uuid": "0a152b93-2dd2-407d-a961-91b85e6be52e", "befores": [{"name": "case", "status": "passed", "start": 1667286802553, "stop": 1667286802553}], "start": 1667286802553, "stop": 1667286807190} |
@@ -0,0 +1 @@ | |||
{"uuid": "2498c9a7-fde0-4d01-99bf-bf8253412a68", "children": ["c44e51c8-605c-41af-a36e-5bcad2a5e39e"], "befores": [{"name": "login_fixture", "status": "passed", "start": 1667286807194, "stop": 1667286808956}], "afters": [{"name": "login_fixture::0", "status": "passed", "start": 1667286809157, "stop": 1667286811200}], "start": 1667286807194, "stop": 1667286811200} |
@@ -0,0 +1,8 @@ | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:214 等待元素可见--【None】--成功 | |||
INFO test_log:base_page.py:62 点击元素--【登录页面_登录按钮】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
INFO test_log:test_login_ddt.py:58 【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"uuid": "4d87b2f7-867f-4c7d-8297-8e5308fe31fa", "befores": [{"name": "case", "status": "passed", "start": 1667205211405, "stop": 1667205211405}], "start": 1667205211405, "stop": 1667205221192} |
@@ -0,0 +1 @@ | |||
{"uuid": "f0940343-09f0-4c2c-8cf6-da59e72d250e", "children": ["f48b0fdf-272f-47e2-819d-f2ed61e914ed"], "befores": [{"name": "login_fixture", "status": "broken", "statusDetails": {"message": "TypeError: __init__() got an unexpected keyword argument 'is_headers'\n", "trace": " File \"D:\\program\\python37\\lib\\site-packages\\pluggy\\_callers.py\", line 39, in _multicall\n res = hook_impl.function(*args)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 1111, in pytest_fixture_setup\n result = call_fixture_func(fixturefunc, request, kwargs)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 883, in call_fixture_func\n fixture_result = next(generator)\n File \"D:\\pythonProject\\QCD_webUI\\testcases\\conftest.py\", line 40, in login_fixture\n driver = webdriver.Chrome(is_headers=False)\n"}, "start": 1667286724082, "stop": 1667286724082}], "start": 1667286724082, "stop": 1667286724087} |
@@ -0,0 +1,8 @@ | |||
2022-10-31 16:33:56,669 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:56,671 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:56,860 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:56,861 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:57,674 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-31 16:33:57,745 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-10-31 16:33:57,797 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-10-31 16:33:57,820 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"name": "此账号没有经过授权,请联系管理员!", "status": "passed", "description": "登录失败--此账号没有经过授权,请联系管理员!", "attachments": [{"name": "log", "source": "04d158ac-e511-4e34-a2d4-7f044ae10886-attachment.txt", "type": "text/plain"}, {"name": "stderr", "source": "162600d3-04fb-4fd0-a7ca-9d1e9b558d4b-attachment.txt", "type": "text/plain"}], "parameters": [{"name": "case", "value": "{'mobile': '18611458781', 'pwd': '111', 'expected': '此账号没有经过授权,请联系管理员!'}"}], "start": 1667205242548, "stop": 1667205243678, "uuid": "0f17bc02-6527-4de6-bef3-c5143bd895e9", "historyId": "79906ae4b91b185b0ea29785301e04ac", "testCaseId": "8b848752bf4ac3b5ac7d380bf9668e8d", "fullName": "testcases.test_login_ddt.TestLogin#test_login_alert_fail", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "15068-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1 @@ | |||
{"name": "请输入正确的手机号", "status": "passed", "description": "登录失败--此账号没有经过授权,请联系管理员!", "attachments": [{"name": "log", "source": "b8124d29-c139-427a-ac38-d81c6670a426-attachment.txt", "type": "text/plain"}, {"name": "stderr", "source": "15c60f0f-9290-4fc8-ab26-ff2bbb79e2df-attachment.txt", "type": "text/plain"}], "parameters": [{"name": "case", "value": "{'mobile': '1860045454545', 'pwd': '11', 'expected': '请输入正确的手机号'}"}], "start": 1667205230127, "stop": 1667205230680, "uuid": "6fac8052-b981-4294-ba3e-f5062f254797", "historyId": "b08c09670a5469b7779fdc0ff9f3ae6b", "testCaseId": "007630122853f6ac4ea2f284b8c09793", "fullName": "testcases.test_login_ddt.TestLogin#test_login_fail", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "15068-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1 @@ | |||
{"uuid": "52686328-6328-4e00-9959-38f693315eb6", "children": ["41c3bc8f-cc6b-4f67-9101-e2dc2397ab5d"], "befores": [{"name": "login_fixture", "status": "passed", "start": 1667286820163, "stop": 1667286821859}], "afters": [{"name": "login_fixture::0", "status": "passed", "start": 1667286822179, "stop": 1667286824221}], "start": 1667286820163, "stop": 1667286824221} |
@@ -0,0 +1,8 @@ | |||
2022-11-01 15:12:49,058 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:49,059 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:49,207 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:49,207 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:49,332 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:12:49,400 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:12:50,010 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败弹框提示】--成功 | |||
2022-11-01 15:12:50,022 - [test_login_ddt.py-->line:79] - INFO :【此账号没有经过授权,请联系管理员!--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"name": "test_login_success[case0]", "status": "broken", "statusDetails": {"message": "TypeError: __init__() got an unexpected keyword argument 'is_headers'", "trace": "@pytest.fixture(scope=\"function\")\n def login_fixture():\n #用例前置\n> driver = webdriver.Chrome(is_headers=False)\nE TypeError: __init__() got an unexpected keyword argument 'is_headers'\n\ntestcases\\conftest.py:41: TypeError"}, "description": "登录成功", "parameters": [{"name": "case", "value": "{'mobile': '18684720553', 'pwd': 'python', 'expected': '登录成功'}"}], "start": 1667286647706, "stop": 1667286647706, "uuid": "c9ad2f41-e678-46b9-a873-0c92e4ee3c9a", "historyId": "6284ae4c3adb54a796d0c3e86b808086", "testCaseId": "4f4e1a9d30341c741830d94fdf6be8df", "fullName": "testcases.test_login_ddt.TestLogin#test_login_success", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "18384-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1,7 @@ | |||
2022-10-31 16:33:35,543 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:35,544 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:35,715 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:35,716 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:35,925 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-31 16:33:36,003 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-10-31 16:33:38,970 - [test_login_ddt.py-->line:36] - INFO :【登录成功--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"uuid": "234ab8f2-f421-46b3-b696-10241a59e72a", "children": ["c9ad2f41-e678-46b9-a873-0c92e4ee3c9a"], "befores": [{"name": "login_fixture", "status": "broken", "statusDetails": {"message": "TypeError: __init__() got an unexpected keyword argument 'is_headers'\n", "trace": " File \"D:\\program\\python37\\lib\\site-packages\\pluggy\\_callers.py\", line 39, in _multicall\n res = hook_impl.function(*args)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 1111, in pytest_fixture_setup\n result = call_fixture_func(fixturefunc, request, kwargs)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 883, in call_fixture_func\n fixture_result = next(generator)\n File \"D:\\pythonProject\\QCD_webUI\\testcases\\conftest.py\", line 41, in login_fixture\n driver = webdriver.Chrome(is_headers=False)\n"}, "start": 1667286647707, "stop": 1667286647707}], "start": 1667286647707, "stop": 1667286647758} |
@@ -0,0 +1 @@ | |||
{"uuid": "ba0aa11f-356c-4be1-a205-5a5de656c926", "children": ["92304f5e-4851-4b86-82d2-70ac46dc0458"], "befores": [{"name": "login_fixture", "status": "passed", "start": 1667286802553, "stop": 1667286804238}], "afters": [{"name": "login_fixture::0", "status": "passed", "start": 1667286805140, "stop": 1667286807189}], "start": 1667286802553, "stop": 1667286807189} |
@@ -0,0 +1 @@ | |||
{"name": "请输入正确的手机号", "status": "passed", "description": "登录失败--此账号没有经过授权,请联系管理员!", "attachments": [{"name": "log", "source": "777ffa41-204c-44a4-911e-3d8a42124148-attachment.txt", "type": "text/plain"}, {"name": "stderr", "source": "a8e51bf3-50ff-40e2-a77b-6ca08d9ed7fd-attachment.txt", "type": "text/plain"}], "parameters": [{"name": "case", "value": "{'mobile': 'wqeq', 'pwd': '111', 'expected': '请输入正确的手机号'}"}], "start": 1667286764412, "stop": 1667286764834, "uuid": "1e6bfc23-6c2e-45a3-9e5a-496226811d66", "historyId": "815b0c5e2b778516245092332f3043a4", "testCaseId": "007630122853f6ac4ea2f284b8c09793", "fullName": "testcases.test_login_ddt.TestLogin#test_login_fail", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "8028-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1 @@ | |||
{"uuid": "30d32947-39c4-456c-b7d8-4fc72833c27f", "befores": [{"name": "case", "status": "passed", "start": 1667286745971, "stop": 1667286745971}], "start": 1667286745971, "stop": 1667286752417} |
@@ -0,0 +1 @@ | |||
{"uuid": "d15c4ad6-5aa8-4679-afea-86a16bd9982f", "befores": [{"name": "case", "status": "passed", "start": 1667286647773, "stop": 1667286647773}], "start": 1667286647773, "stop": 1667286647782} |
@@ -0,0 +1 @@ | |||
{"uuid": "78f1cafc-6074-4c5c-ad9f-6914e258ec7a", "befores": [{"name": "case", "status": "passed", "start": 1667286757696, "stop": 1667286757696}], "start": 1667286757696, "stop": 1667286762512} |
@@ -0,0 +1,7 @@ | |||
2022-11-01 15:12:28,672 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:28,672 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:28,864 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:28,864 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:29,015 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:12:29,090 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:12:30,151 - [test_login_ddt.py-->line:36] - INFO :【登录成功--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"name": "请输入正确的手机号", "status": "passed", "description": "登录失败--此账号没有经过授权,请联系管理员!", "attachments": [{"name": "log", "source": "300cdbf3-6daf-4818-8143-1fbb6e526449-attachment.txt", "type": "text/plain"}, {"name": "stderr", "source": "394ace3e-fb1f-4adf-8ae9-9f5875f1e695-attachment.txt", "type": "text/plain"}], "parameters": [{"name": "case", "value": "{'mobile': 'wqeq', 'pwd': '111', 'expected': '请输入正确的手机号'}"}], "start": 1667205236569, "stop": 1667205237822, "uuid": "23e8f28f-9f72-444c-8818-740e554432ec", "historyId": "815b0c5e2b778516245092332f3043a4", "testCaseId": "007630122853f6ac4ea2f284b8c09793", "fullName": "testcases.test_login_ddt.TestLogin#test_login_fail", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "15068-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1 @@ | |||
{"uuid": "5ef0c62b-723f-4815-976f-076bc609b887", "befores": [{"name": "case", "status": "passed", "start": 1667286815148, "stop": 1667286815148}], "start": 1667286815148, "stop": 1667286820158} |
@@ -0,0 +1 @@ | |||
{"uuid": "ff3451bc-f21d-44f0-b434-870098bdb6f8", "children": ["23e8f28f-9f72-444c-8818-740e554432ec"], "befores": [{"name": "login_fixture", "status": "passed", "start": 1667205233944, "stop": 1667205236567}], "afters": [{"name": "login_fixture::0", "status": "passed", "start": 1667205237822, "stop": 1667205240045}], "start": 1667205233944, "stop": 1667205240045} |
@@ -0,0 +1,8 @@ | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:214 等待元素可见--【None】--成功 | |||
INFO test_log:base_page.py:62 点击元素--【登录页面_登录按钮】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
INFO test_log:test_login_ddt.py:58 【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1,8 @@ | |||
2022-11-01 15:13:32,904 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:32,905 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:32,966 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:32,967 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:33,033 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:13:33,063 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:13:33,080 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-11-01 15:13:33,095 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"uuid": "6a2151df-27c5-433a-99cd-034a232a8277", "children": ["714393c1-f4b6-4e32-8e2f-c254a612da95"], "befores": [{"name": "login_fixture", "status": "passed", "start": 1667286757696, "stop": 1667286759920}], "afters": [{"name": "login_fixture::0", "status": "passed", "start": 1667286760326, "stop": 1667286762511}], "start": 1667286757696, "stop": 1667286762511} |
@@ -0,0 +1,8 @@ | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:214 等待元素可见--【None】--成功 | |||
INFO test_log:base_page.py:62 点击元素--【登录页面_登录按钮】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
INFO test_log:test_login_ddt.py:58 【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"name": "请输入正确的手机号", "status": "passed", "description": "登录失败--此账号没有经过授权,请联系管理员!", "attachments": [{"name": "log", "source": "197451a0-f98f-4d27-bb5b-c4041f7af1fa-attachment.txt", "type": "text/plain"}, {"name": "stderr", "source": "6e05471b-3c42-4e2d-8f16-99b671f3e2b6-attachment.txt", "type": "text/plain"}], "parameters": [{"name": "case", "value": "{'mobile': '1860045454545', 'pwd': '11', 'expected': '请输入正确的手机号'}"}], "start": 1667286812885, "stop": 1667286813096, "uuid": "692c5b93-4519-44c2-8be9-435eea0cb104", "historyId": "b08c09670a5469b7779fdc0ff9f3ae6b", "testCaseId": "007630122853f6ac4ea2f284b8c09793", "fullName": "testcases.test_login_ddt.TestLogin#test_login_fail", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "17400-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1 @@ | |||
{"uuid": "84703254-66c3-44b2-985c-fdd0457f465b", "children": ["e10d289e-92fd-4fca-84f8-058553aba7c0"], "befores": [{"name": "login_fixture", "status": "passed", "start": 1667205221197, "stop": 1667205225347}], "afters": [{"name": "login_fixture::0", "status": "passed", "start": 1667205225691, "stop": 1667205227871}], "start": 1667205221197, "stop": 1667205227871} |
@@ -0,0 +1,8 @@ | |||
2022-10-31 16:33:45,378 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:45,378 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-10-31 16:33:45,467 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:45,468 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-10-31 16:33:45,592 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-10-31 16:33:45,639 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-10-31 16:33:45,669 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-10-31 16:33:45,689 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1,8 @@ | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:214 等待元素可见--【None】--成功 | |||
INFO test_log:base_page.py:62 点击元素--【登录页面_登录按钮】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
INFO test_log:test_login_ddt.py:58 【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1,8 @@ | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_账号输入框】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:43 查找元素--【登录页面_密码输入框】--成功 | |||
INFO test_log:base_page.py:214 等待元素可见--【None】--成功 | |||
INFO test_log:base_page.py:62 点击元素--【登录页面_登录按钮】--成功 | |||
INFO test_log:base_page.py:174 等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
INFO test_log:test_login_ddt.py:58 【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"uuid": "25ded4a7-6e0e-4d02-a393-22bb8c0ef74d", "children": ["4e41fe6e-c15b-4c7d-a171-09a8cad0388a"], "befores": [{"name": "login_fixture", "status": "broken", "statusDetails": {"message": "TypeError: __init__() got an unexpected keyword argument 'is_headers'\n", "trace": " File \"D:\\program\\python37\\lib\\site-packages\\pluggy\\_callers.py\", line 39, in _multicall\n res = hook_impl.function(*args)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 1111, in pytest_fixture_setup\n result = call_fixture_func(fixturefunc, request, kwargs)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 883, in call_fixture_func\n fixture_result = next(generator)\n File \"D:\\pythonProject\\QCD_webUI\\testcases\\conftest.py\", line 41, in login_fixture\n driver = webdriver.Chrome(is_headers=False)\n"}, "start": 1667286647774, "stop": 1667286647774}], "start": 1667286647774, "stop": 1667286647782} |
@@ -0,0 +1,8 @@ | |||
2022-11-01 15:12:34,941 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:34,942 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:12:35,091 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:35,092 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:12:35,262 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:12:35,318 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:12:35,350 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-11-01 15:12:35,374 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1,8 @@ | |||
2022-11-01 15:13:36,922 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:36,923 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_账号输入框】--成功 | |||
2022-11-01 15:13:36,981 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:36,981 - [base_page.py-->line:43] - INFO :查找元素--【登录页面_密码输入框】--成功 | |||
2022-11-01 15:13:37,047 - [base_page.py-->line:214] - INFO :等待元素可见--【None】--成功 | |||
2022-11-01 15:13:37,077 - [base_page.py-->line:62] - INFO :点击元素--【登录页面_登录按钮】--成功 | |||
2022-11-01 15:13:37,094 - [base_page.py-->line:174] - INFO :等待元素可见--【登录页面_登录失败错误提示】--成功 | |||
2022-11-01 15:13:37,105 - [test_login_ddt.py-->line:58] - INFO :【请输入正确的手机号--用例】------》执行成功 |
@@ -0,0 +1 @@ | |||
{"name": "test_login_fail[case2]", "status": "broken", "statusDetails": {"message": "TypeError: __init__() got an unexpected keyword argument 'is_headers'", "trace": "@pytest.fixture(scope=\"function\")\n def login_fixture():\n #用例前置\n> driver = webdriver.Chrome(is_headers=False)\nE TypeError: __init__() got an unexpected keyword argument 'is_headers'\n\ntestcases\\conftest.py:41: TypeError"}, "description": "登录失败--此账号没有经过授权,请联系管理员!", "parameters": [{"name": "case", "value": "{'mobile': 'wqeq', 'pwd': '111', 'expected': '请输入正确的手机号'}"}], "start": 1667286647784, "stop": 1667286647784, "uuid": "c8f85ea2-6f93-4bf6-a9e6-4c189da3f5d6", "historyId": "815b0c5e2b778516245092332f3043a4", "testCaseId": "007630122853f6ac4ea2f284b8c09793", "fullName": "testcases.test_login_ddt.TestLogin#test_login_fail", "labels": [{"name": "story", "value": "登录功能"}, {"name": "parentSuite", "value": "testcases"}, {"name": "suite", "value": "test_login_ddt"}, {"name": "subSuite", "value": "TestLogin"}, {"name": "host", "value": "LAPTOP-MB1T4SUA"}, {"name": "thread", "value": "18384-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcases.test_login_ddt"}]} |
@@ -0,0 +1 @@ | |||
{"uuid": "2e363687-2b8e-460d-a123-06873739f72c", "children": ["5cf9a7cf-6d61-406a-8b8d-79fc1004f895"], "befores": [{"name": "login_fixture", "status": "broken", "statusDetails": {"message": "TypeError: __init__() got an unexpected keyword argument 'is_headers'\n", "trace": " File \"D:\\program\\python37\\lib\\site-packages\\pluggy\\_callers.py\", line 39, in _multicall\n res = hook_impl.function(*args)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 1111, in pytest_fixture_setup\n result = call_fixture_func(fixturefunc, request, kwargs)\n File \"D:\\program\\python37\\lib\\site-packages\\_pytest\\fixtures.py\", line 883, in call_fixture_func\n fixture_result = next(generator)\n File \"D:\\pythonProject\\QCD_webUI\\testcases\\conftest.py\", line 41, in login_fixture\n driver = webdriver.Chrome(is_headers=False)\n"}, "start": 1667286647764, "stop": 1667286647764}], "start": 1667286647764, "stop": 1667286647771} |
Dear OpenI User
Thank you for your continuous support to the Openl Qizhi Community AI Collaboration Platform. In order to protect your usage rights and ensure network security, we updated the Openl Qizhi Community AI Collaboration Platform Usage Agreement in January 2024. The updated agreement specifies that users are prohibited from using intranet penetration tools. After you click "Agree and continue", you can continue to use our services. Thank you for your cooperation and understanding.
For more agreement content, please refer to the《Openl Qizhi Community AI Collaboration Platform Usage Agreement》