Python--getattr反射+selenium详解篇

简介: Python--getattr反射+selenium详解篇

这里是清安,再前面的selenium中,有用到反射来写代码,那么什么是反射,可能有些朋友还不太清楚。本章就具体实例带你学习一下反射。反射,指的是运行时获取类型定义信息。一个对象能够在运行时,像照镜子一样,反射出其类型信息。简单说,在Python中,能够通过一个对象,找出其type、class、attribute或method的能力,称为反射。反射也可以称之为魔术方法,例如:getattr()、setattr()、delattr()、hasattr()。但是魔术方法不止这些,别搞混了。

getattr

getattr():通过name返回object的属性值,当属性不存在,将使用default返回,如果没有default,则抛出AttributeError,name必须是字符串。这是getattr的源文件介绍:

def getattr(object, name, default=None): # known special case of getattr
    """
    getattr(object, name[, default]) -> value
    Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
    When a default argument is given, it is returned when the attribute doesn't
    exist; without it, an exception is raised in that case.
    """
    pass

看以下代码帮助你更快的理解,这是A.py文件的内容:

def number(num):
    print(f"{num}")
    return "我反射过来了"

这是B.py的内容

import test01
i = getattr(test01, 'number')('清安')
print(i)
# 清安
# 我反射过来了

这里的test01就是我的A.py,我导入了B.py文件中。前面说了name必须是字符串,所以这里的number其实是A.py文件中的函数方法,这里等价于:test01.number('qingan')。那么就有小伙伴问了,源文件里面不是有个default=None,如果没有查找到,用该值替代

o = getattr(test01, 'numbe')
print(o)
i = getattr(test01, 'numbe','不存在')
print(i)

看这两个例子,一个用了默认值,一个没用默认值,没用默认值的且函数方法错了,那么运行之后就会告诉你这样的一个错误:

AttributeError: module 'test01' has no attribute 'numbe'

那么用了默认值的,则会告诉你"不存在"。这样的一个字样在学习的过程中,你会看到不一样的教程,getattr反射的是某类的属性,也只能是属性,要是反射其他的就会报错。但其实不然,都可以进行反射,因为函数方法也可以是属性,就比如上述例子中。那么问题来了,为什么要学这个。我们不是自动化测试吗?

if brower_type == 0 or brower_type == BrowserDriver.Chrome:
            driver = webdriver.Chrome()
        elif brower_type == 1 or brower_type == BrowserDriver.Firefox:
            driver = webdriver.Firefox()
        elif brower_type == 2 or brower_type == BrowserDriver.Ie:
            driver = webdriver.Ie()
        elif brower_type == 3 or brower_type == BrowserDriver.Edge:
            driver = webdriver.Edge()

上述代码中,你是否也有这么写过呢,用很多的if-elif-else来判断一个浏览器,或者定位方法。这样写难道自己觉得不多于吗,重复写了很多代码。那么如何优化呢?答案就是getattr反射。看代码:

# -->>>清安<<<---
from selenium import webdriver
def driver_(option_):
    che = getattr(webdriver, option_)()
    return che
class Browser:
    def __init__(self,option_):
        self.driver = driver_(option_)
    def open(self,url):
        self.driver.get(url)

这是主代码的方法,写的比较简单,但是一个实实在在的例子。我可以根据传入不同的值来打开不同的浏览器,且只有两行代码。再比较上述的写了一行又一行的代码,麻烦且重复。getattr(webdriver, option_)()等价于webdriver.option_()。这里的option_就是需要传入的驱动。那么如何传值到基类中并且调用主代码中类的函数方法呢。看代码:

from test01 import Browser
driver = Browser('Chrome')
driver.open('https://baidu.com')

这里就很方便了,我在Browser中传入火狐的,IE的那么就会在对应的浏览器中打开对应的百度链接。好了,对于getattr的运用介绍到这,你可以在元素定位的方法删同样运用起来,因为selenium中八大元素定位,如果你还像if-elif-else一样写,那就太磨人了。

hasattr

以下是源文件介绍:

def hasattr(*args, **kwargs): # real signature unknown
    """
    Return whether the object has an attribute with the given name.
    This is done by calling getattr(obj, name) and catching AttributeError.
    """
    pass

返回对象是否具有具有给定名称的属性,这是通过调用  getattr(obj,name) 并捕获AttributeError来完成的。

看到这,你大可以理解为我不能直接用getattr吗,还加这个。当然可以直接用getattr,这里相当于增加了一个保险装置。

import requests
class BaseRequest:
    req = requests.session()
    def get(self,url):
        resp = self.req.get(url)
        print("这是一个经过反射的get请求")
        return resp
    def post(self,url):
        resp = self.req.post(url)
        print("这是一个经过反射的post请求")
        return resp
    # # 不使用反射的方法
    # def main(self, method, url):
    #     if method == "get":
    #         self.get(url)
    #     elif method == "post":
    #         self.post(url)
    #     elif method == "put":
    #         self.put(url)
    # 使用反射的方法
    def main_attr(self, method, url):
        if hasattr(self, method):
            f = getattr(self, method)
            f(url)
request = BaseRequest()
request.main_attr("get", "https://www.baidu.com")
request.main_attr("post", "https://www.baidu.com")


以上是简单的代码示例。其实这样写也是会显得代码非常的多,这里给个提示,自行想想,直接把函数方法中的get请求,post请求直接写入到反射中。这样又能节省一部分的代码了。例如:

response = getattr(requests, method)(url, json=data, headers=headers, **kwargs)

仅供参考!

后续将介绍具体的思想以及用法!

目录
相关文章
|
24天前
|
Web App开发 前端开发 JavaScript
探索Python科学计算的边界:利用Selenium进行Web应用性能测试与优化
【10月更文挑战第6天】随着互联网技术的发展,Web应用程序已经成为人们日常生活和工作中不可或缺的一部分。这些应用不仅需要提供丰富的功能,还必须具备良好的性能表现以保证用户体验。性能测试是确保Web应用能够快速响应用户请求并处理大量并发访问的关键步骤之一。本文将探讨如何使用Python结合Selenium来进行Web应用的性能测试,并通过实际代码示例展示如何识别瓶颈及优化应用。
80 5
|
3天前
|
数据采集 Web App开发 前端开发
Python爬虫进阶:Selenium在动态网页抓取中的实战
【10月更文挑战第26天】动态网页抓取是网络爬虫的难点,因为数据通常通过JavaScript异步加载。Selenium通过模拟浏览器行为,可以加载和执行JavaScript,从而获取动态网页的完整内容。本文通过实战案例,介绍如何使用Selenium在Python中抓取动态网页。首先安装Selenium库和浏览器驱动,然后通过示例代码展示如何抓取英国国家美术馆的图片信息。
23 6
|
22天前
|
数据采集 Web App开发 数据可视化
Python爬虫教程:Selenium可视化爬虫的快速入门
Python爬虫教程:Selenium可视化爬虫的快速入门
|
1月前
|
测试技术 数据安全/隐私保护 开发者
自动化测试的奥秘:如何用Selenium和Python提升软件质量
【9月更文挑战第35天】在软件开发的海洋中,自动化测试是那艘能引领我们穿越波涛的帆船。本文将揭开自动化测试的神秘面纱,以Selenium和Python为工具,展示如何构建一个简单而强大的自动化测试框架。我们将从基础出发,逐步深入到高级应用,让读者能够理解并实现自动化测试脚本,从而提升软件的质量与可靠性。
|
2月前
|
Web App开发 测试技术 持续交付
自动化测试的利器:Selenium与Python的完美结合
【9月更文挑战第21天】在软件开发的世界里,测试是确保产品质量的关键步骤。随着敏捷开发和持续集成的流行,自动化测试工具变得尤为重要。本文将介绍如何使用Selenium和Python进行高效的自动化测试,不仅提供代码示例,还深入探讨如何设计测试用例、选择正确的测试框架、以及如何整合到CI/CD流程中。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。
44 3
|
3月前
|
Web App开发 数据可视化 Python
Python Selenium获取boss直聘招聘信息
Python Selenium获取boss直聘招聘信息
44 5
Python Selenium获取boss直聘招聘信息
|
3月前
|
数据采集 Python
如何用Python Selenium和WebDriver抓取LinkedIn数据并保存登录状态
本文介绍了使用Python Selenium和WebDriver库抓取LinkedIn数据的方法。首先,安装Selenium库和对应的WebDriver,然后配置爬虫代理IP以避免频繁请求被检测。接下来,设置user-agent和cookies以模拟真实用户行为,实现登录并保持状态。登录后,使用WebDriver抓取目标页面数据,如用户名、年龄、性别和简历信息。最后,强调了优化代码、处理异常和遵守使用条款的重要性,以提高效率并避免账号被封禁。
如何用Python Selenium和WebDriver抓取LinkedIn数据并保存登录状态
|
3月前
|
数据采集 人工智能 数据可视化
Python selenium爬虫被检测到,该怎么破?
Python selenium爬虫被检测到,该怎么破?
|
3月前
|
Web App开发 测试技术 API
自动化测试之美:使用Selenium和Python进行Web应用测试
【8月更文挑战第31天】在软件开发的快节奏世界中,自动化测试如同一束明灯,照亮了质量保证之路。本文将引导你通过Selenium和Python的强大组合,探索如何构建高效的Web应用测试框架。我们不仅会讨论理论,还会深入代码,从一个简单的示例开始,逐步扩展至更复杂的场景。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。让我们一同揭开自动化测试的神秘面纱,体验它的魅力所在。
|
3月前
|
Web App开发 XML 测试技术
自动化测试框架设计:以Python和Selenium为例
【8月更文挑战第31天】在软件开发的快节奏中,自动化测试成为确保产品质量的关键步骤。本文将引导读者了解如何结合Python语言和Selenium工具来设计一个高效的自动化测试框架。通过浅显易懂的语言和实际代码示例,我们将探索自动化测试框架的核心组件,并学习如何实现它们。无论你是测试新手还是希望提升自动化技能的开发者,这篇文章都将为你打开一扇通向高效软件测试的大门。