关于Playwright和Selenium 的区别和选择
在自动化测试领域,Selenium 和 Playwright 是两个非常受欢迎的工具。了解它们各自的优缺点对于选择合适的测试工具至关重要。本文将详细比较这两个工具。
Selenium 的优势
历史悠久
-
由于 Selenium 存在时间长,拥有一个庞大的用户社区和大量的学习资源,这意味着我们在使用过程中遇到的一些疑难杂症有着更方便的解决方案。
多语言支持
-
Selenium 支持多种编程语言,如 Java、C#、Python、Ruby 等,这使得不同背景的开发者都能使用它。
成熟的生态系统
-
Selenium 与许多现有的 CI/CD 工具和测试框架集成良好。
Selenium 的局限性
性能问题
-
Selenium WebDriver 启动浏览器实例的速度通常比 Playwright 慢。
浏览器支持
-
在某些情况下,Selenium 对浏览器的控制不如 Playwright 精细。如:并行运行测试、浏览器会话隔离等。
复杂性
-
Selenium 的测试脚本比 Playwright 更复杂,尤其是当涉及到多窗口或多标签页时。
Playwright 的优势
全面支持现代 Web 技术
-
Playwright 支持现代 Web 特性,如 Shadow DOM、现代 JavaScript 功能等。
快速启动和执行
-
快速启动和执行:Playwright 通常比 Selenium 启动更快,执行测试也更迅速。
易于编写及维护
-
Playwright 提供了简洁的 API,使得编写和维护测试脚本变得更加容易。
跨平台支持
-
Playwright 原生支持 Windows、Linux 和 macOS,无需额外配置即可在不同操作系统上运行。
自动录制测试过程
-
Playwright 可以自动录制测试过程,生成视频,便于分析和调试。
Playwright 的局限性
社区和资源
-
虽然 Playwright 的社区正在迅速增长,但与 Selenium 相比,可用的资源和社区支持可能较少。
学习曲线
-
学习曲线对初学者可能稍陡:对于习惯于 Selenium 的开发者来说,适应 Playwright 的 API 和概念可能需要一些时间。
针对以上的补充
在自动化测试工具的选择上,Selenium 和 Playwright 各有千秋,而决定使用哪一个往往取决于项目需求、团队技能、未来发展趋势以及测试复杂度,可以参考以下。
项目需求
-
如果项目需要高度定制化的测试,或者已经围绕 Selenium 建立了成熟的测试框架,继续使用 Selenium 可能是更稳定的选择。
-
对于重视跨浏览器一致性、测试效率和易用性的项目,Playwright 提供了更现代的解决方案。
团队技能
-
如果团队成员对 JavaScript 生态系统更熟悉,Playwright 可能是一个更受欢迎的选择,因为它提供了更丰富的 JavaScript/TypeScript API。
-
如果团队具有多种编程语言的背景,Selenium 的多语言支持(包括 Java、C#、Python、Ruby 等)可能更有优势。
未来发展趋势
-
考虑技术栈的长期发展和维护成本至关重要。Playwright 作为后起之秀,其设计理念更贴近现代 Web 开发,对于追求技术前沿和效率的团队,可能更具吸引力。
测试复杂度
-
对于需要大量模拟用户交互、网络条件变化等复杂场景的测试,Playwright 提供的高级 API 和内置功能可能更能满足需求。
小结啦~
选择 Selenium 还是 Playwright 取决于多种因素。Selenium 拥有成熟的社区和广泛的语言支持,适合已经建立在该工具上的项目和多语言团队。而 Playwright 以其现代化的 API、高性能和易用性,适合追求最新技术和简化测试流程的团队。
安装指南及常见问题解决
Playwright 是一个用于自动化跨浏览器测试的 Node.js 库,支持 Chromium、Firefox 和 WebKit,我们可以通过编写测试脚本,模拟用户在浏览器中的操作。
以下是Playwright的
一、安装步骤
1. 安装 Playwright 库
在终端或命令提示符中输入以下命令来安装 Playwright:
pip install playwright
如果安装速度比较慢,可以使用国内镜像源来加速安装过程。以下是一些国内常用的 Python 镜像源:
-
豆瓣:https://pypi.douban.com/simple/
-
阿里云:https://mirrors.aliyun.com/pypi/simple/
-
华中理工大学:https://pypi.hustunique.com/simple/
-
山东理工大学:https://pypi.sdutlinux.org/simple/
-
中国科学技术大学:https://pypi.mirrors.ustc.edu.cn/simple/
-
清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/
例如,使用阿里云镜像源安装 Playwright 的命令如下:
pip install playwright -i https://mirrors.aliyun.com/pypi/simple
二、启动Playwright
安装完成后,可以使用以下命令来启动 Playwright:
npx playwright install
-
下载浏览器:该命令会检查你的系统中是否已经安装了 Playwright 支持的浏览器版本,如果没有,它会自动下载所需的浏览器。
-
安装浏览器驱动:浏览器驱动程序(如 ChromeDriver 对于 Chromium、GeckoDriver 对于 Firefox)是允许 Playwright 与浏览器通信的程序。
npx playwright install
命令也会确保这些驱动程序是最新的,并且与 Playwright 的版本兼容。 -
设置环境:安装过程中,Playwright 会设置必要的环境变量,确保测试脚本能够找到浏览器的可执行文件和驱动程序。
-
无需手动操作:使用这个命令可以简化安装过程,你不需要手动下载和设置浏览器及其驱动程序。
如果只想安装指定的浏览器,可以使用以下命令。
以下命令将只安装 Chromium 浏览器及其驱动程序。
npx playwright install chromium
三、创建第一个Playwright脚本
在保证前面步骤均已成功后,创建一个名为 test.py
的文件,并添加以下代码:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch() # 启动浏览器
page = browser.new_page() # 打开新页面
page.goto('https://www.baidu.com') # 导航到网页
page.screenshot(path='example.png') # 截图,默认保存在当前文件目录
browser.close() # 关闭浏览器
默认情况下,headless
参数是 True
,这意味着浏览器将在无头模式下运行。如果希望启动一个可视化界面的浏览器窗口,可将其设置为 False
。,如下所示:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # 启动浏览器,非无头模式
page = browser.new_page() # 打开新页面
page.goto('https://www.baidu.com') # 导航到网页
page.screenshot(path='example.png') # 截图,默认保存在当前文件目录
browser.close() # 关闭浏览器
四、安装过程中的常见问题及解决方法
1、pip 安装错误
如果“pip install playwright”指令报错,常见的执行失败原因是下载依赖中断,此时需重新执行。
若 pip 版本过低导致获取相关依赖失败,可根据提示的指引执行以下命令自动升级 pip 到最新版本:
python.exe -m pip install --upgrade pip
2、playwright install 错误
“python -m playwright install”报错常见的执行失败原因包括安装中断,最常见的是网络问题,可能是当前网络状态不佳,可以尝试切换镜像源或网络环境好的时候重新反复执行。
3、Windows7 系统错误
在 Windows 7 系统中,执行“playwright install”可能会出现“无法找到入口 无法定位程序输入点 GetHostNameW 于动态链接库 WS2_32.dll 上”的错误。
解决方法是替换 Playwright 驱动下的 node.exe 版本,选择 win7 支持的版本,如 v12-13 版本,并将 node.exe 所在目录设置为环境变量 Path 中的变量。
4、.Node.js版本问题
当系统为 win7 时,执行“playwright install”可能会提示错误,原因是 win7 支持 node 的最高版本为 13.14.0,而 Playwright 要求 node 的版本必须高于 14,且 Playwright 下载的 node 版本为 16
locator 与 get_by_xxx 方法的应用
locator是 Playwright API 的核心组成部分,它在 Playwright 的所有语言绑定中都支持。是Playwright中最常用的方法。
一、通过案例了解locator 与 get_by_xxx
下面以百度搜索页为例,通过 Playwright 模拟打开百度,搜索“Playwright”操作的流程。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch() # 启动浏览器
page = browser.new_page()
page.goto("https://www.baidu.com/") # 打开百度界面
input_box = page.locator("#kw") # 通过id为“kw”的元素定位输入框
input_box.click() # 点击输入框
page.locator("#kw").fill("Playwright") # 输入“Playwright”
page.get_by_role("button", name="百度一下").click() # 点击查询按钮
browser.close() # 关闭浏览器
在以上案例中,我们使用了两种不同的方法来定义和操作页面元素:locator
方法和 get_by_xxx
快捷方法。这两种方法在内部都是用来创建定位器,然后用于元素的操作。它们在本质上没有太大的不同,只是在使用方式上有所区别。
1、locator方法
先让我们一起了解下关于元素操作部分的代码:
input_box = page.locator("#kw") # 通过id为“kw”的元素定位输入框
input_box.click() # 点击输入框
page.locator("#kw").fill("Playwright") # 输入“Playwright”
其中前两行代码都是通过 id 为“kw”进行元素定位。
在第2行代码 input_box.click()
中,使用的是直接获取赋值后的 input_box
变量进行操作。
在第3行代码中,直接通过 id="kw" 属性定位到元素后再进行操作。
由此可见,如果我们针对一个元素只需要进行单次操作,可以直接定位并赋予相关操作;但如果我们需要针对一个元素进行多次操作,通过 locator
方法创建一个定位器对象,用于后续的操作更为方便。
2、get_by_xxx 快捷方法
get_by_xxx
方法是 Playwright Python 语言特有的快捷方法。如案例中第10行代码所示:
page.get_by_role("button", name="百度一下").click()#点击查询按钮
这些快捷方法在内部使用 locator
创建定位器,然后执行相应的操作。它们提供了一种更简洁的方式来直接执行操作,而不需要事先创建一个定位器。
除了以上案例代码外,常用的 get_by_xxx
方法还包括:
-
get_by_xpath
:通过 XPath 定位元素。 -
get_by_css_selector
:通过 CSS 选择器定位元素。 -
get_by_text
:通过元素文本内容定位元素。 -
get_by_title
:通过元素的 title 属性定位元素。 -
get_by_placeholder
:通过元素的 placeholder 属性定位输入框。 -
get_by_label
:通过元素的 label 属性定位元素。 -
get_by_alt_text
:通过元素的 alt 属性定位元素。 -
get_by_display_value
:通过元素的 displayValue 属性定位元素。 -
get_by_role
:通过元素的角色(role)定位元素,例如按钮、链接等。
二、注意事项
-
确保 URL 正确无误,例如
"https://www.baidu.com/"
。 -
如果在访问网页时遇到问题,请检查网络连接是否稳定,并确保 URL 的合法性。
-
在自动化测试中,考虑添加错误处理和日志记录,以便在测试失败时能够追踪问题。
嗯~
你看完啦,这是结束语啦~
通过以上介绍,我们可以看到 Playwright 提供了灵活且强大的工具来执行自动化测试。无论是使用 locator
方法还是 get_by_xxx
快捷方法,都可以有效地定位和操作页面元素。
Playwright常用方法介绍
2个实际的示例,展示如何使用 Playwright 进行网页自动化操作,包括导航、鼠标操作、输入框操作、键盘操作以及如何在 iframe 中操作元素。
关于网页操作
针对网页的常用操作方法
page.reload()#刷新当前页面
page.go_to(url) #导航到新的URL地址
page.go_back()#回到历史记录中的上一个界面
page.go__forward() #前进到历史记录中的下一个界面
print(page.url)#打印当前网址
print(page.title())#打印网页标题
print(page.context)#刷新
实操一下,以下为案例部分
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # 启动浏览器
page = browser.new_page()
page.goto('https://www.baidu.com') # 打开百度
page.reload() # 刷新百度页面
page.goto('https://mail.163.com/') # 再进入163邮箱地址
page.go_back() # 通过回退,回到百度界面
print(page.url) # 打印百度网址
page.go_forward() # 通过前进,进入到163邮箱界面
print(page.title()) # 打印163邮箱网页标题
print(page.context) # 刷新163邮箱网页
常用的元素方法
常用的鼠标操作
-
page.click(selector, options): 点击指定选择器的元素。
-
page.dblclick(selector, options): 双击指定选择器的元素。
-
page.right_click(selector, options): 右键点击指定选择器的元素。
-
page.hover(selector, options): 将鼠标悬停在指定选择器的元素上。
-
page.focus(selector, options): 将焦点设置到指定选择器的元素上。这在填写表单或与页面上的可聚焦元素交互时非常有用。
-
page.selectOption(selector, values, options): 在
<select>
元素上选择一个或多个选项。
常用的输入框操作
-
page.fill(selector, text, options): 在指定选择器的输入框中填写文本。
-
page.locator(selector).clear(options): 清除一个输入框或文本区域的当前内容。
-
page.type(selector, text, options): 向指定选择器的元素发送文本输入,这包括处理键盘事件。
常用的鼠标操作
-
page.press(selector, key, options): 向指定选择器的元素发送一个键盘按键。
-
page.keyboard.type(text, options): 向页面发送一系列键盘按键。
-
page.keyboard.press(key, options): 模拟按下一个特定的键。
-
page.keyboard.down(key, options): 长按键盘上的一个键。
-
page.keyboard.up(key, options): 释放长按的键盘上的一个键。
常用的打印操作
-
print(page.locator(selector).get_attribute(name)): 打印指定选择器的元素的属性。
-
print(page.locator(selector).get_properties()[name]): 打印指定选择器的元素的多个属性。
-
print(page.locator(selector).text_content()): 打印指定选择器的元素的文本内容。
-
print(page.locator(selector).inner_html()): 打印指定选择器的元素的内部 HTML。
-
print(page.locator(selector).outer_html()): 打印指定选择器的元素的外部 HTML。
常用的frame操作方法
-
frame = page.frame_locator(selector): 获取一个
FrameLocator
对象,用于在 iframe 或 frame 中执行操作。 -
frame = page.frame_evaluate(expression): 在指定的 frame 中执行 JavaScript 表达式并返回结果。
常用的截图和PDF操作方法
-
page.screenshot(options): 对当前页面进行屏幕截图。
-
page.pdf(options): 将当前页面保存为 PDF 文件。
常用的网络操作方法
-
page.wait_for_response(url_or_predicate, options): 等待一个网络响应。
-
page.wait_for_request(url_or_predicate, options): 等待一个网络请求。
-
page.route(url, handler): 对网络请求进行拦截和修改。
常用的对话框操作方法
-
page.wait_for_dialog(options): 等待对话框出现。
-
dialog.accept(options): 接受对话框。
-
dialog.dismiss(options): 取消对话框。
-
dialog.value(): 获取对话框的值。
一个常用元素方法示例及代码解释
from playwright.sync_api import sync_playwright
import time
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # 启动浏览器,非无头模式
page = browser.new_page()
page.goto('https://mail.163.com/') # 进入163邮箱登录界面
page.hover("#lbApp")# 鼠标悬浮至二维码的位置
frame = page.frame_locator('//html//body//div[3]//div[3]//div[1]//div//div[3]//div[1]//div[2]//iframe')#切换至输入框所在的frame内
email_box=frame.get_by_placeholder('邮箱账号或手机号码')
email_box.fill('1111')#点击并输入邮箱地址
email_box.dblclick()# 双击邮箱账号输入框
email_box.focus()#焦点转移至邮箱账号输入框
#模拟剪切操作 Ctrl + X
page.keyboard.down('Control') # 按下 Control 键
email_box.press('x') # 按下 'x' 键
page.keyboard.up('Control') # 释放 Control 键
# 模拟剪切操作 Ctrl + V
page.keyboard.down('Control') # 按下 Control 键
email_box.press('V') # 按下 'x' 键
page.keyboard.up('Control') # 释放 Control 键
#输入密码
frame.get_by_placeholder('输入密码').first.fill('2222')
# 打印登录元素的class属性
print(frame.locator("#dologin").get_attribute('class'))
#等待3秒
time.sleep(3)
browser.close() # 关闭浏览器
代码解释
-
启动浏览器:
p.chromium.launch(headless=False)
启动一个 Chromium 浏览器实例,headless=False
表示以有头模式运行,这样可以直观地看到操作过程。 -
打开网页:
page.goto('https://www.baidu.com')
打开百度的首页。 -
刷新页面:
page.reload()
刷新当前页面。 -
导航操作:
-
page.goto('https://mail.163.com')
跳转到 163 邮箱登录页面。 -
page.go_back()
回退到历史记录中的上一个页面(百度首页)。 -
page.go_forward()
前进到历史记录中的下一个页面(163 邮箱登录页面)。
-
-
打印信息:
-
print(page.url)
打印当前页面的 URL。 -
print(page.title())
打印当前页面的标题。
-
-
鼠标操作:
-
page.hover("#lbApp")
将鼠标悬停在指定元素上。
-
-
切换 iframe:
frame = page.frame_locator('xpath=//iframe[@id="login-frame"]')
切换到包含登录表单的 iframe。 -
输入框操作:
-
email_box.fill('1111')
在邮箱输入框中填入账号。 -
email_box.dblclick()
双击邮箱账号输入框。 -
email_box.focus()
将焦点设置到邮箱账号输入框。
-
-
键盘操作:
-
模拟 Ctrl + X 剪切操作。
-
模拟 Ctrl + V 粘贴操作。
-
-
输入密码:
frame.get_by_placeholder('输入密码').first.fill('2222')
在密码输入框中填入密码。 -
打印属性:
print(frame.locator("#dologin").get_attribute('class'))
打印登录按钮的 class 属性。 -
点击登录:
frame.locator("#dologin").click()
点击登录按钮。 -
等待页面加载:
time.sleep(3)
等待 3 秒,确保页面加载完成。 -
关闭浏览器:
browser.close()
关闭浏览器实例。
最后
通过这个示例,我们可以看到 Playwright 提供了灵活且强大的工具来执行自动化测试。无论是模拟键盘操作还是处理 iframe,Playwright 都能轻松应对。希望这个示例能帮助你更好地理解和使用 Playwright 进行自动化测试。
Playwright常用的上下文管理器介绍
介绍 Playwright 中的常用上下文管理器及其应用场景,包括浏览器实例的创建与销毁、新页面的创建、新标签页的获取、对话框的处理、页面导航的等待、文件下载的监控、截图和视频操作等。
常用的上下文管理器介绍
创建和销毁浏览器实例:sync_playwright()
sync_playwright()作为最顶层的上下文管理器,用于创建和销毁Playwright的浏览器实例,它管理脚本的整个生命周期,是最常用的上下文管理器,一般和browser.new_context()搭配使用。
创建新的浏览器上下文:browser.new_context()
浏览器上下文是浏览器会话隔离环境,可以包含多个页面,确保页面之间的隔离。
以上两者的使用场景
在 Playwright 中,sync_playwright()
和 browser.new_context()
是基础的上下文管理器,它们提供了测试环境的初始化和浏览器上下文的创建。其他的上下文管理器,如 expect_page()
、expect_popup()
、expect_navigation()
等,都是在这两个基础上使用的。
举例:启动浏览器并创建页面
with sync_playwright() as p:#最顶层的上下文管理器
browser = p.chromium.launch(headless=False) # 启动浏览器,非无头模式
context = browser.new_context() # 在新的浏览器上下文创建页面
创建新界面:browser.new_page()
browser.new_page()可以在指定的浏览器上下文中创建一个新的页面。
使用场景:
-
当需要打开一个新的标签页进行操作时。
-
在需要并行处理多个页面或测试多个独立页面的场景中。
举例:打开百度
with sync_playwright() as p:#最顶层的上下文管理器
browser = p.chromium.launch(headless=False) # 启动浏览器,非无头模式
context = browser.new_context() # 在新的浏览器上下文管理器中创建页面
#--------------------以下是新增代码-----------------------------------------------
page = browser.new_page()#在新的页面执行操作 page.goto('https://www.zhibo8.com/')#在新的界面打开网页
获取新界面:context.expect_page()
context.expect_page()可以等待和获取当前页面操作触发的新页面。
使用场景:
-
当点击链接或按钮后需要处理新打开的标签页时。
-
在测试需要打开多个标签页并与之交互的功能时。
举例:获取通过点击界面元素产生的新界面并执行操作
with sync_playwright() as p:#最顶层的上下文管理器
browser = p.chromium.launch(headless=False) # 启动浏览器,非无头模式
context = browser.new_context() # 在新的浏览器上下文管理器中创建页面
page = browser.new_page()#在新的页面执行操作
page.goto('https://www.zhibo8.com/')#在新的界面打开网页
#--------------------以下是新增代码-----------------------------------------------
with context.expect_page() as new_page_info:
page.get_by_role('link', name='个人').first.click() #使用 first 方法选择第一个匹配的元素。
new_page=new_page_info.value#给新的界面赋到new_page
new_page.get_by_role('link',name='已购方案').click()#针对新界面进行操作
弹出框:expect_popup()
expect_popup()上下文管理器用于处理页面上的弹出窗口(如新标签页或新窗口)。当你准备打开一个新窗口或者标签页时,这个上下文管理器可以捕获这个新打开的页面
使用场景
-
打开新窗口或标签页:当网页上打开新的浏览器窗口或标签页时, expect_popup()可用于等待和获取这个新打开的窗口。
-
表单提交:在表单提交后,如果网页是通过
target="_blank"
打开新页面来显示结果,expect_popup()可用于等待新页面的出现。 -
广告或宣传窗口:当网页打开广告或宣传的新窗口时,expect_popup()可用于测试这些窗口是否按预期出现。
-
打印或下载页面:点击打印或下载链接时,
expect_popup()
可用于验证新窗口的行为。 -
测试弹窗应用:测试弹窗的显示和功能。
举例:在弹窗中输入文本操作
with page.expect_popup() as popup_info:
page.click('a#open-popup-link') # 点击一个打开新标签页的链接,预计会触发弹窗
popup = popup_info.value
if popup:
popup.fill('input[name="name"]', 'Playwright')#在弹窗中输入Playwright
popup.click('button#submit')#关闭弹窗
对话框:expect_dialog()
用于处理 JavaScript 产生的对话框,如 alert
、confirm
和 prompt
。
当你点击一个链接或提交表单后,需要通过浏览器加载新页面来完成操作的情况下,expect_navigation() 上下文管理器可以确保新的页面已经加载完成,再继续执行后面的代码,这样可以避免脚本和加载状态不同步的问题。
使用场景:
-
验证警告:验证测试网页上的警告消息是否正确显示。
-
确认操作:测试用户确认操作(如删除操作)是否按预期工作。
-
输入信息:在需要用户输入的对话框中自动填写信息。
举例:在对话框中输入文本
with page.expect_dialog() as dialog_info:
page.click('button#open-alert') # 点击一个打开 alert 对话框的按钮
dialog = dialog_info.value
if dialog:
dialog.accept("晚上好!有点困!") # 在对话框中输入文本
下载:expect_download()
expect_download()
上下文管理器用于处理通过模拟用户操作(如点击链接)触发的文件下载。
使用场景:
-
需要测试网站的下载功能时,如下载文件或文档。
-
在自动化测试中验证下载链接是否正确工作。
-
需要捕获和验证下载的文件名、大小、类型等属性。
举例:下载文件
with sync_playwright()as p: browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto("https://baidu.com") with page.expect_download()as download_info: page.click("a#download-link")# 假装这是下载链接 download = download_info.value if download:
print(f"下载文件:{download.url}") print(f"保存路径:{download.path}") print(f"文件名:{download.suggested_filename}") # 后续可以添加断言或其他验证逻辑 browser.close()
截图:expect_screenshot()
expect_screenshot()上下文管理器可用于执行截图操作前后的一些额外的逻辑,比如验证截图是否成功。
使用场景:一般用于获取截图的结果或进行断言。
举例:截图操作
with page.expect_screenshot()as screenshot_info:
#调用page.expect_screenshot触发截图操作
page.screenshot()
截图:expect_video()
expect_video()用于页面上的视频元素进行操作,确保视频元素已经存在于页面上,并且可以进行相关操作,如播放、暂停或检查视频属性。
使用场景
视频播放:测试网页上的视频是否能够正确加载和播放。
媒体内容测试:验证视频媒体内容是否按预期工作,例如自动播放、静音等。
视频控件测试:测试视频播放控件(如播放/暂停按钮、进度条)是否正常工作。
广告验证:验证视频广告是否按预期显示和行为。
举例:针对网页视频进行播放操作
with page.expect_video() as video_info:
page.click('#id4')#触发视频播放按钮
#获取视频元素信息
video=video_info.value
if video:
print('视频已经准备就绪,可以播放')
#下面可以进一步检查视频操作,比如视频时长、状态等。
duration = video.duration()
print(f'视频时长:{duration}秒')
browser.close()