page层:把每个单独的页面独立出来,管理自己页面中的元素的基本操作
page里面的页面文件是随时都在增加的,也就是在做业务流程时都需要用到哪些页面就会把哪些页面封装在page里面,所以说它是随着业务层在增加的。
同样我也拿商城来举个例子,比如添加订单这个业务,首先需要用户登录,需要对登录页进行页面封装,然后进入首页,对首页进行封装,再进入个人中心/设置页,对个人中心页进行封装这算是一个业务流程的页面需要,如果下单之后查看订单业务,还需要在这里封装订单完成页等等
封装登录页login.py
注意:这里的login.py和业务层action里的login.py不是一个py文件,这是对登录页元素的封装,相当于是对整个页面的具体封装文件
如果不明白,可以做个比较。
代码如下:
class LoginPage(BuyerPage):
'''
首页 元素进行操作
定位元素 点击 输入操作 driver对象- driver.py 进行封装InitDriver类
'''
# def __init__(self,driver:InitDriver):
# # 后面很多方法都要用到这个driver,把他设置为属性
# self.driver = driver
# # 思路百度: 动态获取类名
# self.page_info = read_yaml('/pagefiles/buyer.yml').get('LoginPage')
def username_login(self):
ele_info = self.page_info.get('账号登录')
self.driver.click(ele_info)
def input_name(self, name):
ele_info = self.page_info.get('输入用户名')
self.driver.send_keys(ele_info, name)
def input_password(self, password):
ele_info = self.page_info.get('输入密码')
self.driver.send_keys(ele_info, password)
def input_valicode(self):
ele_info = self.page_info.get('输入验证码')
#这里把验证码写死了,真实环境中可以通过ddddocr来实现OCR识别获取验证码
self.driver.send_keys(ele_info, '1512')
def login_button(self):
ele_info = self.page_info.get('点击登录按钮')
self.driver.click(ele_info)
封装首页home_page.py
像淘宝或者京东这类的网上商城一样,首页有搜索框,登录,注册这类的按钮元素,业务场景中需要首页的哪些元素就对他进行响应的封装即可
class HomePage(BuyerPage):
'''
首页 元素进行操作
定位元素 点击 输入操作 driver对象- driver.py 进行封装InitDriver类
'''
def login_link(self):
# ele_info = {'type': name / xpath / id / css / classname / tagname / linktext / plinktext, 'value': 值}
ele_info = self.page_info.get('登录链接')
self.driver.click(ele_info)
return LoginPage(self.driver)
def perseon_center(self):
ele_info = self.page_info.get('进入个人中心')
self.driver.click(ele_info)
return PersonCenterPage(self.driver)
def input_search_text(self, text):
ele_info = self.page_info.get('搜索框')
self.driver.send_keys(ele_info, text)
def click_search_btn(self):
ele_info = self.page_info.get('搜索按钮')
self.driver.click(ele_info)
return SearchResultPage(self.driver)
封装个人中心页personcenter_page.py
一般都是登录之后会展示个人中心按钮
class PersonCenterPage(BuyerPage):
def cllick_acceptaddress(self):
# ele_info = {'type': name / xpath / id / css / classname / tagname / linktext / plinktext, 'value': 值}
ele_info =self.page_info.get('收货地址菜单')
self.driver.click(ele_info)
return AcceptAddressPage(self.driver)
封装添加地址页add_adderss_page.py
添加收货地址需要用到收货人姓名、联系地址、收货区域、详细地址以及地址别名(设为默认可以暂时不用管),需要对这些元素一一封装,特别注意的是收货地址未选择下拉框,需要用到鼠标悬停的动作,如果网不好的话可以加死等(time.sleep())的方式解决
class AcceptAddressPage(BuyerPage):
def add_address(self):
# ele_info = {'type': name / xpath / id / css / classname / tagname / linktext / plinktext, 'value': 值}
ele_info =self.page_info.get('添加地址')
self.driver.click(ele_info)
def acceptgoods_name(self,name):
ele_info = self.page_info.get('收货人姓名')
self.driver.send_keys(ele_info,name)
def acceptgoods_tel(self,tel):
ele_info = self.page_info.get('输入联系方式')
self.driver.send_keys(ele_info, tel)
def choose_receaddress(self,provice,city,area):
ele_info=self.page_info.get('收货地区')
# todo 鼠标悬浮-需要在driver.py进行增加
# 省
time.sleep(2)
ele_info = {'name':'省','type':'linktext','value':provice}
self.driver.click(ele_info)
time.sleep(2)
ele_info = {'name':'市','type':'linktext','value':city}
self.driver.click(ele_info)
time.sleep(2)
ele_info = {'name':'区','type':'linktext','value':area}
self.driver.click(ele_info)