Commit 03c8c945 by linguangwei

同步

parent 2d1e30f0
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.8 (xm-uitest-sow)" jdkType="Python SDK" />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="projectConfiguration" value="pytest" />
<option name="PROJECT_TEST_RUNNER" value="pytest" />
</component>
</module>
\ No newline at end of file
import os
from time import sleep, time
from src.framework.common import file_abspath
from selenium import webdriver
from selenium.webdriver.chrome import service
from selenium.webdriver.chrome.webdriver import WebDriver
# web_driver_path = os.path.join(
# "./chromedriver")
service = webdriver.chrome.service.Service(r"C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\scripts\chromedriver.exe")
service = webdriver.chrome.service.Service(file_abspath() + "/tools/chromedriver.exe")
service.start()
......
#暂时只用Chrome
[browserType]
#browserName = Firefox
browserName = Chrome
#browserName = IE
[testServer]
#输入你要测得本地文件路径
app_location = C:\Users\Administrator\AppData\Local\Programs\xmqxy\小麦企学院.exe
[account]
username = 13777867342
password = 0000
[MySql]
[chrome download]
url = http://chromedriver.storage.googleapis.com/
\ No newline at end of file
import configparser
import os
config = configparser.ConfigParser()
dir = os.path.abspath('.').split('src')[0]
config.read(dir + "/config/config.ini", encoding='utf-8')
# 根据配置文件获取测试url
def test_location():
location = config.get("testServer", "app_location")
return location
def test_account():
return config.get("account", "username")
def test_password():
return config.get("account", "password")
\ No newline at end of file
......@@ -8,6 +8,7 @@ app_login(driver)
# 进入直播间
def start_class(driver):
sleep(3)
......@@ -18,5 +19,6 @@ def start_class(driver):
return start_class
if __name__ == '__main__':
start_class(driver)
import unittest
from src.framework.HTMLTestRunner import HTMLTestRunner
from src.framework import common
from src.testcase.testLoginPage import TestLoginPage as TLP
# from src.testcase.testHomePage import TestHomePage as THP
# from src.testcase.testWordPage import TestWordPage as TWP
if __name__ == '__main__':
testunit = unittest.TestSuite()
testunit.addTest(TLP('testLogin'))
# testunit.addTests([THP('testHonors'), THP('testModifyPassword'), THP('testModifyInformation'), THP('testLogout'), THP('testWordTest')])
# testunit.addTests([TWP('testWordsEvaluation'), TWP('testWordReinforcement'), TWP('test_unit'), TWP('testOfflineDictation'), TWP('testPreview'), TWP('testShorthand'), TWP('testDictation'), TWP('testMemoryWrite'), TWP('testPostTest'), TWP('testReview'), TWP('testxiaoxiaole')])
# 定义报告输出路径
htmlPath = "./report/AI-XM_Report{}.html".format(common.year_to_minute())
with(open(htmlPath, 'wb')) as fp:
runner = HTMLTestRunner(
stream=fp,
title='AI-小麦测试报告',
description='描述'
)
runner.run(testunit)
<?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="jdk" jdkName="Python 3.8 (framework)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ 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 (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/framework.iml" filepath="$PROJECT_DIR$/.idea/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
import time
import os
def year_to_minute():
return time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
def year_to_day():
return time.strftime('%Y%m%d', time.localtime(time.time()))
def file_abspath():
return os.path.abspath(__file__).split('src')[0]
\ No newline at end of file
import logging
import os
from src.framework import common
class Logger(object):
def __init__(self, logger):
"""指定保存日志的文件路径,日志级别,以及调用文件,将日志存入到指定的文件中"""
# 创建一个logger
self.logger = logging.getLogger(logger)
self.logger.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志文件
rq = common.year_to_minute()
today = common.year_to_day()
log_dir = common.file_abspath() + '/logs/' + today + '/'
# log_dir = os.path.abspath(__file__).split('src')[0] + '/logs/' + today + '/'
if not os.path.exists(log_dir):
os.mkdir(log_dir)
log_name = log_dir + rq + '.log'
fh = logging.FileHandler(log_name)
fh.setLevel(logging.INFO)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
# ch.setLevel(logging.INFO)
ch.setLevel(logging.ERROR)
# 定义handler的输出格式
formatter = logging.Formatter('%(levelname)s :%(name)s:%(asctime)s:%(message)s"')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 给logger添加handler
self.logger.addHandler(fh)
self.logger.addHandler(ch)
def getlog(self):
return self.logger
\ No newline at end of file
from time import sleep
# pages基类
from selenium.common.exceptions import NoSuchElementException
class Page(object):
"""
Page基类,所有page都应该继承该类
"""
def __init__(self, driver):
self.driver = driver
self.timeout = 30
# 寻找单元素或唯一元素
def find_element(self, *loc):
return self.driver.find_element(*loc)
# 输入元素输入
def input_text(self, loc, text):
self.find_element(*loc).send_keys(text)
# 点击框点击
def click(self, loc):
self.find_element(*loc).click()
def get_title(self):
return self.driver.title
# 打开url站点
def open_url(self, url):
self.driver.get(url)
# 获取当前url
def current_url(self):
self.driver.current_url()
# 关闭浏览器
def quit_browser(self):
self.driver.quit()
# 浏览器前进操作
def forward(self):
self.driver.forward()
# 浏览器后退操作
def back(self):
self.driver.back()
# 清空输入框
def clear(self):
self.driver.clear()
# 隐式等待
def wait(self, seconds):
self.driver.implicitly_wait(seconds)
# 强制等待
def sleep(self, seconds):
return sleep(seconds)
# 屏幕最大化
def max(self):
self.driver.maximize_window()
# 判断元素是否存在于页面
def ifElementExist(self, loc):
try:
self.driver.find_element(*loc)
except NoSuchElementException:
# 打印异常信息
print("NoSuchElementException")
# 发生异常,说明页面中未找到该元素,返回False
return False
else:
print("HaveSuchElement{}".format(loc))
# 无异常,说明在页面中找到了该元素,返回True
return True
# 寻找多元素返回
def find_elements(self, *loc):
return self.driver.find_elements(*loc)
# 关闭窗口
def close(self, loc, num):
self.find_elements(*loc)[num].click()
\ No newline at end of file
from src.pageobject.basepage import Page
from selenium.webdriver.common.by import By
# 登录页面
class LoginPage(Page):
# 元素集
# 手机号登录按钮
phone_login = (By.ID, "rc-tabs-0-tab-2")
# 账号输入框
account_input = (By.ID, "xmphone")
# 密码输入框
password_input = (By.ID, "xmpwd")
# 登录按钮
login_button = (By.CLASS_NAME, "submit")
# 验证元素
# 店铺名称
store_name = (By.CLASS_NAME, "inst")
def __init__(self, driver):
Page.__init__(self, driver)
# 点击手机号登录,展示输入框
def click_phone_login(self):
self.click(self.phone_login)
# 输入账号
def input_account(self, account):
self.input_text(self.account_input, account)
# 输入密码
def input_password(self, password):
self.input_text(self.password_input, password)
# 点击登录
def click_login(self):
self.click(self.login_button)
from src.pageobject.loginpage import LoginPage
from selenium.webdriver.common.by import By
# 主页面
class HomePage(LoginPage):
# 元素集
# '未完成任务'按钮
incomplete = (By.XPATH, "//div[text()='未完成任务']")
# '未完成任务'按钮
completed = (By.XPATH, "//div[text()='已完成任务']")
# 荣誉榜按钮
honors = (By.XPATH, "//span[text()='荣誉榜']")
# 修改密码按钮
modifypassword = (By.XPATH, "//span[text()='修改密码']")
# 修改信息按钮
modifyinformation = (By.XPATH, "//span[text()='修改信息']")
# 退出系统按钮
logout = (By.XPATH, "//span[text()='退出系统']")
# 单词量测试按钮
wordtest = (By.XPATH, "//div[text()='单词量测试']")
# 验证元素
# 荣誉榜-总排行
total_tanking = (By.XPATH, "//li[text()='总排行']")
# 修改密码-确认密码
confirm_password = (By.CLASS_NAME, "title")
# 修改信息-姓名
name = (By.CLASS_NAME, "title.short")
# 单词量测试-学段测试
stage_test = (By.XPATH, "//div[text()='学段测试']")
def __init__(self, driver):
LoginPage.__init__(self, driver)
# 点击'未完成任务'
def click_incomplete(self):
self.click(self.incomplete)
# 点击'已完成任务'
def click_completed(self):
self.click(self.completed)
# 点击'荣誉榜'
def click_honors(self):
self.click(self.honors)
# 点击'修改密码'
def click_modifypassword(self):
self.click(self.modifypassword)
# 点击'修改信息'
def click_modifyinformation(self):
self.click(self.modifyinformation)
# 点击'退出系统'
def click_logout(self):
self.click(self.logout)
# 点击'单词量测试'
def click_wordtest(self):
self.click(self.wordtest)
\ No newline at end of file
from src.pageobject.loginpage import LoginPage
from src.framework.logger import Logger
from config import readConfig
from commom.appDriver import get_app_driver
import unittest
class TestLoginPage(unittest.TestCase):
logger = Logger('login page').getlog()
account = readConfig.test_account()
password = readConfig.test_password()
cloud_class_location = readConfig.test_location()
def setUp(self) -> None:
print(11111)
# 指定chrome的webdriver路径
self.driver = get_app_driver(self.cloud_class_location)
def tearDown(self) -> None:
self.driver.quit()
# 测试登录
def testLogin(self):
driver = self.driver
login_page = LoginPage(driver=driver)
login_page.click_phone_login()
login_page.input_account(account=self.account)
login_page.input_password(password=self.password)
login_page.click_login()
login_page.sleep(1)
self.assertTrue(login_page.ifElementExist(login_page.store_name))
if __name__ == '__main__':
unittest.main(verbosity=1)
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