- 完善你的PO,把显示等待等涉及到webdriver的方法封装到basepage中
- 使用PO设计模式写如下的testcase:
- 删除成员
- 导入通讯录
- 回复github链接到帖子里
- basepage的每一行都需要写注释
https://github.com/CandiceDiao/lagouhomework/tree/master/webtest/PO
将显示等待封装到basepage中,在执行时,依然每次都要调用等待,待优化
# -*- encoding: UTF-8 -*-
"""
@File : menu_contact_page.py
@Time : 2020-6-24 9:02
@Author : Mokwing
@Email : 1010326277@qq.com
@Software: PyCharm
@Message : 通讯录页面
"""
from time import sleep
from selenium.webdriver.common.by import By
from hogwarts.qywechat.page.base_page import BasePage
class MenuContacts(BasePage):
# _member_name_loc = '.ww_checkbox' # 定位复选框 -- 使用 checkbox_by_name_or_tel() 定位复选框,该方式停用
_js_list_loc = '.js_list' # 当前成员列表
_delete_btn_loc = ".js_delete" # 删除按钮
_wait_add_user_loc = '//*[text()="添加成员"]' # 确认添加成员
_confirm_btn_loc = '//*[@id="__dialog__MNDialog__"]/div/div[3]/a[1]' # 确认按钮
_cancel_btn_loc = '//*[@id="__dialog__MNDialog__"]/div/div[3]/a[2]' # 取消按钮
_delete_success_loc = '//*[text()="删除成功"]'
# 删除成员
def delete_contact_info(self, name="", tel=""):
# 找到需要删除的用户点击复选框选择
self.checkbox_by_name_or_tel(name, tel).click()
# 点击删除按钮
self._driver.find_element(By.CSS_SELECTOR, self._delete_btn_loc).click()
# 点击确认
self._driver.find_element(By.XPATH, self._confirm_btn_loc).click()
# 获取删除后提示信息
return self._driver.find_element(By.XPATH, self._delete_success_loc).text
# 导入通讯录成员
_id_js_upload_file_input_loc = 'js_upload_file_input' # id -- 上传文件
_id_submit_csv_loc = 'submit_csv' # id -- 确认导入
_id_check_assert_loc = 'reloadContact' # id -- 等待加载文件完成检查该元素是否存在,存在可以使用该元素进行断言
def upload_contacts(self, fp):
self._driver.find_element(By.ID, self._id_js_upload_file_input_loc).send_keys(fp)
self._driver.find_element(By.ID, self._id_submit_csv_loc).click()
b = self._according_to_wait(10, (By.ID, self._id_check_assert_loc))
if b is False:
print("等待文件上传!")
sleep(10)
# 上传成功返回校验信息
return self._driver.find_element(By.ID, self._id_check_assert_loc).text
# 通过名字或者手机号获取复选框
def checkbox_by_name_or_tel(self, name="", tel=""):
if name != "":
ele_info = self._driver.find_element(By.XPATH,
f'//*[text()="{name}"]/parent::*/preceding-sibling::td/input')
elif tel != "":
ele_info = self._driver.find_element(By.XPATH,
f'//*[text()="{tel}"]/parent::*/preceding-sibling::td/input')
elif name != "" and tel != "":
ele_info = self._driver.find_element(By.XPATH,
f'//*[text()="{name}"]/parent::*/preceding-sibling::td/input')
else:
raise Exception("请输入需要删除的通讯录成员的姓名或者手机。")
sleep(1)
return ele_info
# -*- encoding: UTF-8 -*-
"""
@File : test_menu_contact.py
@Time : 2020-6-24 9:55
@Author : Mokwing
@Email : 1010326277@qq.com
@Software: PyCharm
@Message : 测试通讯录页面
"""
from hogwarts.qywechat.page.home_page import HomePage
class TestMenuContact:
def setup(self):
self.home = HomePage(mod="rb")
assert "首页" == self.home.go_to_login().scan_code_login_of_browser_reuse()
def teardown(self):
pass
def test_delete_contact_info(self):
contact_info = self.home.go_to_menu_contact().delete_contact_info(name="李丽婷", tel="13076232324")
print("通讯录文本:", contact_info)
assert "删除成功" == contact_info
# 测试上传通讯录
def test_upload_contacts(self):
assert "前往查看" == self.home.go_to_upload_contacts().upload_contacts(
r"C:\BianYi\WorkSpaces\python\mokwing2py\hogwarts\qywechat\test_data\contacts.xlsx")
陈智斌: 企业微信实战(二)作业提交
Pages存放页面对象,TestCase存放测试用例,data存放数据文件(上传文件,cookie文件)
https://github.com/archerckk/hogwarts/tree/master/Page_Object
听不错的,还用了解元祖的方式。能从代码看出来已经理解PO了。不过有一个问题,如果你的page,比如import_page不是一个起始页面就不要给它的base_url赋值了。另外还有个优化空间是,PO除了公共方法会暴露为公有之外,其他的都是私有变量。比如你的定位元素 和你的base_url,包括driver,都可以做成私有
强等还需要做优化
写的很好,虽然还是有一些细节的瑕疵,但是看得出来加了很多自己的思考和优化。比较优秀的作业是应该这个样子的,给你点个赞。另外问一下base_page中的method 加_的意义是?
PO是理解了,但是还需要多优化,比如你的find 方法。上面有一些同学做的不错的可以参考。另外 文件名,类名,其实有点不合规范(pep8)。刚开始一定要养成好的编码习惯
哈哈,谢谢老师。主要是想 base_page 中的方法和其他页面区分开,调用时候好操作些;其实把名字定义好也行。
谢谢老师,已优化。
已修改:
修改pages跟test_case的文件命名,类名
重写base_page的find跟finds方法,并且改为私有方法
测试用例的变量为result的都改为见名知意更容易理解断言的命名