Commit 0a2fc41a authored by 17322369953's avatar 17322369953
Browse files

guke先推送部分

parent a160c685
# author:qinguanglei
# ddate:2023/11/10 16:06
# author:qinguanglei
# ddate:2023/11/13 11:03
# author:qinguanglei
# ddate:2023/11/10 16:07
# author:qinguanglei
# ddate:2023/11/13 15:32
# 登录验证码错误
VERIFY_CODE_ERROR = "验证码错误!!"
# 登录用户名或者密码错误
USER_PASSWORD_ERROR = "用户名或密码错误"
# 登录成功
LOGIN_SUCCESS = "欢迎来到国药器械"
# 登录不输入用户名或者密码
NO_USER_OR_PASSWORD = "不适当的用户名或口令,请重新确认"
# 登录不输入验证码
NO_VERIFY_CODE = "请输入验证码后再登录!!"
"""公司id与名字"""
COMPANY_ID_NAME = {"00122": "国药集团四川省医疗器械有限公司", "00132": "国药集团重庆医疗器械有限公司",
"00103": "国药集团北京医疗器械有限公司"}
"""保存成功"""
SAVE_SUCCESS = "保存成功"
"""提交成功"""
SUBMITTED_SUCCESS = "已提交"
import pymysql
from dbutils.pooled_db import PooledDB
pool = PooledDB(
creator=pymysql,
# 连接池允许的最大链接数,0和None表示不限制连接数
maxconnections=6,
# 初始化时,连接池中最少创建的空闲链接,0表示不创建
mincached=2,
# 连接池中最多闲置的链接,0和None表示不限制连接数
maxcached=5,
# 链接池中最多的共享链接数量,0和None表示全部共享,
# PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
maxshared=0,
# 连接池中如果没有可用的链接后,是否阻塞等待。True:等待;False:不等待然后报错。
blocking=True,
# 一个链接最多被重复使用的次数,None表示无限制
maxusage=None,
# 开始会话前执行的命令列表,如:["set datestyle to ...", "set time zone ..."]
setsession=[],
# ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested,
# 2 = when a cursor is created, 4 = when a query is executed, 7 = always
ping=0,
# 数据库ip
host='127.0.0.1',
port=3306,
user='root',
password='123456',
database='autotest',
charset='utf8'
)
class SQLHelper(object):
@staticmethod
def open():
connection = pool.connection()
cursor = connection.cursor(cursor=pymysql.cursors.DictCursor)
return connection, cursor
@staticmethod
def close(connection, cursor):
connection.commit()
cursor.close()
connection.close()
@classmethod
def fetch_one(cls, sql, args):
conn, cursor = cls.open()
cursor.execute(sql, args)
obj = cursor.fetchone()
cls.close(conn, cursor)
return obj
@classmethod
def fetch_all(cls, sql, args):
conn, cursor = cls.open()
cursor.execute(sql, args)
obj = cursor.fetchall()
cls.close(conn, cursor)
return obj
@classmethod
def fetch_many(cls, sql, args, num):
conn, cursor = cls.open()
cursor.execute(sql, args)
obj = cursor.fetchmany(num)
cls.close(conn, cursor)
return obj
@classmethod
def insert_one(cls, sql, args):
conn, cursor = cls.open()
cursor.execute(sql, args)
cls.close(conn, cursor)
@classmethod
def update_one(cls, sql, args):
conn, cursor = cls.open()
cursor.execute(sql, args)
cls.close(conn, cursor)
"""
日志生成步骤:
1,设置存放日志的目录,不存在则创建。
2,设置日志的级别’DE_BUG‘,’INFO‘,’WARING‘,’ERROR‘,CRITICAL’.
3,设置写入日志的格式‘[%(asctime)s][%(threadName)s][line:%(lineno)d] %(levelname)s: %(message)s’
4,设置控制台输出
5,设置日志文件名
6,确保每日生成不同的日志文件,且能够区分生成时间,可用logging.handlers.TimeRotatingFileHandler进行处理,使用之前先进行导入
7,将日志对象添加到logger里
8,进行调用即可get_logger(name="test")
"""
import logging
import os
import time
from logging.handlers import TimedRotatingFileHandler
from common.read_config import ReadConfig
class Log(object):
def __init__(self):
# 获取日志器
self.logger = logging.getLogger()
# 先设置日志的的基础显示等级
self.logger.setLevel(logging.INFO)
# 设置日志的格式‘[%(asctime)s][%(threadName)s][line:%(lineno)d] %(levelname)s: %(message)s’
formatter = '[%(asctime)s] [%(threadName)s] [line:%(lineno)d] %(levelname)s: %(message)s'
log_formatter = logging.Formatter(formatter)
# 设置存放日志的目录,不存在则创建。
# 获取日志文件的目录
# log_dir = os.path.join(ReadConfig().get('LOGFILE', 'LOGFILE_DIR'), 'report')
log_dir = ReadConfig().get('LOG-FILE', 'LOGFILE_DIR')
# 若该目录不存在则创建该目录
if not os.path.exists(log_dir):
os.mkdir(log_dir)
# 设置日志文件名
log_file_name = time.strftime('%Y-%m-%d', time.localtime(time.time())) + '.log'
'''
实例化TimedRotatingFileHandler
filename:日志文件名。
when:日志文件按什么切分。'S'-秒;'M'-分钟;'H'-小时;'D'-天;'W'-周
这里需要注意,如果选择D-天,那么这个不是严格意义上的‘天’,是从你项目启动开始,过了24小时,才会重新创建一个新的日志文件,如果
项目重启,这个时间就会重置。选择‘MIDNIGHT’是指过了凌晨12点就会创建新的日志。
interval:时间间隔
backupCount:是保留日志的个数。默认是0,不会自动删除,如何超过这个数就会自动删除
'''
# 创建文件日志与控制台日志处理器
file_handler = TimedRotatingFileHandler(filename=os.path.join(log_dir, log_file_name),
when='MIDNIGHT',
interval=1,
backupCount=3,
encoding='utf-8')
console_handler = logging.StreamHandler()
# 设置文件日志与控制台日志格式
file_handler.setFormatter(log_formatter)
console_handler.setFormatter(log_formatter)
# 设置文件日志与控制台日志基础等级
# 设置日志的级别’DE_BUG‘,’INFO‘,’WARING‘,’ERROR‘,CRITICAL’.
file_handler.setLevel(logging.INFO)
console_handler.setLevel(logging.INFO)
# 添加日志处理器,文件日志与控制台日志
self.logger.addHandler(file_handler)
self.logger.addHandler(console_handler)
# 实例化,后面直接引入使用
log = Log().logger
import configparser
from config.config import Config
class ReadConfig(object):
def __init__(self):
# 获取ini配置文件解析器
self.config = configparser.RawConfigParser()
# 获取ini配置文件路径
self.ini_path = Config().ini_path
# 读取ini配置文件
self.config.read(self.ini_path, encoding='utf-8')
"""通过section与option获取ini文件的值"""
def get(self, section, option):
return self.config.get(section, option)
"""将段下面的数据项更新"""
def set(self, section, option, value):
self.config.set(section, option, value)
with open(self.ini_path, 'w') as w:
self.config.write(w)
import os
from email.message import EmailMessage
from common.logger import log
import smtplib
import ssl
import zipfile
from common.read_config import ReadConfig
from datetime import datetime
import time
class Mail(object):
def __init__(self):
# 邮箱服务器
self.mail_host = 'smtp.qq.com'
# 邮件发送者x1
self.mail_sender = '381713747@qq.com'
# 发送者授权码
self.mail_authorization = 'insqahzqxxacbjhd'
# 邮件接受者
self.mail_receivers = 'qinguanglei@sinopharm.com'
def send(self):
context = ssl.create_default_context()
# 发送的信息实例
message = EmailMessage()
# 邮件主题
subject = '自动化测试结果,自动发送,请勿回复。'
message['subject'] = subject
# 邮件发送者
message['From'] = self.mail_sender
# 邮件接受者
message['To'] = self.mail_receivers
# 邮件内容
message.set_content("邮件内容")
try:
# 获取一个smtp对象
smtp_obj = smtplib.SMTP_SSL(self.mail_host, 465, context=context)
smtp_obj.login(self.mail_sender, self.mail_authorization)
smtp_obj.send_message(message)
smtp_obj.quit()
log.info('邮件发送成功')
except smtplib.SMTPException as e:
log.error('邮件发送失败%s' % e)
def zip_dir(self):
# 获取当前日期时间
current_time = time.strftime('%Y-%m-%d_%H:%M:%S', time.localtime(time.time()))
# 获取压缩文件主名字,直接未压缩文件目录
zip_main_name = ReadConfig().get('REPORT-FILE', 'REPORT_DIR')
# 拼接压缩文件名字
zip_name = ''.join([zip_main_name, current_time, '.zip'])
log.info(zip_name)
zip_obj = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)
for root, dir_names, file_names in os.walk(zip_main_name):
fpath = root.replace(zip_main_name, '')
for file_name in file_names:
zip_obj.write(os.path.join(zip_name, file_name), os.path.join(fpath, file_name))
zip_obj.close()
log.debug('压缩成功')
from pytesseract import image_to_string
from PIL import Image, ImageEnhance
from common.read_config import ReadConfig
from common.logger import log
def gen_text_from_picture():
log.info('开始解析验证码')
# 打开图片,将图片转换为obj
image = Image.open(ReadConfig().config.get('SCREENSHOT', 'ELEMENT_SCREENSHOT_PATH'))
# 识别图中的文字
verify_code_text = image_to_string(image)
# 针对平台,去掉最后一个字符“\n”,不同的平台最后一个字符可能不一样
verify_code_text_no_wrap = verify_code_text.replace('\n', '')
log.info("当前验证码的文字为:" + verify_code_text_no_wrap)
# 使用完成后关闭
image.close()
# 返回验证码
return verify_code_text_no_wrap
def gen_text_from_picture_guke():
log.info('开始解析验证码')
# 打开图片,将图片转换为obj
image = Image.open(ReadConfig().config.get('SCREENSHOT', 'ELEMENT_SCREENSHOT_PATH'))
# 图片2直化
image = image.convert('L')
# 灰度化处理
image = ImageEnhance.Contrast(image)
image = image.enhance(3)
image2 = Image.new('RGB', (150, 60), (255, 255, 255))
image2.paste(image.copy(), (25, 10))
# 识别图中的文字
verify_code_text = image_to_string(image2)
# 针对平台,去掉最后一个字符“\n”,不同的平台最后一个字符可能不一样
verify_code_text_no_wrap = verify_code_text.replace('\n', '')
log.info("当前验证码的文字为:" + verify_code_text_no_wrap)
# 使用完成后关闭
image.close()
# 返回验证码
return verify_code_text_no_wrap
class VerifyCode(object):
def __init__(self, web_element, driver):
self.web_element = web_element
self.driver = driver
def indentify_verify_image(self):
# 先刷新验证码
self.web_element.click()
# 在首页展开后,对整个页面进行截图,截图保存目录在ini配置文件中定义
page_shot_dir = ReadConfig().get('SCREENSHOT', 'PAGE_SCREENSHOT_PATH')
# 截图
self.driver.save_screenshot(page_shot_dir)
# 转换图片为Image对象
page_shot_obj = Image.open(page_shot_dir)
# 获取验证码元素图片的位置
location = self.web_element.location
log.debug("验证码元素图片位置:%s" % location)
# 获取验证码元素图片的大小
size = self.web_element.size
log.debug("验证码元素图片大小:%s" % size)
# 获取图片的四个坐标点
left = location['x']
bottom = location['y']
right = left + size['width']
top = bottom + size['height']
log.debug("图片的四个位置。左:%s右:%s上:%s下:%s" % (left, right, top, bottom))
# 开始按照位置截图
crop_image_obj = page_shot_obj.crop((left, bottom, right, top))
# 将切割好的图片保存,保存的目录为crop_dir,截图保存目录在ini配置文件中定义
crop_dir = ReadConfig().get('SCREENSHOT', 'ELEMENT_SCREENSHOT_PATH')
crop_image_obj.save(crop_dir)
# 识别验证码中的字符
verify_code_text = gen_text_from_picture()
log.debug("当前验证码的文字为:%s" % verify_code_text)
return verify_code_text
def indentify_verify_image_guke(self):
# 先刷新验证码
self.web_element.click()
# 在首页展开后,对整个页面进行截图,截图保存目录在ini配置文件中定义
page_shot_dir = ReadConfig().get('SCREENSHOT', 'PAGE_SCREENSHOT_PATH')
# 截图
self.driver.save_screenshot(page_shot_dir)
# 转换图片为Image对象
page_shot_obj = Image.open(page_shot_dir)
# 获取验证码元素图片的位置
location = self.web_element.location
log.debug("验证码元素图片位置:%s" % location)
# 获取验证码元素图片的大小
size = self.web_element.size
log.debug("验证码元素图片大小:%s" % size)
# 获取图片的四个坐标点
left = location['x']
bottom = location['y']
right = left + size['width']
top = bottom + size['height']
log.debug("图片的四个位置。左:%s右:%s上:%s下:%s" % (left, right, top, bottom))
# 开始按照位置截图
crop_image_obj = page_shot_obj.crop((left, bottom, right, top))
# 将切割好的图片保存,保存的目录为crop_dir,截图保存目录在ini配置文件中定义
crop_dir = ReadConfig().get('SCREENSHOT', 'ELEMENT_SCREENSHOT_PATH')
crop_image_obj.save(crop_dir)
# 识别验证码中的字符
verify_code_text = gen_text_from_picture_guke()
log.debug("当前验证码的文字为:%s" % verify_code_text)
return verify_code_text
# author:qinguanglei
# ddate:2023/3/9 20:46
[HOST]
#URL = http://10.17.65.216:8088/portal/
URL = http://gk.cmic.com.cn/portal/
[ACCOUNT-PURCHASE]
ACCOUNT = admin
PASSWORD = Gyxc1234
[SCREENSHOT]
PAGE_SCREENSHOT_PATH = d:/rf/image/org.png
ELEMENT_SCREENSHOT_PATH = d:/rf/image/curr.png
[LOG-FILE]
LOGFILE_DIR = log
[REPORT-FILE]
REPORT_DIR = report
\ No newline at end of file
import os
class Config(object):
# 项目的目录,现获取本文件的绝对路径,再获取文件目录,再获取上一级目录,就是本项目目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
"""获取ini配置文件的路径"""
@property
def ini_path(self):
# 先拼接ini文件目录
ini_path = os.path.join(self.BASE_DIR, 'config', 'config.ini')
if not os.path.exists(ini_path):
raise FileNotFoundError("配置文件%s不存在!" % ini_path)
return ini_path
# author:qinguanglei
# ddate:2023/11/10 16:25
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.remote.webdriver import WebElement
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
from time import sleep
from datetime import datetime
from common.logger import log
import os
class BasePage(object):
def __init__(self, driver):
# 获取驱动
self.driver = driver
# 线程等待时间,秒
self.time_seconds = 1
def open_page(self, url):
"""打开页面"""
# 获取页面链接
self.driver.get(url)
# 设置隐式等待时间
self.driver.implicitly_wait(10)
# 窗口最大化
self.driver.maximize_window()
'''单击一个元素'''
def single_click(self, page_element):
page_element.click()
def single_click_then_wait(self, page_element, seconds):
page_element.click()
self.wait_seconds(seconds)
'''获取一个元素上的文本信息'''
def get_text(self, page_element):
text = page_element.get_attribute('textContent')
return text
'''填入文本'''
def input_text(self, page_element, text):
page_element.clear()
page_element.send_keys(text)
"""在一定时间内定位到某个元素,且这个元素已经能呈现出来"""
def get_element_wait_presence(self, locator):
self.wait_seconds(self.time_seconds)
element = WebDriverWait(self.driver, 10, 0.1).until(EC.presence_of_element_located(locator))
return element
def refresh_page(self):
"""刷新页面"""
self.driver.refresh()
def move_to_element(self, page_element):
"""移动鼠标仅限于鼠标触发型元素,需要等待元素程序才移动"""
self.wait_seconds(2 * self.time_seconds)
"""鼠标移到page_element上"""
action_chains = ActionChains(self.driver)
action_chains.move_to_element(page_element).perform()
"""切换到iframe上"""
def switch_to_iframe(self, page_element_iframe):
self.wait_seconds(self.time_seconds)
self.driver.switch_to.frame(page_element_iframe)
"""获取一个表的行信息"""
def get_all_rows_from_tale(self, table_element):
self.wait_seconds(self.time_seconds)
rows = table_element.find_elements(By.TAG_NAME, "tr")
return rows
"""获取一个表,指定行的列信息"""
def get_all_columns_from_row(self, row_element):
columns = row_element.find_elements(By.TAG_NAME, "td")
return columns
'''给定一个表中的某行的某列,要输入信息,需要取出该栏位中的input元素-后续看要不要将该方法移出基础库,移到对应的功能库'''
def get_input_from_column(self, column):
element = column.find_element(By.TAG_NAME, 'input')
return element
def wait_seconds(self, seconds):
"""睡眠时间-秒"""
sleep(seconds)
def get_screenshot(self, filename="截图"):
""""截图"""
# 截图根目录
screenshot_dir = './screenshot'
if not os.path.exists(screenshot_dir):
# 目录不存在则创建目录
os.mkdir(screenshot_dir)
# 当前日期
now_date = datetime.now().strftime('%Y%m%d')
# 设置文件目录下按照日期新建的子文件夹
screenshot_date_dir = os.path.join(screenshot_dir, str(now_date))
if not os.path.exists(screenshot_date_dir):
# 不存在则创建
os.mkdir(screenshot_date_dir)
# 时间戳到毫秒级
now_time_ms = datetime.now().strftime('%H%M%S%f')
# 拼接截图的图片名与类型,时间戳 + 文件名 + .png
filename = now_time_ms + filename + ".png"
# 图片目录确定
filepath = os.path.join(screenshot_date_dir, filename)
# 截图保存到该目录
self.driver.get_screenshot_as_file(filepath)
'''展示窗口句柄信息,测试用,只下日志'''
def display_window_handle(self):
log.info('当前窗口的title:%s' % self.driver.title)
log.info('当前窗口的url:%s' % self.driver.current_url)
log.info('当前窗口的句柄:%s' % self.driver.current_window_handle)
log.info('所有句柄:%s' % self.driver.window_handles)
'''获取当前页面title'''
def get_window_title(self):
""""切换页面需要时间"""
self.wait_seconds(self.time_seconds)
return self.driver.title
"""关闭当前页面"""
def close_browser(self):
self.driver.close()
"""关闭所有页面"""
def quit_browser(self):
self.driver.quit()
# author:qinguanglei
# ddate:2023/11/10 16:09
from page_class.base_page import BasePage
from selenium.webdriver.common.by import By
class PageLogin(BasePage):
# 账号
_account_locator = (By.ID, 'input1')
# 密码
_pass_locator = (By.ID, 'input2')
# 验证码输入
_verify_code_locator = (By.ID, 'photoCode')
# 验证码图片
_verify_image_locator = (By.ID, 'canvas')
# 登录按钮
_login_button_locator = (By.ID, 'loginBtn')
# 输入信息后,登录结果,主要针对错误输入
_login_result_locator = (By.XPATH, '//div[@id="simplealert"]/div[@class = "msg"]')
'''获取账号'''
def get_account(self):
return self.get_element_wait_presence(self._account_locator)
'''获取密码'''
def get_password(self):
return self.get_element_wait_presence(self._pass_locator)
'''获取验证码'''
def get_verify_code(self):
return self.get_element_wait_presence(self._verify_code_locator)
'''获取验证码图片元素'''
def get_verify_image(self):
return self.get_element_wait_presence(self._verify_image_locator)
'''获取登录按钮元素'''
def get_login_button(self):
return self.get_element_wait_presence(self._login_button_locator)
'''输入用户密码验证码后,登录结果提示'''
def get_login_result(self):
return self.get_element_wait_presence(self._login_result_locator)
import allure
import pytest
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from common.read_config import ReadConfig
from test_login.page_login import PageLogin
from common.verifycode import VerifyCode
from common import constant
from common.logger import log
@allure.feature('登录模块')
class TestLogin(object):
@pytest.fixture(scope='function', autouse=True)
def housework(self, browser):
# 驱动器从fixture传来
self.driver = browser
# 执行案例前统一获取页面元素操作方法
self.page_login = PageLogin(self.driver)
# 从配置文件中获取url
self.url = ReadConfig().get('HOST', 'URL')
self.page_login.open_page(self.url)
"""登录成功案例"""
@allure.story('登录成功案例-点击登录')
def test_login_success_click(self):
# 获取账号输入元素
account_element = self.page_login.get_account()
# 密码
password_element = self.page_login.get_password()
# 验证码
verify_input_element = self.page_login.get_verify_code()
# 输入账号密码,账号密码从配置文件中来
self.page_login.input_text(account_element, ReadConfig().get('ACCOUNT-PURCHASE', 'ACCOUNT'))
self.page_login.input_text(password_element, ReadConfig().get('ACCOUNT-PURCHASE', 'PASSWORD'))
# 获取验证码
# 先获取验证码图片元素
verify_code_element = self.page_login.get_verify_image()
# 获取验证码中的文字信息
verify_code_text = VerifyCode(verify_code_element, self.driver).indentify_verify_image_guke()
# 填充验证码文字
self.page_login.input_text(verify_input_element, verify_code_text)
# 获取登录按钮
login_button_element = self.page_login.get_login_button()
# 点击登录
self.page_login.single_click(login_button_element)
# 判断登录是否成功,登录成功会切换到另外一个页面,通过页面title来判断是否切换成功
assert self.page_login.get_window_title() == constant.LOGIN_SUCCESS
'''验证码错误案例'''
@allure.story('登录验证码错误案例')
def test_login_verify_code_error(self):
# 获取账号输入元素
account_element = self.page_login.get_account()
# 密码
password_element = self.page_login.get_password()
# 验证码
verify_input_element = self.page_login.get_verify_code()
# 输入账号密码,账号密码从配置文件中来
self.page_login.input_text(account_element, ReadConfig().get('ACCOUNT-PURCHASE', 'ACCOUNT'))
self.page_login.input_text(password_element, ReadConfig().get('ACCOUNT-PURCHASE', 'PASSWORD'))
# 获取验证码
# 输入错误的验证码
error_code = '1234'
self.page_login.input_text(verify_input_element, error_code)
# 获取登录按钮
login_button_element = self.page_login.get_login_button()
# 点击登录
self.page_login.single_click(login_button_element)
# 获取登录结果
login_result_element = self.page_login.get_login_result()
# 断言案例是否执行成功
assert self.page_login.get_text(login_result_element) == constant.VERIFY_CODE_ERROR
'''验证码错误案例'''
@allure.story('不输入用户名报错案例')
def test_login_no_input_userid(self):
# 密码
password_element = self.page_login.get_password()
# 验证码
verify_input_element = self.page_login.get_verify_code()
# 输入密码,密码从配置文件中来
self.page_login.input_text(password_element, ReadConfig().get('ACCOUNT-PURCHASE', 'PASSWORD'))
# 获取验证码
# 先获取验证码图片元素
verify_code_element = self.page_login.get_verify_image()
# 获取验证码中的文字信息
verify_code_text = VerifyCode(verify_code_element, self.driver).indentify_verify_image_guke()
# 填充验证码文字
self.page_login.input_text(verify_input_element, verify_code_text)
# 获取登录按钮
login_button_element = self.page_login.get_login_button()
# 点击登录
self.page_login.single_click(login_button_element)
# 获取登录结果
login_result_element = self.page_login.get_login_result()
# 断言案例是否执行成功
assert self.page_login.get_text(login_result_element) == constant.NO_USER_OR_PASSWORD
@allure.story('不输入密码报错案例')
def test_login_no_input_password(self):
# 获取账号输入元素
account_element = self.page_login.get_account()
# 验证码
verify_input_element = self.page_login.get_verify_code()
# 输入账号密码,账号密码从配置文件中来
self.page_login.input_text(account_element, ReadConfig().get('ACCOUNT-PURCHASE', 'ACCOUNT'))
# 获取验证码
# 先获取验证码图片元素
verify_code_element = self.page_login.get_verify_image()
# 获取验证码中的文字信息
verify_code_text = VerifyCode(verify_code_element, self.driver).indentify_verify_image_guke()
# 填充验证码文字
self.page_login.input_text(verify_input_element, verify_code_text)
# 获取登录按钮
login_button_element = self.page_login.get_login_button()
# 点击登录
self.page_login.single_click(login_button_element)
# 获取登录结果
login_result_element = self.page_login.get_login_result()
# 断言案例是否执行成功
assert self.page_login.get_text(login_result_element) == constant.NO_USER_OR_PASSWORD
@allure.story('不输入验证码案例')
def test_login_no_input_verifycode(self):
# 获取账号输入元素
account_element = self.page_login.get_account()
# 密码
password_element = self.page_login.get_password()
# 输入账号密码,账号密码从配置文件中来
self.page_login.input_text(account_element, ReadConfig().get('ACCOUNT-PURCHASE', 'ACCOUNT'))
self.page_login.input_text(password_element, ReadConfig().get('ACCOUNT-PURCHASE', 'PASSWORD'))
# 获取登录按钮
login_button_element = self.page_login.get_login_button()
# 点击登录
self.page_login.single_click(login_button_element)
# 获取登录结果
login_result_element = self.page_login.get_login_result()
# 断言案例是否执行成功
assert self.page_login.get_text(login_result_element) == constant.NO_VERIFY_CODE
@allure.story('用户名错误案例')
def test_login_userid_error(self):
# 获取账号输入元素
account_element = self.page_login.get_account()
# 密码
password_element = self.page_login.get_password()
# 验证码
verify_input_element = self.page_login.get_verify_code()
# 输入账号密码,账号密码从配置文件中来
self.page_login.input_text(account_element, ReadConfig().get('ACCOUNT-PURCHASE', 'ACCOUNT') + "ERRORTEST")
self.page_login.input_text(password_element, ReadConfig().get('ACCOUNT-PURCHASE', 'PASSWORD'))
# 获取验证码
# 先获取验证码图片元素
verify_code_element = self.page_login.get_verify_image()
# 获取验证码中的文字信息
verify_code_text = VerifyCode(verify_code_element, self.driver).indentify_verify_image_guke()
# 填充验证码文字
self.page_login.input_text(verify_input_element, verify_code_text)
# 获取登录按钮
login_button_element = self.page_login.get_login_button()
# 点击登录
self.page_login.single_click(login_button_element)
# 获取登录结果
login_result_element = self.page_login.get_login_result()
# 断言案例是否执行成功
assert self.page_login.get_text(login_result_element) == constant.USER_PASSWORD_ERROR
'''密码错误案例'''
@allure.story('密码错误案例')
def test_login_password_error(self):
# 获取账号输入元素
account_element = self.page_login.get_account()
# 密码
password_element = self.page_login.get_password()
# 验证码
verify_input_element = self.page_login.get_verify_code()
# 输入账号密码,账号密码从配置文件中来
self.page_login.input_text(account_element, ReadConfig().get('ACCOUNT-PURCHASE', 'ACCOUNT'))
self.page_login.input_text(password_element, ReadConfig().get('ACCOUNT-PURCHASE', 'PASSWORD') + "ERRORTEST")
# 获取验证码
# 先获取验证码图片元素
verify_code_element = self.page_login.get_verify_image()
# 获取验证码中的文字信息
verify_code_text = VerifyCode(verify_code_element, self.driver).indentify_verify_image_guke()
# 填充验证码文字
self.page_login.input_text(verify_input_element, verify_code_text)
# 获取登录按钮
login_button_element = self.page_login.get_login_button()
# 点击登录
self.page_login.single_click(login_button_element)
# 获取登录结果
login_result_element = self.page_login.get_login_result()
# 断言案例是否执行成功
assert constant.USER_PASSWORD_ERROR in self.page_login.get_text(login_result_element)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment