zoukankan      html  css  js  c++  java
  • 9.PO库设计与实现

    PO库设计与实现

    元素定位方式封装

    写一个locators.yml文件

    LoginPage:
      email_input: ['id','email']
      pwd_input: ['id','password']
      login_btn: ['css selector','.MuiButton-containedPrimary']
      
    MainPage:
      task_input: ['id','task']
    

    读取配置文件

        #读取配置文件
        self.locators=read_yml('conf/locators.yml')['LoginPage']
    

    但是这样,不管是哪个页面进来只能读取到LoginPage页面的元素

    class BasePage:
    def init(self):
    self._driver=WebdriverCreater().get_browser()
    #读取配置文件
    current_class=self.class.name
    self.locators=read_yml('conf/locators.yml')[current_class]

    实现登录方法

    class LoginPage(BasePage):
        def __init__(self):
            super().__init__()
            self.email_input=self.locators['email_input']
            self.pwd_input=self.locators['pwd_input']
            self.login_btn=self.locators['login_btn']
    
        def login(self,email,pwd):
            self.input_text(self.email_input,email)
            self.input_text(self.pwd_input,pwd)
            self.click(self.login_btn)
    

    假如MainPage里面也需要元素操作,那么也要进行初始化,其他页面也要这么操作,那我们有更好的方法来减少重复性的操作吗?
    我们现在是不断的给这个属性赋值,那有没有方法可以进行批量操作呢?
    python是动态类型的语言,那python就有方法动态给属性赋值

    配置信息读取出来,是一个个字典,那我们就可以通过遍历进行不断的赋值
    #动态赋值元素属性--key ,value
    self.setattr(self.email_input,self.locators['email_input'])

    在basepage的init方法里面操作

        def __init__(self):
            self._driver=WebdriverCreater().get_browser()
            #读取配置文件
            current_class=self.__class__.__name__
            self.locators=read_yml('conf/locators.yml')[current_class]
            #动态赋值元素属性
            for key in self.locators:
                self.__setattr__(key,self.locators[key])# 参数:1属性,2属性值
    

    至此为止,basepage框架基本搭好了

    实现业务类--链式调用

    现在需要实现具体的业务类

    if name == 'main':
    LoginPage().login('xx','xxx')
    MainPage().to_schedule()

    正常情况是这么实现,每一个页面都要实例化,然后再调用具体的方法

    那我们可以这样实现吗?
    LoginPage().login('xx','xxx').to_schedule()

    这样实现的好处是进行链式调用,简化我们的代码
    利用login方法的返回值,让login方法返回一个对象,然后通过返回的对象调用实例的方法来实现

        def login(self,email,pwd):
            self.input_text(self.email_input,email)
            self.input_text(self.pwd_input,pwd)
            self.click(self.login_btn)
            return MainPage()
    class MainPage(BasePage):
        def to_schedule(self):
            #点击日程
            self.click(self.schedule_btn)
            return SchedulePage()
    
    

    接下来实现创建日程的方法

    创建日程

    class SchedulePage(BasePage):
        def new_schedule(self):
            pass
        #点击日程
    
        #点击新建按钮
        
        #输入主题
        
        #点击指派
        
        #清除已选
        
        #选择目标用户
    

    接下来获取页面元素定位表达式,保存到配置文件中

    class SchedulePage(BasePage):
        def new_schedule(self,sumary,target):
            #点击新建按钮
            self.click(self.new_btn)
            #输入主题
            self.input_text(self.sumary_input,sumary)
            #点击指派
            self.click(self.select_btn)
    

    清除已选,需要操作多个元素,通过for循环进行点击操作,for循环放到业务逻辑里面不合理,操作多个元素也是一个通用方法,其他页面也有可能用到,在common中封装一个通用方法

        #点击多个元素
        def click_multi(self):
            eles=self._driver.find_elements()
            for ele in eles:
                ele.click()
    
    

    选择目标元素,通过什么来选择目标元素呢?观察发现可以通过文本来选择,那我们又封装一个方法来实现

        #根据文本选择目标元素
        def select_target_by_text(self,locator,text):
            eles=self._driver.find_elements(*locator)
            for ele in eles:
                if ele.text==text:
                    ele.click()
                    break
    
    class SchedulePage(BasePage):
        def new_schedule(self,sumary,target):
            #点击新建按钮
            self.click(self.new_btn)
            #输入主题
            self.input_text(self.sumary_input,sumary)
            #点击指派
            self.click(self.select_btn)
            #清除已选
            self.click_multi(self.selected_users)
            #选择目标用户
            self.select_target_by_text(self.target_users,target)
    
    class SchedulePage(BasePage):
        def new_schedule(self,sumary,target):
            #点击新建按钮
            self.click(self.new_btn)
            #输入主题
            self.input_text(self.sumary_input,sumary)
            #点击指派
            self.click(self.select_btn)
            #清除已选
            self.click_multi(self.selected_users)
            #选择目标用户
            self.select_target_by_text(self.target_users,target)
            #点击确认
            self.click(self.confirm_btn)
            #点击保存
            self.click(self.save_btn)
    
    
    if __name__ == '__main__':
        LoginPage().login('gavin@test.com','123456').to_schedule().new_schedule('早会','猪八戒')
    

    css包含模式:
    图 7

    LoginPage:
      email_input: ['id','email']
      pwd_input: ['id','password']
      login_btn: ['css selector','.MuiButton-containedPrimary']
    
    MainPage:
      schedule_btn: ['css selector','.creator-object-nav-events']
    
    SchedulePage:
      new_btn: ['css selector','div[title="新建"]']
      sumary_input: ['css selector','[name="name"]']
      select_btn: ['css selector','.selectUser-box']
      selected_users: ['css selector','#valueLabel a']
      target_users: ['css selector','.cf_space_user_list_table tbody tr']
      confirm_btn: ['css selector','#confirm']
      save_btn: ['css selector','.slds-modal__footer .slds-button_brand']
    
  • 相关阅读:
    【数学】三分法
    【数学】【背包】【NOIP2018】P5020 货币系统
    【数学】【CF27E】 Number With The Given Amount Of Divisors
    【单调队列】【P3957】 跳房子
    【极值问题】【CF33C】 Wonderful Randomized Sum
    【DP】【CF31E】 TV Game
    【神仙题】【CF28D】 Don't fear, DravDe is kind
    【线段树】【CF19D】 Points
    【字符串】KMP字符串匹配
    【二维树状数组】【CF10D】 LCIS
  • 原文地址:https://www.cnblogs.com/xiehuangzhijia/p/15170231.html
Copyright © 2011-2022 走看看