100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Python+Selenium PO模式Web自动化测试实战

Python+Selenium PO模式Web自动化测试实战

时间:2022-04-16 20:00:09

相关推荐

Python+Selenium PO模式Web自动化测试实战

1、项目结构

2、BASE层封装代码

# -- coding: UTF-8 --import datetimeimport osfrom selenium.webdriver.support.select import Selectclass BasePage:# 构造函数,初始化方法def __init__(self, driver):self.driver = driverself.driver.maximize_window()self.driver.implicitly_wait(5)# 获取URLdef geturl(self):self.driver.get(self.url)# 定位元素def locator_element(self, loc):return self.driver.find_element(*loc)def locator_elements(self, loc):return self.driver.find_elements(*loc)def get_text(self, loc):return self.locator_element(loc).text# 重构send_keys方法def send_keys(self, loc, value):self.locator_element(loc).send_keys(value)# self.driver.find_element(*loc).send_keys(value)def clear(self, loc):self.locator_element(loc).clear()# 重构下拉框操作def select(self, loc, value):sel = Select(self.locator_element(loc))sel.select_by_visible_text(value)# 重构click方法def click(self, loc):self.locator_element(loc).click()# frame切换def switch_to_frame(self, frame):self.driver.switch_to.frame(frame)# frame切换返回def switch_to_default_content(self):self.driver.switch_to.default_content()# 切换窗口def switch_to_window(self, title):for handle in self.driver.window_handles:self.driver.switch_to.window(handle)if title == self.driver.title:break# 截屏,默认在项目目录下生成图片def save_screenshot(self, filename):self.driver.save_screenshot(filename)# 截屏,可以指定文件路径def get_screenshot_as_file(self, filename):pro_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) # 获取当前项目的根路径screenshot_dir = os.path.join(pro_dir, "screenshot") # 根路径下创建文件夹screenshotif not os.path.exists(screenshot_dir):os.makedirs(screenshot_dir)data_file = datetime.datetime.now().strftime('%Y%m%d') # 当日日期screenshot_today_dir = os.path.join(screenshot_dir, data_file) # 当前日期文件夹if not os.path.exists(screenshot_today_dir):os.mkdir(screenshot_today_dir) # 不存在则创建日期文件夹now_time = datetime.datetime.now().strftime('%H%M%S') # 时间戳%H%M%S%ffilename = f'{filename}_{now_time}.png' # 拼接文件名 时间戳+文件名+.pngfilepath = os.path.join(screenshot_today_dir, filename)self.driver.get_screenshot_as_file(filepath)def quit(self):self.driver.quit()

3、Excel文件读写封装

# -- coding: UTF-8 --import datetimeimport openpyxlclass OperateExcel:# @staticmethod# def get_object_path():## 获取文件的绝对路径,相对路径容易出错#path = os.path.abspath(os.path.dirname(__file__)).split('/base')[0]#filepath = f'{path}/data/goods_search.xlsx'#return filepath@staticmethoddef read_excel(excel_path, sheet_name):wb = openpyxl.load_workbook(excel_path)sheet = wb[sheet_name]rows = sheet.max_rowcols = sheet.max_columndata_list = []for row in range(2, rows + 1):temp_data = []for col in range(1, cols + 1):value = sheet.cell(row=row, column=col).valuetemp_data.append(value)data_list.append(tuple(temp_data))print(data_list)return data_list@staticmethoddef write_excel(excel_path, sheet_name, row, col, value):# current_time = datetime.datetime.now()wb = openpyxl.load_workbook(excel_path)sheet = wb[sheet_name]sheet.cell(row, col, value)wb.save(excel_path)

4、测试案例代码

# -- coding: UTF-8 --import datetimeimport osimport pytestfrom selenium import webdriverfrom selenium.webdriver import ChromeOptionsfrom base.operate_excel import OperateExcelfrom po.aptitude_pic_page import AptitudePicPagefrom po.goods_search_page import GoodSearchPagefrom po.index_login_page import IndexLoginPagefrom po.index_logout_page import IndexLogoutPageclass TestCase:# 1.实例化一个ChromeOptions对象option = ChromeOptions()option.add_experimental_option('excludeSwitches', ['enable-automation'])# 2.将ChromeOptions实例化的对象option作为参数传给Chrome对象,规避部分网站的检测识别driver = webdriver.Chrome(executable_path='chromedriver', options=option)@staticmethoddef get_object_path():# 获取文件的绝对路径,相对路径容易出错path = os.path.abspath(os.path.dirname(__file__)).split('/case')[0]filepath = f'{path}/data/goods_search.xlsx'return filepath# 打开浏览器并登录def setup_class(self):IndexLoginPage(self.driver).login()# 退出浏览器def teardown_class(self):IndexLogoutPage(self.driver).logout()# 用例1,实现登录后查询多种商品,查询结果写入Excel文件中@pytest.mark.parametrize('args', OperateExcel().read_excel(get_object_path(), '搜索'))# @pytest.mark.skip(reason='调试跳过')def test_case_001(self, args):n = args[0]# 根据序号定位excel中的位置value = GoodSearchPage(self.driver).goods_search(args[1])OperateExcel().write_excel(TestCase().get_object_path(), '搜索', n+1, 3, value)OperateExcel().write_excel(TestCase().get_object_path(), '搜索', n+1, 4, datetime.datetime.now())

5、data文件夹中的测试数据(黄色部分内容为写入数据)

6、po层登录模块

# -- coding: UTF-8 --import timefrom mon.by import Byfrom base.base_pae import BasePageclass IndexLoginPage(BasePage):# 主页地址url = r"/index.html"# 页面元素定位login_loc = (By.XPATH, '//*[@id="J_siteUserInfo"]/a[1]')protocol = (By.XPATH, '//*[@id="stat_e3c9df7196008778"]/div[2]/div[2]/div/div/div/div[3]/button[1]')username = (By.XPATH, '//*[@id="rc-tabs-0-panel-login"]/form/div[1]/div[1]/div[2]/div/div/div/div/input')password = (By.XPATH, '//*[@id="rc-tabs-0-panel-login"]/form/div[1]/div[2]/div/div[1]/div/input')check_box = (By.XPATH, '//*[@id="rc-tabs-0-panel-login"]/form/div[1]/div[3]/label/span[1]/input')sumit = (By.XPATH, '//*[@id="rc-tabs-0-panel-login"]/form/div[1]/button')# 页面业务流操作(登录)def login(self, user='******', psw='******'):self.geturl()self.click(self.login_loc)time.sleep(2)# 判断用户协议是否存在,如果存在点击同意protocol = self.locator_elements(self.protocol)if protocol:self.click(self.protocol)self.send_keys(self.username, user)self.send_keys(self.password, psw)self.click(self.check_box)self.click(self.sumit)

7、po层退出模块

# -- coding: UTF-8 --import timefrom mon.by import Byfrom base.base_pae import BasePageclass IndexLogoutPage(BasePage):# 页面元素定位login_loc = (By.XPATH, '//*[@id="J_siteUserInfo"]/a[1]')logout_loc = (By.XPATH, '//*[@id="J_userLogout"]')# 页面业务流操作(退出登录)def logout(self):# 判断是否存在登录,如果存在说明处于无用户登录状态,直接关闭浏览器,如果不存在,说明为用户登录状态,点击退出登录login = self.locator_element(self.login_loc)if not login:self.click(self.logout_loc)time.sleep(3)self.quit()

8、po查询案例模块

# -- coding: UTF-8 --import timefrom mon.by import Byfrom base.base_pae import BasePageclass GoodSearchPage(BasePage):# 页面元素定位search_loc = (By.ID, 'search') # 搜索框search_summit = (By.XPATH, '//*[@id="J_submitBtn"]/input') # 搜索按钮order = (By.XPATH, '//*[@id="app"]/div[2]/div/div/div[2]/div[3]/div/div[1]/ul[1]/li[4]/a') # 商品列表排序按钮max_price = (By.XPATH, '//*[@id="app"]/div[2]/div/div/div[2]/div[3]/div/div[2]/div[1]/div[1]') # 第一位置商品index_xiaomi = (By.LINK_TEXT, '小米商城') # 返回小米商城首页# 页面操作(登录后搜索指定商品,并取出对应的价格最高商品)def goods_search(self, value):self.clear(self.search_loc)self.send_keys(self.search_loc, value)self.click(self.search_summit)# 对查询结果进行按价格排序后取处理self.click(self.order)self.click(self.order)time.sleep(2)if self.locator_element(self.max_price): # 如果查询结果存在,则获取商品信息num = self.get_text(self.max_price)return num

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。