📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


Python中的链式调用(Method Chaining),也称为方法链式调用,是一种编程风格,其中一个对象的方法在执行完毕后返回该对象本身(通常是self),从而允许你在一个单独的表达式中连续调用多个方法。

这种风格使得代码更加简洁,并且能够以一种流畅的接口风格(Fluent Interface)编写代码。

下面介绍Python中的一些链式调用。

01 链式调用与列表推导式

虽然严格来说列表推导式不是一种方法链,但可以看作是一种链式操作,因为它将多个操作(过滤和映射)压缩成一行代码。

# 原始列表
numbers = [1, 2, 3, 4, 5, 6]

# 链式调用:过滤和映射
squared_evens = [x ** 2 for x in numbers if x % 2 == 0]

print(squared_evens)  
# 输出: [4, 16, 36]

有时候,你可能想要在推导式中使用链式方法调用,但这需要一些技巧,因为推导式不支持直接的链式调用。不过,你可以使用map和filter函数来实现类似效果:​​​​​​​

# 使用map和lambda表达式来实现链式调用的效果
strings = ['hello', 'tester', 'work', 'is', 'testing']
upper_case_lengths = list(map(lambda s: len(s.upper()), filter(lambda s: s != 'is', strings)))

print(upper_case_lengths)
# 输出: [5, 6, 4, 7]

在这个例子中,我们首先使用filter来过滤掉字符串'is',然后使用map和lambda表达式来计算剩余字符串转换为大写后的长度。

02 字符串方法

字符串对象提供了许多方法,这些方法返回一个新的字符串对象,因此可以进行链式调用。​​​​​​​

s = "   Hello, Tester!   "
# 链式调用:去除首尾空格、转换为大写、替换字符
new_s = s.strip().upper().replace("HELLO", "您好")

print(new_s)
# 输出: 您好, TESTER!

上面介绍了Python内置的或可以通过一些技巧达到链式调用效果的链式表达式。其实在一些第三方库中也可以经常看的他的身影。

03 Pandas库中的链式调用

Pandas是一个数据分析库,它提供了许多可以链式调用的方法。​​​​​​​

import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3, 4],
    'B': [4, 5, 6, 7]
})
# 选择列、过滤行、求和
sum_b = df[df['A'] % 2 == 0]['B'].sum()

print(sum_b)
# 输出: 12

上面示例是求出列A中为偶数的行对应的列B的值的总和。

过程是先计算列A中每个元素是否为偶数,结果是一个布尔Series,然后使用布尔索引来选择A列为偶数的行,接着选择过滤后的B列,最后计算B列中所有值的总和。

04 Playwright 库中的链式调用

Playwright是一个由微软开发的开源自动化测试工具,用于测试网页应用。他也有很多链式调用的方法。​​​​​​​

from playwright.sync_api import sync_playwright

playwright = sync_playwright().start()
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://www.baidu.com")

# 定位 form 标签、定位 id=su 元素、查找含有“百度一下”文字的元素、取满足条件的第一个、点击一下
page.locator('form').locator('#su').filter(has_text="百度一下").first.click()

browser.close()
playwright.stop()

如上示例,在百度首页点击百度一下按钮时就使用到了链式调用。

首先定位 form 标签元素,然后在 form 标签元素下定位 id=su 元素, 再接着使用filter通过文本内容对查找到的元素进行过滤,最后再取所有符合要求的元素的第一个并点击一下。

了解了链式调用的概念和示例,接下来自定义一个链式调用类。在写代码时需要确保类中的每个方法在执行完毕后返回类实例本身(self)。

示例如下:​​​​​​​

from playwright.sync_api import sync_playwright, Page

class TestBrowser:
    def __init__(self, page: Page):
        self.page = page

    def navigate_to(self, url):
        self.page.goto(url)
        # 返回自身以支持链式调用
        return self

    def find_element(self, selector):
        element = self.page.locator(selector)
        # 实例中添加找到的元素
        self.__setattr__('element', element)
        # 返回自身以支持链式调用
        return self

    def click(self):
        self.element.click()
        # 返回自身以支持链式调用
        return self

    def fill(self, text):
        self.element.fill(text)
        # 返回自身以支持链式调用
        return self

    def press(self, key):
        self.element.press(key)
        # 返回自身以支持链式调用
        return self

playwright = sync_playwright().start()
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()

page = TestBrowser(page)
# 使用链式调用
page.navigate_to('http://www.baidu.com').find_element('#kw').fill('Tester').press('Enter')

browser.close()
playwright.stop()

上述代码是一个使用Playwright进行自动化测试的Python脚本。

定义了一个TestBrowser类,该类封装了Playwright的一些基本操作,以支持链式调用。

TestBrowser类的构造函数接受一个Page对象,并将其保存在实例变量self.page中。

封装了navigate_to方法使页面打开指定的URL,并返回self以支持链式调用;

封装了find_element方法查找页面上的元素,并将其保存在实例变量self.element中,然后返回self以支持链式调用;

封装了click方法来点击之前找到的元素,并返回self以支持链式调用;

封装了fill方法,在之前找到的元素中填充文本,并返回self以支持链式调用;

封装了press方法来模拟按键操作,并返回self以支持链式调用。

最后通过一行代码

page.navigate_to('http://www.baidu.com').find_element('#kw').fill('Tester').press('Enter') 使用链式调用来导航到百度首页,找到搜索框,填充文本"Tester",然后模拟按下回车键。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​​

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐