zoukankan      html  css  js  c++  java
  • selenium+Python(Page Object 设计模式实例)

    以下实例演示了采用了page Object设计模式的方式登录qq空间:

    1、创建基础类page:在初始方法__init__()定义驱动的(driver),基本url(base_url)和超时时间(timeout)等

    2、创建LoginPage类:Page类中定义的方法是页面操作的基本方法,后面根据登录页面特点创建LoaginPage类并继承Page,这就是page Object设计模式中的对象层

    3、创建test_user_login()函数:创建test_user_login()函数将单个元素操作组成一个完整动作,这个动作包含打开浏览器、输入账号密码、登录等操作

    4、创建main()函数:main()函数更接近用户操作行为,用户操作只需要关系是那个浏览器打开打开网址,登录的用户名和密码是什么,不会关系是如何去定位输入框的

    代码:

    # -*- coding: utf-8 -*-
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from time import sleep
    
    class Page(object):
        """基础类,用于所以页面对象类继承"""
        login_url = 'https://i.qq.com'
        def __init__(self, selenium_driver, base_url=login_url):
            self.base_url = base_url
            self.driver = selenium_driver
            self.timeout = 30
        def on_page(self):
            return  self.driver.current_url == (self.base_url + self.url)
        def _open(self,url):
            url = self.base_url+url
            self.driver.get(url)
            assert self.on_page(),'did not land on %s' % url
    
        def open(self):
            self._open(self.url)
    
        def find_element(self, *loc):
            return self.driver.find_element(*loc)
    
    class LoginPage(Page):
    
        """登录页面模型"""
    
        url = '/'
        # 定位器
        username_loc = (By.ID, 'u')
        password_loc = (By.ID, 'p')
        submit_loc = (By.ID, 'login_button')
    
        def type_username(self, username):
            self.find_element(*self.username_loc).send_keys(username)
    
        def type_password(self, password):
            self.find_element(*self.password_loc).send_keys(password)
    
        def type_submit(self):
            self.find_element(*self.submit_loc).click()
    
    def test_user_login(driver, username, password):
        """测试获取的用户名、密码是否可以登录成功"""
        login_page = LoginPage(driver)
        login_page.open()
        driver.maximize_window()
        driver.switch_to_frame('login_frame')
        driver.find_element_by_id("switcher_plogin").click()
        login_page.type_username(username)
        login_page.type_password(password)
        login_page.type_submit()
    
    def main():
        try:
            driver = webdriver.Firefox()
            username = 'qq号'   #调试的时候需要换成对应的QQ号
            password = 'qq密码' #需要换成对应的密码
            test_user_login(driver, username, password)
            sleep(3)
            # 断言的方式判断登录是否成功
            try:
                assert '对应空间的title' in driver.title  #调试时候title要换
                print ('successful')
            except Exception as e :
                print ('failed')
    
        finally:
            driver.close()
    
    if __name__ == '__main__':
        main()
    

      这样的分层好处是,不同的层关心不同的问题,页面对象只关心元素的定位问题,测试用例只关心测试数据

  • 相关阅读:
    C#的System.Diagnostics.Trace.WriteLine 写入到文件中案例
    ubuntu开放指定端口
    mysql 启报错报 The server quit without updating PID file
    【WebMisCentral WMC】基于Extjs 4.2x的企业级用户授权认证中心系统(SSO+AM+SM),多租户SAAS应用
    Ajaxupload.js在最新版chrome 83版浏览器oncomplete失效问题解决方法
    SQLServer 父子结构group汇总显示
    jqweui 关于$(document.body).infinite的bug
    EntityFramework 动态构造排序 Func<IQueryable<T>, IOrderedQueryable<T>> Dynamic
    Safari 3D transform变换z-index层级渲染异常的研究
    Asp.net Core中使用NLog,并封装成公共的日志方法
  • 原文地址:https://www.cnblogs.com/101718qiong/p/7839996.html
Copyright © 2011-2022 走看看