随便写点东西,有的是网上借鉴,有的是自己体会,总之都是根据自己的需求进行优化的一些东西,随笔备忘录
python3配置文件的增删改查等操作可以使用内置的ConfigParser模块,需要一个配置文件去控制一些环境信息,比如测试地址,用户信息,保存测试过程中的一些值,方便后续测试用例的调用,配置文件可以是txt/xml/ini,Python的话一般用ini文件
在项目下新建Config文件夹,文件夹下新建config.ini文件
config.ini文件如下
[environment]
browser = 0
[password]
pw = 666666
[name]
cfgw = wendezhu
cfzjl = xigangwu
xtjl = jmwan
[wms]
url = http://192.168.0.33:8090/login
[tcmp]
url = http://192.168.0.16:8088/tcmp/
[ta]
url = http://192.168.0.17:7002/trustWeb/login.jsp
[ment]
environment是配置一些开关,browser用来配置浏览器,这里设定0是谷歌浏览器,1是火狐浏览器,2是IE浏览器(这里是用chrome)
password存放登录所需的密码
name存放不同用户登录所需的用户名
wms、tcmp、ta存放对应系统的url及其他信息
ment存放测试过程中需要保存的数据信息
接下来进行具体的实现。在framework文件夹下,新建Base_Page.py文件,并添加全局变量,为了提供配置文件的路径
path = getcwd.get_cwd()
config_path = os.path.join(path, 'Config/config.ini')
config = configparser.ConfigParser()
config.read(config_path, encoding="utf-8-sig")
Base_Page.py文件代码如下
# -*- encoding: utf-8 -*-
from Logs.log import log1
from selenium.common.exceptions import NoSuchElementException
import getcwd
import os
import time
import configparser
from selenium import webdriver
path = getcwd.get_cwd()
config_path = os.path.join(path, 'Config/config.ini')
config = configparser.ConfigParser()
config.read(config_path, encoding="utf-8-sig")
class BasePage:
"""测试基类"""
def __init__(self, driver):
self.driver = driver
def config_get(self, key, section):
'''读取配置文件值'''
config_get = config.get(section, key)
return config_get
def config_write(self, section, key=None, value=None):
'''往配置文件写入键值'''
if key is not None and value is not None:
config.set(section, key, value)
log1.info('在section:%s下写入%s=%s' % (section, key, value))
with open(config_path, 'w', encoding='utf-8')as f:
config.write(f)
else:
config.add_section(section)
log1.info('新增section:%s' % section)
with open(config_path, 'w', encoding='utf-8')as f:
config.write(f)
def config_delete(self, section, key=None):
'''删除配置文件字段'''
if key is not None:
config.remove_option(section, key)
log1.info('删除section:%s下key为:%s的记录' % (section, key))
with open(config_path, 'w', encoding='utf-8')as f:
config.write(f)
else:
config.remove_section(section)
log1.info('删除section:%s' % section)
with open(config_path, 'w', encoding='utf-8')as f:
config.write(f)
def open_browser(self,value):
browser = self.config_get('browser', 'environment')
log1.info('读取浏览器配置')
url = self.config_get('url',value)
log1.info('读取url:%s' % url)
try:
if browser == str(0):
self.driver = webdriver.Chrome()
log1.info('打开的浏览器为chrome')
elif browser == str(1):
self.driver = webdriver.Firefox()
log1.info('打开的浏览器为Firefox')
elif browser == str(2):
self.driver = webdriver.Ie()
self.driver.get(url)
self.driver.maximize_window()
log1.info('浏览器最大化')
self.driver.implicitly_wait(10)
log1.info('设置静态等待时间10秒')
return self.driver
except BaseException:
log1.error('浏览器打开报错')
def my_quite(self):
"""关闭浏览器"""
self.driver.quit()
log1.info('关闭浏览器')
@staticmethod
def isdisplayed(element):
"""元素是否存在"""
value = element.is_displayed()
return value
@staticmethod
def my_sleep(secondes):
"""强制等待"""
time.sleep(secondes)
log1.info('暂停%d秒' % secondes)
def get_img(self):
"""截图"""
path = os.path.join(getcwd.get_cwd(), 'screenshots/') # 拼接截图保存路径
rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) # 按格式获取当前时间
screen_name = path + rq + '.png' # 拼接截图文件名
# noinspection PyBroadException
try:
self.driver.get_screenshot_as_file(screen_name)
log1.info("截图保存成功")
except BaseException:
log1.error("截图失败", exc_info=1)
def find_element(self, selector):
"""定位元素"""
by = selector[0]
value = selector[1]
element = None
if by in ['id', 'name', 'class', 'tag', 'link', 'plink', 'css', 'xpath']:
# noinspection PyBroadException
try:
if by == 'id':
element = self.driver.find_element_by_id(value)
elif by == 'name':
element = self.driver.find_element_by_name(value)
elif by == 'class':
element = self.driver.find_element_by_class_name(value)
elif by == 'tag':
element = self.driver.find_element_by_tag_name(value)
elif by == 'link':
element = self.driver.find_element_by_link_text(value)
elif by == 'plink':
element = self.driver.find_element_by_partial_link_text(value)
elif by == 'css':
element = self.driver.find_element_by_css_selector(value)
elif by == 'xpath':
element = self.driver.find_element_by_xpath(value)
else:
log1.error('没有找到元素')
log1.info('元素定位成功。定位方式:%s,使用的值%s:' % (by, value))
return element
except NoSuchElementException:
log1.error("报错信息:", exc_info=1)
self.get_img() # 调用截图
else:
log1.error('输入的元素定位方式错误')
def type(self, selector, value):
"""输入内容"""
element = self.find_element(selector)
element.clear()
log1.info('清空输入内容')
# noinspection PyBroadException
try:
element.send_keys(value)
log1.info('输入的内容:%s' % value)
except BaseException:
log1.error('内容输入报错', exc_info=1)
self.get_img()
def click(self, selector):
"""点击元素"""
element = self.find_element(selector)
# noinspection PyBroadException
try:
element.click()
log1.info('点击元素成功')
except BaseException:
display = self.isdisplayed(element)
if display is True:
self.my_sleep(3)
element.click()
log1.info('点击元素成功')
else:
self.get_img()
log1.error('点击元素报错', exc_info=1)
def use_js(self, js):
"""调用js"""
# noinspection PyBroadException
try:
self.driver.execute_script(js)
log1.info('js执行成功,js内容为:%s' % js)
except BaseException:
log1.error('js执行报错', exc_info=1)
def switch_iframe(self, selector):
"""切换farm"""
element = self.find_element(selector)
# noinspection PyBroadException
try:
self.driver.switch_to.frame(element)
log1.info('切换frame成功')
except BaseException:
log1.error('切换frame报错', exc_info=1)
def switch_out(self):
"""跳出iframe"""
self.driver.switch_to.default_content()
log1.info('跳出iframe成功')
def get_title(self):
"""获取title"""
title = self.driver.title
log1.info('当前窗口的title是:%s' % title)
return title