前言
上篇文章我们介绍了使用playwright下载文件的方法,本篇文章我们将介绍使用playwright上传文件。
上传文件是我们经常需要面对的场景,如果我们使用的是selenium,那我们的操作会比较复杂,因为有的文件上传是input控件,有些是需要我们直接传文件地址,一旦弹出文件选择框的话,selenium就无能为力了,而playwright能很好地帮我们解决这个问题。
文件上传
playwright提供了locator.set_input_files()方法选择要上传的输入文件,它期望第一个参数指向 <input > 的输入元素"file",数组中可以传递多个文件,如果某些文件路径是相对的,则它们将相对于当前工作目录进行解析。空数组清除所选文件。
代码语言:python代码运行次数:0复制# 选择一个文件
page.get_by_label("Upload file").set_input_files('myfile.pdf')
# 选择多个文件
page.get_by_label("Upload files").set_input_files(['file1.txt', 'file2.txt'])
# 移除所有文件
page.get_by_label("Upload file").set_input_files([])
# 从缓存中上传
page.get_by_label("Upload file").set_input_files(
files=[
{"name": "test.txt", "mimeType": "text/plain", "buffer": b"this is a test"}
],
)
如果没有输入元素(它是动态创建的),可以使用 page.on("filechooser") 事件或在您的操作中使用相应的等待方法:
代码语言:python代码运行次数:0复制with page.expect_file_chooser() as fc_info:
page.get_by_label("Upload file").click()
file_chooser = fc_info.value
file_chooser.set_files("myfile.pdf")
相关操作:
- file_chooser.element 返回与此文件选择器关联的输入元素
- file_chooser.is_multiple() 返回此文件选择器是否接受多个文件
- file_chooser.page 返回此文件选择器所属的页面
设置与此选择器关联的文件输入的值。如果其中一些filePaths是相对路径,那么它们将相对于当前工作目录进行解析。对于空数组,清除所选文件
代码语言:python代码运行次数:0复制file_chooser.set_files(files)
file_chooser.set_files(files, **kwargs)
相关参数
- files pathlib.Path
- no_wait_after 启动导航的操作正在等待这些导航发生并等待页面开始加载。您可以通过设置此标志来选择退出等待。您仅在特殊情况下才需要此选项,例如导航到无法访问的页面。默认为false.
- timeout 以毫秒为单位的最长时间,默认为 30 秒,传递0以禁用超时,可以使用browser_context.set_default_timeout()或page.set_default_timeout()方法更改默认值
实例
下面我们分情况来介绍playwright上传文件的方法。
- input 输入框,并且类型是type="file",如下图所示:
我们可以直接定位输入框,用set_input_files('myfile.pdf') 方法上传文件路径,类似于selenium的send_keys('文件路径.xx')
代码语言:python代码运行次数:0复制 page.goto("*****l")
page.get_by_label("文件名称").fill("xxxx")
# 不点开文件框的情况下
page.get_by_label("选择文件").set_input_files('xxx.png')
- 不是input输入框,必须点开文件框的情况(selenium上没法实现的操作)
可以使用page.expect_file_chooser() 监听到弹出框,在弹出框上输入文件路径,代码如下:
代码语言:python代码运行次数:0复制with page.expect_file_chooser() as fc_info:
page.get_by_label("选择文件").click()
page.pause()
file_chooser = fc_info.value
file_chooser.set_files(path)
在运行过程中你是感知不到文件选项框弹出来的
异步代码示例:
代码语言:python代码运行次数:0复制async with page.expect_file_chooser() as fc_info:
await page.get_by_text("Upload file").click()
file_chooser = await fc_info.value
await file_chooser.set_files("myfile.pdf")
高级操作-事件监听filechooser
当应该出现文件选择器时触发此操作,例如在单击“选择文件”.未选择文件,可以通过使用file_chooser.set_files()设置输入文件来响应它,之后可以上传这些文件
代码语言:python代码运行次数:0复制page.on("filechooser", lambda file_chooser: file_chooser.set_files(r"C:XXXX.txt"))
# 点击选择文件按钮,会触发 filechooser 事件
page.get_by_label("选择文件").click()
注:page.on("filechooser", ) 会自动监听filechooser 事件,只要有点击了选择文件按钮,就会自动触发
实例
代码语言:python代码运行次数:0复制from playwright.sync_api import Playwright, sync_playwright, expect
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://sahitest.com/demo/php/fileUpload.htm")
page.get_by_label("File:").click()
page.get_by_label("File:").set_input_files("test.txt")
page.locator("form[name="form1"]").get_by_role("button", name="Submit Single").click()
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
总结
本文主要介绍了playwright对于文件的上传处理,playwright相对于selenium最大的优势就是可以直接处理Windows的文件选择框,这个对于我们的自动化测试是一个巨大的优势。