模拟赛 2 期 自动化测试python——第十五届蓝桥杯(软件测试)
题目链接
第十五届蓝桥杯(软件测试)模拟赛 1 期题目 - 自动化测试题目(Python 语言)( 50 分) - 蓝桥云课 (lanqiao.cn)
题目信息:
请使用 Python 编程语言,结合 PO 模式(Page Object Model 的简写 页面对象模型 )思想 ,使用 Selenium 自动化测试工具补全如下 4 个 Java 类文件中 # TODO 处缺失的代码(只填写TODO部分缺失的代码,其他内容勿改):
-
login_page.py:“用户登录” 页面。
-
add_user_page.py:“新增用户” 页面。
-
user_manage_page.py:“用户管理” 页面。
-
test_web_case.py:测试用例。
请按照用例步骤,在测试用例 test_web_case.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.iframe 的切换 (每个这里切换题目都有提示,发现定位不到就检查一下这里)
2.
报错现象如图,文字存在空格,所以也不容易看出来
解决方法: 看图
错误的演示: 不要学!!!! 不要学!!!! 不要学!!!! 不要学!!!!
关于这道比较绕,所以就直接跟系统步骤来做比较方便
第 1 步:输入被测系统网址,请查看部署成功的被测系统网址。
网址是变化的别跟着复制了
self.driver.get("https://66156b17172d5d50d821fb5b.hz-iframe-svc.simplelab.cn/login")
第 2 步:在登录页面依次①输入【用户名】-->②输入【密码】-->③点击【登录】按钮进行登录,如下图所示。
login_page.py的补充
from selenium.webdriver.common.by import By """ * Page1-【登录】页面 * * 实现该页面中如下 3 个元素的操作代码(以下元素位置可参照题目附图)。 * * 1. 输入【登录名称】 * 2. 输入【登录密码】 * 3. 点击【登录】按钮 * 注意1:不要在 Page 类中填写 iframe 切换的代码。 * 注意2:不要改动已经写好的方法名。 """ class LoginPage: def __init__(self, driver): self.driver = driver def input_login_name(self, loginName): # TODO 实现 【登录名称】输入的方法 self.driver.find_element(By.CSS_SELECTOR,'input[name="username"]').clear() self.driver.find_element(By.CSS_SELECTOR,'input[name="username"]').send_keys(loginName) def input_login_password(self, password): # TODO 实现【密码】输入的 方法 self.driver.find_element(By.CSS_SELECTOR,'input[name="password"]').clear() self.driver.find_element(By.CSS_SELECTOR,'input[name="password"]').send_keys(password) def click_login_button(self): # TODO 实现 【登录】按钮的点击方法 self.driver.find_element(By.ID,'btnSubmit').click()
第 3 步:插入断言,登录成功后,请对显示的用户名是否为【蓝桥超管】进行断言,如下图所示。
user_manage_page.py 的补充
user_manage_page = UserManagePage(self.driver) self.a = user_manage_page.get_username_text() self.assertEqual("蓝桥超管", self.a, "没找到蓝桥超管")
第 4 步:依次①点击【系统管理】-->②点击【用户管理】-->③点击【新增用户】按钮,如下图所示。
提示:注意此处 iframe 的切换。
user_manage_page.py 的补充
def click_system_menu(self): # TODO 请实现点击【系统管理】菜单的操作方法 self.driver.find_element(By.XPATH, '//span[text()="系统管理"]').click() def click_user_menu(self): # TODO 请实现点击【用户管理】菜单的操作方法 self.driver.find_element(By.PARTIAL_LINK_TEXT,'用户管理').click() def click_add_user_button(self): # TODO 请实现点击【新增+】按钮的操作方法 self.driver.find_element(By.XPATH, '//div[@id="toolbar"]/a[1]').click()
第 5 步:新增用户页面,依次①输入【用户名称】-->②输入【登录账号】-->③输入【登录密码】-->④勾选【角色】(普通角色)-->⑤点击【保存】按钮,如下图所示。
提示:注意此处 iframe 的切换。
add_user_page.py的补充
""" * Page3-【新增用户】页面 * 需实现该页面中如下 5 个元素的操作代码,以下元素位置可参照题目附图: * * 1. 表单框输入【用户名】 * 2. 表单框输入【登录账号】 * 3. 表单框输入【密码】 * 4. 单选框选择【普通用户】 * 5. 点击【保存】按钮 * 注意1:不要在 Page 类中填写 iframe 切换的代码。 * 注意2:不要改动已经写好的方法名。 """ from selenium.webdriver.common.by import By class AddUserPage: def __init__(self, driver): self.driver = driver def input_user_name(self, userName): # TODO 实现 表单【用户名】点击和输入 的方法 self.driver.find_element(By.ID,'userName').clear() self.driver.find_element(By.ID,'userName').send_keys(userName) def input_login_name(self, loginName): # TODO 实现 表单【登录账号】点击和输入 的方法 self.driver.find_element(By.ID,'loginName').clear() self.driver.find_element(By.ID,'loginName').send_keys(loginName) def input_login_password(self, loginPassword): # TODO 实现 表单【密码】点击和输入 的方法 self.driver.find_element(By.ID,'password').clear() self.driver.find_element(By.ID,'password').send_keys(loginPassword) def click_role(self): # TODO 实现 表单【普通用户】单选 的方法 self.driver.find_element(By.XPATH,'//div[@]/label[2]').click() def click_save_button(self): # TODO 实现 表单【保存】按钮点击的方法 self.driver.find_element(By.XPATH,'//button[@]/i').click()
第 6 步:插入断言,断言是否添加成功,通过下图中①处中文本内容和预期相匹配。
self.b = user_manage_page.get_page_number_text() self.assertEqual("显示第 1 到第 3 条记录,总共 3 条记录", self.b, "没找到分页信息")
第 7 步:如上图所示,在搜索框中输入刚才新添加的用户②【登录名称】,③点击【搜索】按钮。
user_manage_page.input_login_name("luobo") user_manage_page.click_search_button() user_manage_page.delete_user() user_manage_page.click_reset_button()
第 8 步:插入断言,断言搜索结果是否正确,通过上图中①处中文本内容和预期相匹配。
这里的断言数据看你们自己实际的"显示第 1 到第 3 条记录,总共 3 条记录"
self.b = user_manage_page.get_page_number_text() self.assertEqual("显示第 1 到第 3 条记录,总共 3 条记录", self.b, "没找到分页信息")
第 9 步:在搜索结果的用户列表中,删除搜出出的该条信息,点击该条数据后面的④【删除】按钮,如上图所示。
user_manage_page.input_login_name("luobo") user_manage_page.click_search_button() user_manage_page.delete_user()
第 10 步:点击⑤【重置】对搜索条件进行清除,如上图所示。
user_manage_page.click_reset_button()
第 11 步:插入断言,断言搜索结果中①处中文本内容和预期相匹配。
这里的断言数据看你们自己实际的"显示第 1 到第 2 条记录,总共 2 条记录"
self.c = user_manage_page.get_page_number_text() self.assertEqual("显示第 1 到第 2 条记录,总共 2 条记录", self.c, "没找到分页信息2")
第 12 步:点击【蓝桥超管】头像,点击【退出登录】,如下图所示。
提示:注意此处 iframe 的切换。
self.driver.switch_to.parent_frame() user_manage_page.click_login_out() time.sleep(2)
login_page.py代码
from selenium.webdriver.common.by import By """ * Page1-【登录】页面 * * 实现该页面中如下 3 个元素的操作代码(以下元素位置可参照题目附图)。 * * 1. 输入【登录名称】 * 2. 输入【登录密码】 * 3. 点击【登录】按钮 * 注意1:不要在 Page 类中填写 iframe 切换的代码。 * 注意2:不要改动已经写好的方法名。 """ class LoginPage: def __init__(self, driver): self.driver = driver def input_login_name(self, loginName): # TODO 实现 【登录名称】输入的方法 self.driver.find_element(By.CSS_SELECTOR,'input[name="username"]').clear() self.driver.find_element(By.CSS_SELECTOR,'input[name="username"]').send_keys(loginName) def input_login_password(self, password): # TODO 实现【密码】输入的 方法 self.driver.find_element(By.CSS_SELECTOR,'input[name="password"]').clear() self.driver.find_element(By.CSS_SELECTOR,'input[name="password"]').send_keys(password) def click_login_button(self): # TODO 实现 【登录】按钮的点击方法 self.driver.find_element(By.ID,'btnSubmit').click()
user_manage_page.py代码
from selenium.webdriver.common.by import By from time import sleep """ * page2-【用户管理 】页面 * * 需实现该页面中如下 10 个元素的操作代码,以下元素位置可参照题目附图: * * 1. 点击【系统管理】菜单 * 2. 点击【用户管理】菜单 * 3. 点击【新增+】按钮 * 4. 输入【登录名称】搜索框 * 5. 点击【搜索】按钮 * 6. 点击【重置】按钮 * 7. 点击【删除】按钮 * 8. 获取【分页显示信息】文本 * 9. 获取【登录成功后的用户名】文本 * 10. 用户【用户退出】的操作方法 * 注意1:不要在 Page 类中填写 iframe 切换的代码。 * 注意2:不要改动已经写好的方法名。 """ class UserManagePage: def __init__(self, driver): self.driver = driver def click_system_menu(self): # TODO 请实现点击【系统管理】菜单的操作方法 self.driver.find_element(By.XPATH, '//span[text()="系统管理"]').click() def click_user_menu(self): # TODO 请实现点击【用户管理】菜单的操作方法 self.driver.find_element(By.PARTIAL_LINK_TEXT,'用户管理').click() def click_add_user_button(self): # TODO 请实现点击【新增+】按钮的操作方法 self.driver.find_element(By.XPATH, '//div[@id="toolbar"]/a[1]').click() def input_login_name(self, loginName): # TODO 请实现搜索框输入【登录名称】的操作方法 self.driver.find_element(By.XPATH, '//input[@name="loginName"]').clear() self.driver.find_element(By.XPATH, '//input[@name="loginName"]').click() self.driver.find_element(By.XPATH, '//input[@name="loginName"]').send_keys(loginName) def click_search_button(self): # TODO 请实现点击【搜索】按钮的操作方法 self.driver.find_element(By.XPATH, '//input[@name="loginName"]/../../li/a[1]').click() def click_reset_button(self): # TODO 请实现【重置】按钮的操作方法 self.driver.find_element(By.XPATH, '//input[@name="loginName"]/../../li/a[2]').click() def delete_user(self): # TODO 请实现【删除】用户的操作方法 self.driver.find_element(By.XPATH, '//table[@id="bootstrap-table"]/tbody/tr[1]/td/a[2]').click() def get_username_text(self): # TODO: 实现获取【登录成功后的用户名文本】的操作方法 return self.driver.find_element(By.CSS_SELECTOR, '.dropdown-toggle .hidden-xs').text def get_page_number_text(self): # TODO: 实现获取【分页显示信息】的操作方法 return self.driver.find_element(By.CSS_SELECTOR, '.pagination-info').text def click_login_out(self): # TODO 请实现 【用户退出】的操作方法 self.driver.find_element(By.CSS_SELECTOR, '.dropdown-toggle .hidden-xs').click() self.driver.find_element(By.XPATH, '//ul[@]/li[6]/a').click()
add_user_page.py代码
""" * Page3-【新增用户】页面 * 需实现该页面中如下 5 个元素的操作代码,以下元素位置可参照题目附图: * * 1. 表单框输入【用户名】 * 2. 表单框输入【登录账号】 * 3. 表单框输入【密码】 * 4. 单选框选择【普通用户】 * 5. 点击【保存】按钮 * 注意1:不要在 Page 类中填写 iframe 切换的代码。 * 注意2:不要改动已经写好的方法名。 """ from selenium.webdriver.common.by import By class AddUserPage: def __init__(self, driver): self.driver = driver def input_user_name(self, userName): # TODO 实现 表单【用户名】点击和输入 的方法 self.driver.find_element(By.ID,'userName').clear() self.driver.find_element(By.ID,'userName').send_keys(userName) def input_login_name(self, loginName): # TODO 实现 表单【登录账号】点击和输入 的方法 self.driver.find_element(By.ID,'loginName').clear() self.driver.find_element(By.ID,'loginName').send_keys(loginName) def input_login_password(self, loginPassword): # TODO 实现 表单【密码】点击和输入 的方法 self.driver.find_element(By.ID,'password').clear() self.driver.find_element(By.ID,'password').send_keys(loginPassword) def click_role(self): # TODO 实现 表单【普通用户】单选 的方法 self.driver.find_element(By.XPATH,'//div[@]/label[2]').click() def click_save_button(self): # TODO 实现 表单【保存】按钮点击的方法 self.driver.find_element(By.XPATH,'//button[@]/i').click()
test_web_case.py代码
import unittest from selenium import webdriver from selenium.webdriver.firefox.service import Service from cn.lanqiao.web.login_page import LoginPage import time from cn.lanqiao.web.add_user_page import AddUserPage from cn.lanqiao.web.user_manage_page import UserManagePage from selenium.webdriver.common.by import By """ * 请按照操作步骤编写测试用例 * * 用例要求: * 1.合理使用元素等待时间。 * 2.请调用 Page 类中的方法实现操作步骤。 * 3.合理使用 iframe 切换,iframe 切换的代码填写在此文件中。 * 4.不要改动已经写好的方法名。 """ class TestWebCase(unittest.TestCase): # 浏览器初始化 def setUp(self): # 不要改动此处 driver 位置 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) self.driver.implicitly_wait(10) self.driver.maximize_window() # TODO 打开被测系统的网址 self.driver.get("https://66156b17172d5d50d821fb5b.hz-iframe-svc.simplelab.cn/login") # 请在此方法中续写测试用例 def test_case(self,): # 创建 LoginPage 对象 login_page = LoginPage(self.driver) login_page.input_login_name("admin") login_page.input_login_password("admin123") login_page.click_login_button() time.sleep(2) # 创建 UserManagePage 对象 user_manage_page = UserManagePage(self.driver) self.a = user_manage_page.get_username_text() self.assertEqual("蓝桥超管", self.a, "没找到蓝桥超管") user_manage_page.click_system_menu() user_manage_page.click_user_menu() self.driver.switch_to.frame("iframe2") user_manage_page.click_add_user_button() self.driver.switch_to.parent_frame() self.driver.switch_to.frame(self.driver.find_element(By.XPATH, '//iframe[@src="/system/user/add"]')) # 创建 AddUserPage 对象 add_user_page = AddUserPage(self.driver) add_user_page.input_user_name("luobo") add_user_page.input_login_name("luobo") add_user_page.input_login_password("123456") add_user_page.click_role() add_user_page.click_save_button() self.driver.switch_to.parent_frame() self.driver.switch_to.frame("iframe2") self.b = user_manage_page.get_page_number_text() self.assertEqual("显示第 1 到第 2 条记录,总共 2 条记录", self.b, "没找到分页信息") user_manage_page.input_login_name("luobo") user_manage_page.click_search_button() user_manage_page.delete_user() time.sleep(2) user_manage_page.click_reset_button() time.sleep(2) self.c = user_manage_page.get_page_number_text() self.assertEqual("显示第 1 到第 1 条记录,总共 1 条记录", self.c, "没找到分页信息2") self.driver.switch_to.parent_frame() user_manage_page.click_login_out() time.sleep(2) # TODO 请调用以上3个实例化对象中的方法完成测试用例代码(具体请参照题目中的用例步骤描述和截图) # 浏览器退出 def tearDown(self): if self.driver: self.driver.quit() if __name__ == "__main__": unittest.main()