美文网首页
动态代理模式与PageObjct在selenium上的应用

动态代理模式与PageObjct在selenium上的应用

作者: 假程序员 | 来源:发表于2020-07-01 20:56 被阅读0次

常规PageObject中,Page中使用driver的属性或方法,都必须通过self.driver.xxx进行访问。而且,只有被定义在Page中的方法才能在测试类中使用,在部分测试场景下是不方便的。

目录结构


image.png

search_test.py

import unittest
from selenium import webdriver
import baidu_search.page as page


class Search(unittest.TestCase):
    driver = None

    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()

    @classmethod
    def tearDownClass(cls):
        cls.driver.close()
        cls.driver.quit()

    def tearDown(self):
        self.driver.delete_all_cookies()

    def test_001(self):
        driver = page.Page(self.driver) # 可以使用Page中定义的方法
        driver.to_url()
        driver.set_search(u"张三")
        driver.search()
        import time
        time.sleep(1)

    def test_002(self):
        driver = page.Page(self.driver)  # 可以直接使用selenium中的方法
        driver.get("https://www.jianshu.com/p/f4a3659d6bf9")

    def test_003(self):
        driver = page.Page(self.driver)  # 可以直接使用selenium中的属性
        driver.to_url()
        print(driver.title)

proxy.py

# coding=utf-8
class NativeProxy(object):
    def __init__(self, target):
        object.__setattr__(self, "_target", target)

    def __getattribute__(self, item):
        """修改get逻辑"""
        try:
            target = object.__getattribute__(self, item)
            if isinstance(target, type(object().__str__)):  # wrapped method
                raise AttributeError
            else:
                return target
        except AttributeError:
            target = object.__getattribute__(self, "_target")
            return getattr(target, item)

    def __setattr__(self, key, value):
        """修改set逻辑"""
        target = object.__getattribute__(self, "_target")
        if key in dir(target):
            setattr(target, key, value)
        else:
            object.__setattr__(self, key, value)


page.py

import proxy
from . import var


class Page(proxy.NativeProxy):
    def to_url(self):
        self.get(var.url)

    def set_search(self, value):
        control = self.find_element_by_id(var.search_context_control_id)
        control.send_keys(value)

    def search(self):
        control = self.find_element_by_id(var.search_button)
        control.click()

var.py

url = "https://www.baidu.com/"
search_context_control_id = "kw"
search_button = "su"

相关文章

  • 动态代理模式与PageObjct在selenium上的应用

    常规PageObject中,Page中使用driver的属性或方法,都必须通过self.driver.xxx进行访...

  • 【重温设计模式】代理模式

    前言 代理模式最典型的应用就是AOP,本文结合主要讲解了代理模式的几种实现方式:静态代理和动态代理,这里动态代理又...

  • 设计模式之动态代理

    动态代理模式,在当前流行框架(如:Spring、Mybatis、Dubbo)中应用非常广泛,掌握动态代理模式是理...

  • java | 什么是动态代理?

    最近在复习 Java 相关,回顾了下代理模式。代理模式在 Java 领域很多地方都有应用,它分为静态代理和动态代理...

  • java动态代理

    目录: 简介 jdk动态代理 cglib动态代理 jdk动态代理与cglib的区别 应用spring的aop 简介...

  • Proxy代理者模式(一)

    摘要 本篇笔记针对Java设计模式中最难理解的代理者模式进行讲解,从静态代理、动态代理,及Java相关代理类的应用...

  • 代理模式

    代理模式分静态代理与动态代理,而动态代理又在Spring中与两个实现:1.基于JDK的动态代理(通过接口实现)2....

  • Spring框架之动态代理

    前言 动态代理是一种常用的设计模式,广泛应用于框架中,Spring框架的AOP特性就是应用动态代理实现的,想要理解...

  • 动态代理模式

    动态代理模式属于比较困难的一个设计模式。开发中用到的很少,因为动态代理模式的应用场景是搭建框架,对于大部分人而言能...

  • Spring之代理模式

    九、代理模式 目录:静态代理、动态代理AOP的底层机制就是动态代理。代理模式分为静态代理和动态代理。接触aop之前...

网友评论

      本文标题:动态代理模式与PageObjct在selenium上的应用

      本文链接:https://www.haomeiwen.com/subject/lwzhqktx.html