详解Playwright中 With as 的用法

开发 前端
代码后面的语句 print("---- end ----") 并没有执行,这就说明程序发生了异常,执行了__exit__ 以后,程序就退出了!为什么呢?还记得前面讲过的知识点吗?

大家在做playwright自动化测试时,一定会遇到下面的写法

with sync_playwright() as p:
         自动化代码

很多同学可能只是按照这种写法来编写项目的自动化测试代码,对于具体细节可能并不了解,今天我来结合playwright讲解一下 Python中的 with ... as 用法。建议大家拷贝文档中的脚本实际运行一下,学习的效果会更好!

with ... as 概述

在Python中,with语句用于异常处理,使代码更简洁、可读性更强。它简化了文件流等公共资源的管理。基础表达式如下:

with 表达式a [as target]:
        代码块

在上面的表达式中, [as target] 中的部分可以省略。其中,target 参数用于指定一个变量,该语句会将表达式a指定的结果保存到该变量中,我们可以通过with ... as 操作上下文对象。具体实现方法是为一个类定义__enter__和__exit__两个函数。

with 表达式a [as target] 的执行过程是首先执行__enter__ 函数,它的返回值会赋给as后面的target,如果不写as target,返回值会被忽略;然后开始执行代码块中的语句;最后不论执行成功或者失败都会执行__exit__函数,为了更好的理解其运行原理,请参考下面的详细代码解释:

with obj as f:
      f.method(...)
# obj 表示一个对象(或是一个表达式, 结果为一个对象)
# 调用 obj 对象的 __enter__ 方法, 返回值赋值给 as 右边的变量 f,即: f = obj.__enter__()
# 执行 with 代码块中的代码 f.method(...)
# 执行完 with 代码块中的代码后, 无论是否发生异常, 调用 obj 的 __exit__ 方法,即: obj.__exit__(...)

上面的过程其实等价于

obj = ...
f = obj.__enter__()
try:
    # f.method(...)
finally:
    obj.__exit__(...)

注意这里是 try finally 而不是 try except!!!

with ... as 实例

下面举一个例子,让大家了解一下,with真正强大之处——它可以处理异常。

class WithSample:

    def __enter__(self):
        print("__enter__()")
        return self

    def __exit__(self, type, value, trace):
        print(  "__exit__()")
        print( "type:", type) #输出type值
        print( "value:", value) #输出value值
        print("trace:", trace) #输出trace值

    def do_something(self):
        num = 1 / 0 #模拟异常出现
        return num + 1

with WithSample() as sample:
    sample.do_something()

print("---- end ----") #这句话很有用!

输出:

Traceback (most recent call last):

File "C:/Users/Administrator/PycharmProjects/playwright/demo2.py", line 19, in <module>

sample.do_something()

File "C:/Users/Administrator/PycharmProjects/playwright/demo2.py", line 13, in do_something

num = 1 / 0

ZeroDivisionError: division by zero

__enter__()

__exit__()

type: <class 'ZeroDivisionError'>

value: division by zero

trace: <traceback object at 0x000002C7FE590288>

从上面代码我们得知,在with后面的代码块会首先执行__enter__方法的值,然后在抛出任何异常时,_exit__方法都会被执行,并输出type、value和trace的值。

一个容易被忽略的问题

这里需要注意一下,代码后面的语句 print("---- end ----") 并没有执行,这就说明程序发生了异常,执行了__exit__ 以后,程序就退出了!为什么呢?还记得前面讲过的知识点吗?

这里划重点!with obj as f 等价于try ... finally,而不是 try ... except... finally

最后补充一句!如果想捕获 with as 的异常,我们仍然需要使用try ... except... finally

try:
    with api  as f:
          #business as usual
except Exception as e:
          #handle exception
责任编辑:武晓燕 来源: 今日头条
相关推荐

2023-12-12 13:55:00

Pythonsubprocess命令

2020-12-07 13:48:48

EditorAndroid开发者

2009-08-11 10:45:58

linux中du命令参linux命令行参数linux命令行

2009-05-12 10:55:06

SQLFOR XML模式

2010-10-09 09:56:51

JavaScriptObject对象

2010-09-07 16:46:59

CSSexpression

2010-09-08 13:01:20

atCSS

2023-04-27 11:06:54

Chromium开源项目

2009-12-02 19:56:33

PHP中try{}ca

2010-08-26 11:01:00

ulliCSS

2009-08-03 11:54:34

linux at命令linux at命令详cron

2023-12-21 13:59:41

2024-03-19 14:18:48

C#后端编程

2015-04-07 10:31:31

PHPMySQLBuffer用法

2010-05-24 18:32:16

SVN中tag bra

2011-08-15 11:37:20

iPhone开发Mask

2011-08-03 13:11:10

Oracle数据库序列

2011-08-03 17:18:58

iPhone UILabel UISlider

2010-08-23 09:11:18

padding-bot

2010-08-20 16:29:01

padding-lef
点赞
收藏

51CTO技术栈公众号