模拟赛 1 期 自动化测试python——第十五届蓝桥杯(软件测试)链接
题目链接
第十五届蓝桥杯(软件测试)模拟赛 2 期题目 - 自动化测试题目介绍(Python 语言)(50分) - 蓝桥云课 (lanqiao.cn)
题目信息:
请使用 Python 编程语言,结合 PO 模式(Page Object Model 的简写 页面对象模型 )思想 ,使用 Selenium 自动化测试工具补全如下多个 Python 类文件中 //TODO 处缺失的代码:
-
Page1:login_page.py ,“登录”页面(已经写好,无需填写)
-
Page2:post_management_page.py,“岗位管理” 页面
-
Page3:add_post_page.py,“添加岗位” 页面
-
web_case_test.py:测试用例代码文件
请按照用例步骤,在测试用例 web_case_test.py 文件中需通过调用 3 个 Page 类中的方法完成自动化测试代码。
具体题目部署看题目要求,为节省学习时间直接代码开始
知识点(先看这里):
超级重要!!!!!!!!要点: 观察元素在iframe里面还是外面!!!!!!!!
frame 切换处理
切入.switch_to.frame(frame_reference)
frame_reference 可以是 frame 元素的属性 name 或者 id 的属性值(默认定位方式)。另外 一种情况,如果没有属性 name 或者 id,可以先定位到 frame 元素,再进行切换。
切出
.switch_to.default_content()返回主文档
.switch_to.parent_frame()返回父文档
文本信息:.text 注意:text 后面不要加括号
清空:clear() ,确保输入没有脏数据,
输入:.send_keys("输入的内容")
第 1 步:输入被测系统网址,请查看部署成功的被测系统网址(注意不要忘记在代码中输入网址)。
第 2 步:在【登录】页面 login_page.py 中依次进行如下操作:
-
①输入【用户名】方法
-
②输入【密码】方法
-
③输入【验证码】方法
-
④点击【登录】按钮的方法
# 创建LoginPage对象,供调用该类中的方法实现【登录】的操作代码
login_page = LoginPage(self.driver)
# 点击登录账号输入框并输入账户-admin
login_page.input_login_name("admin")
# 点击登录密码输入框并输入密码-LQ15Mock2@2004
login_page.input_login_password("admin123")
# 点击验证码输入框并输入-666
login_page.input_code("666")
# 点击登录按钮
login_page.click_login_button()
sleep(2)
第 3 步:登录成功后,在 【岗位管理】页面 post_management_page.py 中依次完成以下操作代码:
-
①获取登录后的【蓝桥超管】插入断言
-
②点击【系统管理】菜单
-
③点击【岗位管理】菜单
-
④搜索项【岗位编码】输入“ceo”,请注意此处 iframe 的切换
-
⑤点击【搜索】按钮
-
⑥获取搜索后的【分页数据】插入断言
-
⑦在搜索结果列表,点击数据后的【删除】按钮,注意 iframe 的切换。
post_management_page.py的完善
from selenium.webdriver.common.by import By
"""
* Page2-【岗位管理页面】
* 需实现该页面中如下 7 个方法的操作代码(以下元素位置可参照题目附图)
*
* 1.获取登录后的【蓝桥超管】文本值
* 2.点击【系统管理】 > 点击【岗位管理】 的菜单路径
* 3.定位搜索项中的【岗位编码】输入框 ,并输入参数post_code
* 4.点击【搜索】按钮方法
* 5.获取搜索结果的【分页显示信息文本值】
* 6.点击搜索列表【删除】按钮
* 7.点击【确认】删除的按钮
* 注意1:不要在 Page 页的方法中填写 iframe 的切换代码。
* 注意2:注意不要改动已经写好的方法名。
"""
from lib2to3.tests.support import driver
import time
class PostManagementPage:
def __init__(self, driver):
self.driver = driver
def get_username_text(self):
# TODO 请实现 获取【蓝桥超管】文本值,注意在此方法中添加返回值
return self.driver.find_element(By.CSS_SELECTOR, 'span[class="hidden-xs"]').text
def click_post_manage_path(self):
# TODO 请依次实现点击【系统管理】 > 点击【岗位管理】 的路径方法
self.driver.find_element(By.XPATH, '//a/span[text()="系统管理"]').click()
self.driver.find_element(By.PARTIAL_LINK_TEXT, '岗位管理').click()
def input_post_code_search(self, post_code):
# TODO 请实现搜索条件【岗位编码】输入框的方法,post_code 为输入参数
self.driver.find_element(By.CSS_SELECTOR, 'input[name="postCode"]').clear()
self.driver.find_element(By.CSS_SELECTOR, 'input[name="postCode"]').click()
self.driver.find_element(By.CSS_SELECTOR, 'input[name="postCode"]').send_keys(post_code)
def click_search_button(self):
# TODO 请实现点击【搜索】按钮的方法
self.driver.find_element(By.CSS_SELECTOR, '.fa-search').click()
def get_page_numberText(self):
# TODO 请实现 获取【分页显示信息文本值】的操作方法,注意在此方法中添加返回值
return self.driver.find_element(By.CSS_SELECTOR, '.pagination-info').text
def click_delete_button(self):
# TODO 请实现点击【删除】按钮的方法
self.driver.find_element(By.XPATH, '//td[text()="ceo"]/../td/a[text()="删除"]').click()
time.sleep(1)
def click_ok_button(self):
# TODO 请实现点击【确认】删除的按钮的方法
self.driver.find_element(By.PARTIAL_LINK_TEXT,'确认').click()
post_management_page.py 的 test_web_case.py的完善
# 创建PostManagementPage对象
post_management_page = PostManagementPage(self.driver)
self.a = post_management_page.get_username_text()
self.assertEqual("蓝桥超管",self.a, "没获取到蓝桥超管")
post_management_page.click_post_manage_path()
self.driver.switch_to.frame("iframe6")
post_management_page.input_post_code_search("ceo")
sleep(2)
post_management_page.click_search_button()
self.b = post_management_page.get_page_numberText()
self.assertEqual("显示第 1 到第 1 条记录,总共 1 条记录",self.b, "没获取分页信息")
post_management_page.click_delete_button()
self.driver.switch_to.parent_frame()
post_management_page.click_ok_button()
add_post_page.py完善
from selenium.webdriver.common.by import By
"""
* Page3-【管理页面】
* 需实现该页面中如下 5 个方法的操作代码
*
* 1.点击【+新增】元素操作方法
* 2.表单框输入【岗位名称】的方法
* 3.表单框输入【岗位编码】的方法
* 4.表单框输入【显示顺序】的方法
* 5.点击【确定】按钮的方法
*
* 注意1:不要在 Page 页的方法中填写 iframe 的切换代码。
* 注意2:注意不要改动已经写好的方法名。
*
*
"""
class AddPostPage:
def __init__(self, driver):
self.driver = driver
def click_add_button(self):
# TODO 请实现点击【+新增】元素操作方法
self.driver.find_element(By.LINK_TEXT,'新增').click()
def input_post_name(self, post_name):
# TODO 请实现表单框输入【岗位名称】的方法
self.driver.find_element(By.ID,'postName').send_keys(post_name)
def input_post_code(self, post_code):
# TODO 请实现表单框输入【岗位编码】的方法
self.driver.find_element(By.ID,'postCode').send_keys(post_code)
def input_post_sort(self, post_sort):
# TODO 请实现表单框输入【显示顺序】的方法
self.driver.find_element(By.ID,'postSort').send_keys(post_sort)
def click_ok_button(self):
#TODO 请实现点击【确定】按钮的方法
self.driver.find_element(By.PARTIAL_LINK_TEXT,'确定').click()
add_post_page.py 的 test_web_case.py的完善
# 创建PostManagementPage对象
add_post_page = AddPostPage(self.driver)
self.driver.switch_to.frame("iframe6")
add_post_page.click_add_button()
self.driver.switch_to.parent_frame()
self.iframe = self.driver.find_element(By.XPATH, '//iframe[@src="/system/post/add"]')
self.driver.switch_to.frame(self.iframe)
add_post_page.input_post_name("董事长")
add_post_page.input_post_code("ceo")
add_post_page.input_post_sort("1")
self.driver.switch_to.parent_frame()
add_post_page.click_ok_button()
这里比较绕
注意看
1.确保现在位置处于主文档,不行你就.switch_to.default_content()
为方便粘贴test_web_case.py这里放完整版的
import unittest
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from time import sleep
from cn.lanqiao.web.login_page import LoginPage
from cn.lanqiao.web.post_management_page import PostManagementPage
from cn.lanqiao.web.add_post_page import AddPostPage
from selenium.webdriver.common.by import By
"""
* 请按照操作步骤编写测试用例
*
* 用例要求:
* 1.合理使用元素等待时间。
* 2.请调用 Page 类中的方法实现操作步骤。
* 3.合理使用 iframe 切换,iframe 切换的代码填写在此文件中。
* 4.不要改动已经写好的方法名。
*
"""
class WebCaseTest(unittest.TestCase):
# 浏览器初始化
def setUp(self):
# 设置火狐驱动的路径,该路径不要随意改动
gecko_path = "C:\\LanQiaoTest\\project\\PythonLanqiaoTest\\driver\\geckodriver.exe"
# 允许跨域访问
options = webdriver.FirefoxOptions()
options.set_preference('security.fileuri.strict_origin_policy', False)
options.set_preference('security.fileuri.origin_policy', '*')
self.driver = webdriver.Firefox(service=Service(gecko_path), options=options)
# 设置隐式等待 5 秒
self.driver.implicitly_wait(5)
# 浏览器窗口最大化
self.driver.maximize_window()
# 填写被测站点地址
self.driver.get("https://6614b0eabcadade077bea615.hz-iframe-svc.simplelab.cn/login")
# self.driver.find_element(by, value).send_keys()
# 请再此方法中续写测试用例代码
def test_browser(self):
# 创建LoginPage对象,供调用该类中的方法实现【登录】的操作代码
login_page = LoginPage(self.driver)
# 点击登录账号输入框并输入账户-admin
login_page.input_login_name("admin")
# 点击登录密码输入框并输入密码-LQ15Mock2@2004
login_page.input_login_password("admin123")
# 点击验证码输入框并输入-666
login_page.input_code("666")
# 点击登录按钮
login_page.click_login_button()
sleep(2)
# 创建PostManagementPage对象
post_management_page = PostManagementPage(self.driver)
self.a = post_management_page.get_username_text()
self.assertEqual("蓝桥超管",self.a, "没获取到蓝桥超管")
post_management_page.click_post_manage_path()
self.driver.switch_to.frame("iframe6")
post_management_page.input_post_code_search("ceo")
sleep(2)
post_management_page.click_search_button()
self.b = post_management_page.get_page_numberText()
self.assertEqual("显示第 1 到第 1 条记录,总共 1 条记录",self.b, "没获取分页信息")
post_management_page.click_delete_button()
self.driver.switch_to.parent_frame()
post_management_page.click_ok_button()
# 创建PostManagementPage对象
add_post_page = AddPostPage(self.driver)
self.driver.switch_to.frame("iframe6")
add_post_page.click_add_button()
self.driver.switch_to.parent_frame()
self.iframe = self.driver.find_element(By.XPATH, '//iframe[@src="/system/post/add"]')
self.driver.switch_to.frame(self.iframe)
add_post_page.input_post_name("董事长")
add_post_page.input_post_code("ceo")
add_post_page.input_post_sort("1")
self.driver.switch_to.parent_frame()
add_post_page.click_ok_button()
#TODO 请参照题目中【用例步骤】补全以下代码,调用 3 个Page类中的方法实现。
# 浏览器退出
def tearDown(self):
if self.driver:
self.driver.quit()
if __name__ == "__main__":
unittest.main()