Commit d4f82932 authored by Bozhong钟波's avatar Bozhong钟波

Initial commit

parents
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="HtmlUnknownAttribute" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myValues">
<value>
<list size="2">
<item index="0" class="java.lang.String" itemvalue="form-group" />
<item index="1" class="java.lang.String" itemvalue="text" />
</list>
</value>
</option>
<option name="myCustomValuesEnabled" value="true" />
</inspection_tool>
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="ignoredErrors">
<list>
<option value="N802" />
</list>
</option>
</inspection_tool>
</profile>
</component>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (web_framework)" project-jdk-type="Python SDK" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/web_framework.iml" filepath="$PROJECT_DIR$/.idea/web_framework.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PackageRequirementsSettings">
<option name="requirementsPath" value="" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="py.test" />
</component>
</module>
\ No newline at end of file
"""
======================
Author: 柠檬班-小简
Time: 2020/8/28 20:27
Project: day3
Company: 湖南零檬信息技术有限公司
======================
"""
\ No newline at end of file
"""
1、等待元素可见
2、查找元素
3、点击操作:等待 - 查找 - 点击
4、输入操作:等待 - 查找 - 输入
5、获取元素文本:等待 - 查找 - 获取文本
6、获取元素属性:等待 - 查找 - 获取属性值
节省代码量、记录日志、失败截图
7、窗口切换 -- 让新窗口出现,获取所有句柄,切换到新窗口。
"""
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.remote.webdriver import WebDriver
import os
import time
import pyautogui
from Common.my_logger import logger
from Common.handle_path import screenshot_dir
class Basepage:
def __init__(self, driver: WebDriver):
self.driver = driver
# 等待元素可见
def wait_ele_visible(self, locator, page_action, timeout=10, poll_frequency=0.5):
"""
:param locator:元素定位,例:(By.XPATH, '//input[@class="login-username"]')
:param page_action:页面动作,在进行什么操作
:param timeout:超时时间
:param poll_frequency:轮循时间
"""
logger.info("在 {} 行为,等待元素:{} 可见。".format(page_action, locator))
try:
start = time.time()
WebDriverWait(self.driver, timeout, poll_frequency).until(EC.visibility_of_element_located(locator))
except:
# 输出到日志
logger.exception("等待元素可见失败!")
# 失败截取当前页面
self.get_page_img(page_action)
raise
else:
end = time.time()
logger.info("等待耗时为:{}".format(end - start))
# 等待元素存在
def wait_page_contains_element(self, locator, page_action, timeout=20, poll_frequency=0.5):
logger.info("在 {} 行为,等待元素:{} 存在。".format(page_action, locator))
try:
start = time.time()
WebDriverWait(self.driver, timeout, poll_frequency).until(EC.presence_of_element_located(locator))
except:
# 输出到日志
logger.exception("等待元素存在失败!")
# 失败截取当前页面
self.get_page_img(page_action)
raise
else:
end = time.time()
logger.info("等待耗时为:{}".format(end - start))
# 先等待 再查找
def get_element(self, locator, page_action, timeout=20, poll_frequency=0.5, wait=None):
# 等待元素存在或者可见
if wait:
self.wait_page_contains_element(locator, page_action, timeout, poll_frequency)
else:
self.wait_ele_visible(locator, page_action, timeout, poll_frequency)
logger.info("在 {} 行为,查找元素:{}".format(page_action, locator))
try:
ele = self.driver.find_element(*locator)
except:
# 输出到日志
logger.exception("查找元素失败!")
# 失败截取当前页面
self.get_page_img(page_action)
raise
else:
return ele
# 点击操作
def click_element(self, locator, page_action, timeout=20, poll_frequency=0.5, wait=None):
# 等待 - 查找
ele = self.get_element(locator, page_action, timeout, poll_frequency, wait)
# 点击
logger.info("在 {} 行为,点击元素:{}".format(page_action, locator))
try:
ele.click()
except:
logger.exception("点击元素失败!")
self.get_page_img(page_action)
raise
# 输入操作
def input_text(self, locator, page_action, value, timeout=20, poll_frequency=0.5):
# 等待 - 查找
ele = self.get_element(locator, page_action, timeout, poll_frequency)
logger.info("在 {} 行为,给元素:{} 输入文本值:{}".format(page_action, locator, value))
try:
ele.clear()
ele.send_keys(value)
except:
logger.exception("元素输入文本失败!")
self.get_page_img(page_action)
raise
# 获取文本操作
def get_text(self, locator, page_action, timeout=20, poll_frequency=0.5):
ele = self.get_element(locator, page_action, timeout, poll_frequency)
logger.info("在 {} 行为,获取元素:{} 的文本值".format(page_action, locator))
try:
return ele.text
except:
logger.exception("获取元素文本失败!")
self.get_page_img(page_action)
raise
# 获取元素属性操作
def get_attribute(self, locator, page_action, value, timeout=20, poll_frequency=0.5):
ele = self.get_element(locator, page_action, timeout, poll_frequency)
logger.info("在 {} 行为,获取元素:{} {} 的属性值".format(page_action, locator, value))
try:
return ele.get_attribute(value)
except:
logger.exception("获取元素属性失败!")
self.get_page_img(page_action)
raise
# 刷新页面
def refresh_page(self, page_action):
try:
self.driver.refresh()
except:
logger.exception("刷新页面失败!")
self.get_page_img(page_action)
raise
# 页面回退
def back_page(self, page_action):
try:
self.driver.back()
except:
logger.exception("页面回退失败!")
self.get_page_img(page_action)
raise
# 窗口跳转
def switch_window(self):
# 等待一下
time.sleep(1)
try:
# 获取所有的句柄
wins = self.driver.window_handles
self.driver.switch_to.window(wins[-1])
except:
logger.exception("窗口跳转失败!")
raise
# 失败截图
def get_page_img(self, page_action):
# 命令规范: {XX页面_XX操作}_截图时间.png
cur_time = time.strftime('%Y-%m-%d %H-%M-%S', time.localtime())
file_path = os.path.join(screenshot_dir, "{} {}.png".format(page_action, cur_time))
self.driver.save_screenshot(file_path)
logger.info("截图保存在:{}".format(file_path))
# 文件上传
def uploadFile(self, locator, page_action, filepath):
'''
系统上传文件,各个系统通用
locator: 上传文件按钮定位表达式
page_action:页面动作,在进行什么操作
filepath:上传文件的路径
'''
try:
self.click_element(locator, page_action)
time.sleep(3)
pyautogui.write(filepath) # 输入文件绝对路径
time.sleep(2)
pyautogui.press('enter', presses=2) # 按2次回车键(按2次是为了防止出错)
except Exception as e:
logger.exception("上传文件操作失败!")
self.get_page_img(page_action)
raise
# 实现按钮存在但无法点击问题,移动到目标元素处
def notClick_exist(self, locator, page_action, wait):
element = self.get_element(locator, page_action, wait=wait)
ActionChains(self.driver).click(element).perform()
if __name__ == '__main__':
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
#
# driver = webdriver.Chrome()
# base = Basepage(driver)
# driver.get("http://www.baidu.com")
# # 等待输入框可见
# loc = ("id", "kw")
# loc_button = ("id", "su")
# loc_text = (By.XPATH, '//div[@id="s-top-left"]/a[3]')
#
# at = base.get_attribute(loc_button, "百度首页_点击搜索按钮", "value")
# print(at)
# te = base.get_text(loc_text, "百度首页_获取文本")
# print(te)
#
# base.input_text(loc, "百度首页_输入搜索内容", "selenium webdriver")
# base.click_element(loc_button, "百度首页_点击搜索按钮")
#
# sleep(7)
# driver.quit()
# driver = webdriver.Chrome()
# base = Basepage(driver)
# driver.get('https://www.yzktw.com.cn/post/919529.html')
# driver.maximize_window()
# driver.execute_script("document.documentElement.scrollTop=10000")
# # 等待1秒
# time.sleep(1)
# ele = driver.find_element(By.ID, 'upload-btn')
# ActionChains(driver).click(ele).perform()
# time.sleep(3)
# pyautogui.write(r'G:\web_framework\document\7.jpeg')
# time.sleep(2)
# pyautogui.press('enter', presses=2) # 按2次回车键(按2次是为了防止出错)
# time.sleep(10)
driver = webdriver.Chrome()
base = Basepage(driver)
driver.get('https://www.baidu.com')
a = (By.XPATH, '//input[@id="kw"]')
b = (By.XPATH, '//input[@id="su"]')
base.input_text(a, "输入框", "python")
time.sleep(5)
base.refresh_page("刷新页面")
base.input_text(a, "输入框", "python")
time.sleep(5)
base.click_element(b, "点击按钮")
base.back_page("回退页面")
# c = (By.XPATH, '//div[@class="wbrjf67"]')
# base.click_element(c, "打开新窗口")
# time.sleep(5)
# base.switch_window()
# d = (By.XPATH, '//a[text()="快速安装"]')
# base.get_element(d, "确定窗口跳转是否成功!")
# base.click_element(d, "点击操作")
# time.sleep(5)
driver.quit()
"""
======================
Author: 柠檬班-小简
Time: 2020/6/19 21:18
Project: py30
Company: 湖南零檬信息技术有限公司
======================
"""
from configparser import ConfigParser
import os
from Common.handle_path import conf_dir
class HandleConfig(ConfigParser):
def __init__(self, file_path):
super().__init__()
self.read(file_path, encoding="utf-8")
file_path = os.path.join(conf_dir, "config.ini")
conf = HandleConfig(file_path)
# if __name__ == '__main__':
# print(conf.get("server", "base_url"))
# print(conf.get("log", "name"))
import pymysql
from Common.handle_config import conf
"""
1、连接数据库,创建游标
"""
class HandleDB():
def __init__(self):
self.conn = pymysql.connect(
host=conf.get("mysql", "host"),
user=conf.get("mysql", "user"),
password=conf.get("mysql", "password"),
port=conf.getint("mysql", "port"),
charset="utf8",
cursorclass=pymysql.cursors.DictCursor
)
# 第二步 创建游标
self.cur = self.conn.cursor()
# 查找一条数据
def select_one_data(self, sql):
# 查询前先刷新一下
self.conn.commit()
# 执行sql语句前,先检查一下sql连接是否断开
self.conn.ping(reconnect=True)
# 第三步 执行sql语句
self.cur.execute(sql)
# 获取数据
return self.cur.fetchone()
# 查找全部数据
def select_all_data(self, sql):
# 查询前先刷新一下
self.conn.commit()
# 执行sql语句前,先检查一下sql连接是否断开
self.conn.ping(reconnect=True)
# 第三步 执行sql语句
self.cur.execute(sql)
# 获取数据
return self.cur.fetchall()
# 查找 总数
def select_count(self, sql):
# 查询前先刷新一下
self.conn.commit()
# 执行sql语句前,先检查一下sql连接是否断开
self.conn.ping(reconnect=True)
# 第三步 执行sql语句
return self.cur.execute(sql)
def update(self):
# 执行增、删、改操作
self.cur.execute(sql)
self.conn.commit()
def close(self):
self.cur.close()
self.conn.close()
if __name__ == '__main__':
sql = "SELECT * FROM FlowMicros.micros_customer LIMIT 5"
# data = HandleDB().get_one_data(sql)
db = HandleDB()
data = db.select_count(sql)
db.close()
print(data)
"""
======================
Author: 柠檬班-小简
Time: 2020/7/1 20:53
Project: py30-接口自动化
Company: 湖南零檬信息技术有限公司
======================
"""
import os
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 测试用例路径
cases_dir = os.path.join(base_dir, "TestCases")
# 测试数据的路径
datas_dir = os.path.join(base_dir, "TestDatas")
# 测试报告
reports_dir = os.path.join(base_dir, "Outputs", "reports")
# 日志的路径
logs_dir = os.path.join(base_dir, "Outputs", "logs")
# 配置文件路径
conf_dir = os.path.join(base_dir, "Conf")
# 页面截图路径
screenshot_dir = os.path.join(base_dir, "Outputs", "screenshots")
# 文件路径
document_dir = os.path.join(base_dir, "Document")
"""
1、随机生成11位手机号 前3位+8位
2、进行数据校验
"""
import random
from Common.handle_db import HandleDB
db = HandleDB()
# 获取一个没有注册的手机号码
def get_new_phone():
# 1、获取手机号码
mobile_phone = __generator_phone()
# 2、对手机号码进行校验
while True:
data = check_phone_in_db(mobile_phone)
if data == 0:
return mobile_phone
else:
print("该手机号码已经注册了!")
# 随机生产一个手机号码
def __generator_phone():
prefix = [133, 153, 177, 180, 181, 189, 130, 131, 132, 145, 155, 156, 176, 185, 186,
134, 135, 136, 137, 138, 139, 147, 150, 151, 152, 157, 158, 159, 178, 182, 183, 184, 187, 188
]
eight = ''
for i in range(0, 8):
eight = eight + str(random.randint(0, 9))
mobile_phone = int(str(random.choice(prefix)) + str(eight))
return mobile_phone
# 通过随机生产的号码去数据库进行查询
def check_phone_in_db(mobile_phone):
sql = 'SELECT * FROM FlowMicros.micros_customer WHERE phone = "{}";'.format(mobile_phone)
data = db.select_count(sql)
return data
# print(get_new_phone())
import logging
import os
from Common.handle_config import conf
from Common.handle_path import logs_dir
class MyLogger(logging.Logger):
def __init__(self, file=None):
# 设置输出级别、输出渠道、输出日志格式
# super().__init__(name,level)
super().__init__(conf.get("log", "name"), conf.get("log", "level"))
# 日志格式
fmt = '%(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d line:%(message)s'
formatter = logging.Formatter(fmt)
# 控制台渠道
handle1 = logging.StreamHandler()
handle1.setFormatter(formatter)
self.addHandler(handle1)
if file:
# 文件渠道
handle2 = logging.FileHandler(file, encoding="utf-8")
handle2.setFormatter(formatter)
self.addHandler(handle2)
# 是否需要写入文件
if conf.getboolean("log", "file_ok"):
file_name = os.path.join(logs_dir, conf.get("log", "file_name"))
else:
file_name = None
logger = MyLogger(file_name)
# logger.info("1111111111111111")
[server]
base_url = http://api.lemonban.com/futureloan
[log]
name = HXX
level = INFO
file_ok = True
file_name = log.txt
[mysql]
host = test1-mysql-m1.galaxy-immi.com
user = test_db_rw
password = 7FUdrNM6J2ji
port = 3306
[userInfo]
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
"""
客户详情页面
"""
from selenium.webdriver.common.by import By
class CustomersDetailsPageLocs:
# 基本信息
basic_info_loc = (By.XPATH, '//div[text()="基本信息"]')
# 合同订单
customer_contract_loc = (By.XPATH, '//div[text()="合同订单"]')
# 客户跟进
customer_follow_loc = (By.XPATH, '//div[text()="客户跟进"]')
# 客户跟进页面
# 编辑顾问评分按钮
mark_button_loc = (By.XPATH, '//span[text()="编辑顾问评分"]')
# 年龄选项
age_select_loc = (By.XPATH, '(//div[@class="el-form-item__content"])[3]')
age_loc = (By.XPATH, '//span[text()="18-30岁(30分)"]')
# 学历选项
school_select_loc = (By.XPATH, '(//div[@class="el-form-item__content"])[4]')
school_loc = (By.XPATH, '//span[text()="博士/2个硕士(40分)"]')
# 名校选项
elite_school_select_loc = (By.XPATH, '(//div[@class="el-form-item__content"])[5]')
elite_school_loc = (By.XPATH, '//span[text()="是(30分)"]')
# 工作管理经验选项
work_management_select_loc = (By.XPATH, '(//div[@class="el-form-item__content"])[6]')
work_management_loc = (By.XPATH, '//span[text()="至少10年工作经验,且有5年以上管理经验(15分)"]')
# 海外工作经验选项
overseas_work_select_loc = (By.XPATH, '(//div[@class="el-form-item__content"])[7]')
overseas_work_loc = (By.XPATH, '//span[text()="2年以上(15分)"]')
# 名企工作经验选项
big_company_work_select_loc = (By.XPATH, '(//div[@class="el-form-item__content"])[8]')
big_company_work_loc = (By.XPATH, '//span[text()="不属于一二类名企,或少于3年经验(0)"]')
# 语言能力选项
language_ability_select_loc = (By.XPATH, '(//div[@class="el-form-item__content"])[9]')
language_ability_loc = (By.XPATH, '//span[text()="良好中文及英文的书写及口语能力(中文口语指普通话或粤语)(20分)"]')
# 家庭背景选项
family_background_select_loc = (By.XPATH, '(//div[@class="el-form-item__content"])[10]')
family_background_loc = (By.XPATH, '//span[text()="有1名直系家庭亲属是永居(5分)"]')
# 保存按钮
save_button_loc = (By.XPATH, '//span[text()="保 存"]')
# 顾问评分 文本
mark_text_loc = (By.XPATH, '//div[@class="basic-title flex-s"]/span')
# 合同订单页面
# 生成合同号 按钮
contract_button_loc = (By.XPATH, '//span[text()="生成合同号"]')
# 合同号生成后,生成合同号按钮
contract_after_button_loc = (By.XPATH, '(//div[@class="el-main-wrap"])[2]/section/button[2]/span')
# 创建订单 按钮
order_button_loc = (By.XPATH, '//span[text()="创建订单"]')
# 暂无数据 文本,用来判断是否生成订单
no_order_loc = (By.XPATH, '//span[text()="暂无数据"]')
# 合同类型
contract_select_loc = (By.XPATH, '//*[@placeholder= "请选择合同类型"]')
contract_loc = (By.XPATH, '//span[text()="新签项目"]')
# 签约公司
company_select_loc = (By.XPATH, '//*[@placeholder= "请选择签约公司"]')
company_loc = (By.XPATH, '//span[text()="深圳市盈河世纪科技有限公司"]')
# 选择 按钮
select_button_loc = (By.XPATH, '//span[text()="选 择"]')
# 项目名称 输入框
project_name_loc = (By.XPATH, '//*[@placeholder= "请输入名称"]')
# 确认 按钮
verify_button_loc = (By.XPATH, '//span[text()="确 认"]')
# 产品 单选框
product_loc = (By.XPATH, '//span[@class="el-radio__inner"]')
# 确定 按钮
ok_button_loc = (By.XPATH, '//span[text()="确定"]')
# 创建订单页面
# 合同编号 文本框
contract_number_loc = (By.XPATH, '//*[@placeholder= "请输入合同号或粘贴合同号"]')
# 合同附件 上传 按钮
upload_button_loc = (By.XPATH, '//span[text()="上传"]')
# 注意事项单选按钮
no_1_loc = (By.XPATH, '(//span[@class="el-radio__inner"])[2]')
no_2_loc = (By.XPATH, '(//span[@class="el-radio__inner"])[4]')
no_3_loc = (By.XPATH, '(//span[@class="el-radio__inner"])[6]')
info_loc = (By.XPATH, '//*[@placeholder= "请输入相关信息"]')
# 付款方式
payment_method_select_loc = (By.XPATH, '(//*[@placeholder= "请选择"])[2]')
payment_method_loc = (By.XPATH, '//span[text()="个人"]')
# 提交合同按钮
submit_button_loc = (By.XPATH, '//span[text()="提交合同"]')
# 已确认,创单 按钮
submit_1_button_loc = (By.XPATH, '//span[text()="已确认,创单"]')
"""
登录页面
"""
from selenium.webdriver.common.by import By
class LoginPageLocs:
# 属性 - 元素定位
username_loc = (By.XPATH, '//input[@class="login-username"]')
password_loc = (By.XPATH, '//input[@class="login-password"]')
login_button_loc = (By.XPATH, '//button[@class="login-btn"]')
"""
我的客户页面
"""
from selenium.webdriver.common.by import By
from TestDatas import global_datas as gd
class MyClientPageLocs:
# 属性 - 元素定位
# 登录用户名
username_loc = (By.XPATH, '//span[@class="user-name"]')
# 我的客户 文本
myClientText_loc = (By.XPATH, '//div[@class="el-main-wrap my-client"]//span[text()="我的客户"]')
# 新增客户按钮
addClient_button_loc = (By.XPATH, '//span[text()="新增客户"]')
# 姓名或手机号输入框
username_mobile_loc = (By.XPATH, '//*[@placeholder= "姓名或手机号搜索"]')
# 查询按钮
query_button_loc = (By.XPATH, '//span[text()="查询"]')
# 列表 手机号 文本
mobile = str(gd.client_info["mobile"])
phone = mobile.replace(mobile[3:7], "****")
phone_loc = (By.XPATH, '(//span[text()=" {} "])[1]'.format(phone))
# 新增客户弹框
# 客户姓名输入框
customer_name_loc = (By.XPATH, '//*[@placeholder= "请输入客户姓名"]')
# 手机号输入框
mobile_loc = (By.XPATH, '//*[@placeholder= "请输入手机号"]')
# 客户来源下拉框
source_select_loc = (By.XPATH, '//*[@placeholder= "请选择客户来源"]')
# 客户来源 选项
source_loc = (By.XPATH, '//span[text()="客户加微信"]')
# 二级渠道下拉框
recommend_select_loc = (By.XPATH, '//*[@placeholder= "请选择二级渠道"]')
# 二级渠道 选项
recommend_loc = (By.XPATH, '//span[text()="小红书"]')
# 上传按钮
upload_button_loc = (By.XPATH, '//span[text()="上传"]')
# 上传文件 输入框
upload_loc = (By.XPATH, '//input[@class="el-upload__input"]')
# 跟进人输入框
user_select_loc = (By.XPATH, '//input[@class="el-select__input is-small"]')
# 跟进人 选项
user_loc = (By.XPATH, '//span[text()="贺夏星-Alan"]')
# 备注输入框
remark_loc = (By.XPATH, '//textarea[@class="el-textarea__inner"]')
# 保存按钮
save_button_loc = (By.XPATH, '//span[text()="保存"]')
"""
服务客户中心页面
"""
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.remote.webdriver import WebDriver
class InformationClientCenterPage:
# 属性 - 元素定位
username_loc = (By.XPATH, '//span[@class="user-name"]')
def __init__(self, driver: WebDriver):
self.driver = driver
self.wait = WebDriverWait(driver, 6)
"""
客户详情页面
"""
import re
import time
from PageLocators.customersDetails_page_locs import CustomersDetailsPageLocs as loc
from Common.basepage import Basepage
from TestDatas import global_datas as gd
class CustomersDetailsPage(Basepage):
# 判断是否跳转到 客户详情 页面
def is_basicInfo_exist(self):
return self.get_element(loc.customer_follow_loc, "判断是否进入客户详情页面")
# 进入 客户跟进 菜单,进行评分操作
def editor_mark(self):
self.click_element(loc.mark_button_loc, "客户跟进页面_点击编辑顾问评分")
self.click_element(loc.age_select_loc, "展开年龄下拉框")
self.click_element(loc.age_loc, "选择年龄")
self.click_element(loc.school_select_loc, "展开学历下拉框")
self.click_element(loc.school_loc, "选择最高学历")
self.click_element(loc.elite_school_select_loc, "展开百强名校下拉框")
self.click_element(loc.elite_school_loc, "选择百强名校")
self.click_element(loc.work_management_select_loc, "展开工作管理经验下拉框")
self.click_element(loc.work_management_loc, "选择工作管理经验")
self.click_element(loc.overseas_work_select_loc, "展开海外工作经验下拉框")
self.click_element(loc.overseas_work_loc, "选择海外工作经验")
self.click_element(loc.big_company_work_select_loc, "展开名企工作经验下拉框")
self.click_element(loc.big_company_work_loc, "选择名企工作经验")
self.click_element(loc.language_ability_select_loc, "展开语音能力下拉框")
self.click_element(loc.language_ability_loc, "选择语言能力")
time.sleep(1)
self.click_element(loc.family_background_select_loc, "展开家庭背景下拉框")
self.click_element(loc.family_background_loc, "选择家庭背景")
self.click_element(loc.family_background_select_loc, "再次点击家庭背景输入框,关闭下拉框")
self.click_element(loc.save_button_loc, "点击保存按钮")
# 判断评分操作是否成功,分数需要大于80
def is_mark_success(self):
# 文本内容
mark = self.get_text(loc.mark_text_loc, "客户跟进页面_获取顾问评分文本")
# 定义正则表达式
pattern = r'\d+'
score = int(re.findall(pattern, mark)[0])
if score >= 80:
return True
else:
return False
# 进入合同页面,新建合同
def add_customer_contract(self):
time.sleep(1)
self.click_element(loc.customer_contract_loc, "客户详情页面_点击合同订单按钮")
time.sleep(3)
self.click_element(loc.contract_button_loc, "合同订单页面_点击生产合同号按钮")
self.click_element(loc.contract_select_loc, "生成合同号弹框_点击合同类型下拉框")
self.click_element(loc.contract_loc, "生成合同号弹框_选择合同类型")
self.click_element(loc.company_select_loc, "生成合同号弹框_点击签约公司下拉框")
self.click_element(loc.company_loc, "生成合同号弹框_选择签约公司")
self.click_element(loc.select_button_loc, "生成合同号弹框_点击选择按钮")
self.input_text(loc.project_name_loc, "生成合同号弹框_输入项目名称", gd.project_name)
time.sleep(1)
self.click_element(loc.verify_button_loc, "生成合同号弹框_点击确认按钮")
self.click_element(loc.product_loc, "生成合同号弹框_选择产品")
self.click_element(loc.verify_button_loc, "生成合同号弹框_点击确认按钮")
self.click_element(loc.ok_button_loc, "生成合同号弹框_点击确定按钮")
# 判断生成合同是否成功
def is_contract_success(self):
time.sleep(2)
# 获取合同号文本
contract_text = self.get_text(loc.contract_after_button_loc, "获取合同号文本")
global contract
contract = contract_text[0:-4]
print(contract)
if len(contract) > 5:
return contract
else:
return False
# 创建订单
def add_order(self):
self.click_element(loc.order_button_loc, "合同订单页面_点击创建订单按钮")
self.switch_window()
self.input_text(loc.contract_number_loc, "新建订单页面_输入合同编号", contract)
self.uploadFile(loc.upload_button_loc, "新建订单页面_上传合同附件", gd.contract_file)
self.click_element(loc.no_1_loc, "新建订单页面_选择否")
self.click_element(loc.no_2_loc, "新建订单页面_选择否")
self.click_element(loc.no_3_loc, "新建订单页面_选择否")
self.input_text(loc.info_loc, "新建订单页面_输入相关信息", "测试")
self.click_element(loc.payment_method_select_loc, "新建订单页面_点击付款方式下拉框")
self.click_element(loc.payment_method_loc, "新建订单页面_选择付款方式")
self.click_element(loc.submit_button_loc, "新建订单页面_点击提交合同按钮")
time.sleep(1)
self.click_element(loc.submit_1_button_loc, "新建订单页面_点击已确认,创单按钮")
# 判断创建订单是否成功
def is_order_success(self):
if self.wait_ele_visible(loc.no_order_loc, "合同订单页面_检查是否成功创建订单"):
return False
else:
return True
"""
登录页面
"""
from PageLocators.login_page_locs import LoginPageLocs as loc
from Common.basepage import Basepage
class LoginPage(Basepage):
# 方法 - 元素操作
# 登录
def login(self, username, password):
self.input_text(loc.username_loc, "登录页面_输入用户名", username)
self.input_text(loc.password_loc, "登录页面_输入密码", password)
self.click_element(loc.login_button_loc, "登录页面_点击登录按钮")
"""
我的客户页面
"""
from TestDatas import global_datas as gd
import time
from PageLocators.myClient_page_locs import MyClientPageLocs as loc
from Common.basepage import Basepage
class MyClientPage(Basepage):
# 通过url跳转到我的客户页面
def to_myClient(self):
self.driver.get(gd.myClient_url)
# 通过首页的登录名来判断是否登录成功
def is_username_exist(self):
return self.get_element(loc.username_loc, "判断是否登录成功")
# 判断是否跳转到 我的客户 页面
def is_myClient_exist(self):
return self.get_element(loc.myClientText_loc, "判断是否进入我的客户页面")
# 填写 客户信息 新增客户
def newClient(self):
self.click_element(loc.addClient_button_loc, "我的客户页面_点击新增客户按钮")
self.input_text(loc.customer_name_loc, "新增客户页面_输入客户姓名", gd.client_info["username"])
self.input_text(loc.mobile_loc, "新增客户页面_输入手机号码", gd.client_info["mobile"])
self.click_element(loc.source_select_loc, "新增客户页面_点击客户来源下拉框")
self.click_element(loc.source_loc, "新增客户页面_选择客户来源")
self.click_element(loc.recommend_select_loc, "新增客户页面_点击二级渠道下拉框")
self.click_element(loc.recommend_loc, "新增客户页面_选择二级渠道")
self.uploadFile(loc.upload_button_loc, "新增客户页面_上传文件", gd.document_url)
self.input_text(loc.user_select_loc, "新增客户页面_搜索跟进人", gd.client_info["user"])
self.click_element(loc.user_loc, "新增客户页面_选择跟进人")
self.click_element(loc.customer_name_loc, "新增客户页面_点击客户姓名输入框")
self.input_text(loc.remark_loc, "新增客户页面_输入备注", gd.client_info["remark"])
self.click_element(loc.save_button_loc, "新增客户页面_点击保存按钮")
time.sleep(5)
# 判断创建客户是否成功
def is_newClient_success(self):
return self.get_element(loc.phone_loc, "判断新增客户是否成功")
# 根据手机号查询操作
# def mobile_inquire(self):
# mobile = gd.client_info["mobile"]
# self.input_text(loc.username_mobile_loc, "我的客户页面_根据新增用户的手机号进行查询", mobile)
# time.sleep(2)
# self.click_element(loc.query_button_loc, "我的客户页面_点击查询按钮")
# return self.get_element(loc.list_number_loc, "我的客户页面_查看列表显示几条数据")
# 点击 列表手机号文本,跳转到客户详情页面
def click_mobile_text(self):
# 点击新增客户的手机号
self.click_element(loc.phone_loc, "我的客户页面_点击手机号文本")
time.sleep(5)
# 点击详情按钮后,需要跳转窗口
self.switch_window()
"""
优才6w业务流程
"""
import pytest, time
from PageObjects.myClient_page import MyClientPage
from PageObjects.customersDetails_page import CustomersDetailsPage
@pytest.mark.usefixtures("myClient_page")
class TestTalentProcess:
@pytest.mark.smoke
def test_talentProcess(self, myClient_page):
time.sleep(3)
# 判断是否跳转到 我的客户 页面
mcp = MyClientPage(myClient_page)
mcp.is_myClient_exist()
# 填写 客户信息 新增客户
mcp.newClient()
# 判断创建客户是否成功
mcp.is_newClient_success()
# 点击 列表手机号文本,跳转到客户详情页面
mcp.click_mobile_text()
# 判断是否跳转到 客户详情 页面
cdp = CustomersDetailsPage(myClient_page)
cdp.is_basicInfo_exist()
# 进入 客户跟进 菜单,进行评分操作
cdp.editor_mark()
# 判断评分操作是否成功,分数需要大于80
cdp.is_mark_success()
# 进入合同页面,新建合同
cdp.add_customer_contract()
# 判断生成合同是否成功
cdp.is_contract_success()
# 创建订单
cdp.add_order()
# 判断创建订单是否成功
cdp.is_order_success()
"""
前置后置类
"""
import pytest
import time
from selenium import webdriver
from TestDatas import global_datas as gd
from PageObjects.login_page import LoginPage
@pytest.fixture(scope="class")
# 打开浏览器,访问登录页面
def init():
print(1)
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(gd.login_url)
yield driver
driver.quit()
@pytest.fixture(scope="class")
# 完成登录操作
def login(init):
print(2)
LoginPage(init).login(*gd.user)
yield init
@pytest.fixture
# 访问 我的客户 页面
def myClient_page(login):
time.sleep(3)
login.get(gd.myClient_url)
yield login
from selenium import webdriver
import pytest
import time
from TestCases.test_3_customersDetails import TestCustomersDetails as tcd
from PageObjects.customersDetails_page import CustomersDetailsPage as cdp
from TestDatas import global_datas as gd
from PageLocators.login_page_locs import LoginPageLocs as loc
from Common.basepage import Basepage
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(gd.login_url)
base = Basepage(driver)
base.input_text(loc.username_loc, "登录页面_输入用户名", gd.user[0])
base.input_text(loc.password_loc, "登录页面_输入密码", gd.user[1])
base.click_element(loc.login_button_loc, "登录页面_点击登录按钮")
time.sleep(5)
driver.get("http://middle-platform.galaxy-immi.com:8183/Customer/CustomersDetails?customer_id=1004865&active_name=customer_follow&group_id=1")
# tcd().test_editor_mark(driver)
tcd().test_add_customer_contract(driver)
tcd().test_add_order(driver)
"""
登录用例
"""
import pytest
from PageObjects.login_page import LoginPage
from PageObjects.myClient_page import MyClientPage
from TestDatas import global_datas as gd
@pytest.mark.usefixtures("init")
class TestLogin:
# 登录成功用例
def test_login_success(self, init):
# 1、步骤
LoginPage(init).login(*gd.user)
# 2、断言
assert MyClientPage(init).is_username_exist()
"""
我的客户页面 用例
"""
import pytest
from PageObjects.myClient_page import MyClientPage
from PageObjects.customersDetails_page import CustomersDetailsPage
import time
@pytest.mark.usefixtures("init")
class TestMyClient:
# 跳转到 我的客户 页面
def test_to_myClient(self, init):
# 步骤
MyClientPage(init).to_myClient()
# 断言
assert MyClientPage(init).is_myClient_exist()
# 点击 新增客户 按钮
def test_click_newClient_button(self, init):
time.sleep(2)
MyClientPage(init).click_newClient_button()
# 填写 客户信息 创建客户
def test_newClient(self, init):
MyClientPage(init).newClient()
assert MyClientPage(init).is_newClient_success()
# 点击 列表手机号文本
def test_details_button(self, init):
MyClientPage(init).click_mobile_text()
assert CustomersDetailsPage(init).is_basicInfo_exist()
"""
客户详情页面 用例
"""
import pytest
from PageObjects.customersDetails_page import CustomersDetailsPage as cdp
@pytest.mark.usefixtures("init")
class TestCustomersDetails:
# 进入 客户跟进 菜单,进行评分操作
def test_editor_mark(self, init):
cdp(init).editor_mark()
assert cdp(init).is_mark_success()
# 进入合同页面,新建合同
def test_add_customer_contract(self, init):
cdp(init).add_customer_contract()
assert cdp(init).is_contract_success()
# 新建订单
def test_add_order(self, init):
cdp(init).add_order()
assert cdp(init).is_order_success()
import os
from Common.handle_phone import get_new_phone
# 登录账号
user = ("admin0001", "123456")
base_url = "http://middle-platform.galaxy-immi.com:8183/"
# 登录页面
login_url = os.path.join(base_url, "Login")
# 我的客户页面
myClient_url = os.path.join(base_url, "Customer/MyClient")
# 新增客户信息
document_url = r'G:\web_framework\document\7.jpeg'
client_info = {"username": "webAutomate", "mobile": get_new_phone(), "recommend": "13712345678",
"user": "Alan", "remark": "web自动化客户"}
# 新增合同 选择产品页面的项目名称
project_name = "香港优才(6.1万)全款盈河"
# 新增订单页面上传文件
contract_file = r'G:\web_framework\document\sample1.pdf'
import pytest
if __name__ == '__main__':
# pytest.main(["-vs", "./BusinessFlow/test_talentProcess.py"]) 指定路径
pytest.main(["-m", "-s", "-v", "smoke", "--alluredir=Outputs/reports"])
[pytest]
markers=
smoke
\ No newline at end of file
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
url = "http://test.crm.galaxy-immi.com/Login"
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
print(driver.title)
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//input[@class="login-username"]')))
driver.find_element(By.XPATH, '//input[@class="login-username"]').send_keys('admin0001')
te = driver.find_element(By.XPATH, '//div[@class="center-logininfo-title"]/p').text
at = driver.find_element(By.XPATH, '//input[@class="login-username"]').get_attribute("placeholder")
print(te)
print(at)
time.sleep(10)
driver.quit()
Markdown is supported
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