Download
对象由页面通过page.on(" Download ")事件分派
from playwright.sync_api import sync_playwright
with sync_playwright() as sp:
browser = sp.chromium.launch(headless=False)
context = browser.new_context(accept_downloads=True)
page = context.new_page()
# 代码实现
page.goto("https://www.runoob.com/try/try.php?filename=tryhtml5_a_download")
# Click download button
with page.expect_download() as download_info:
page.frame(name="iframeResult").click('img[alt="runoob.com"]')
download = download_info.value
# 等待下载完成,path为下载文件的存储路径,执行context.close()之后,下载的文件会被删除
path = download.path()
context.close()
browser.close()
- download.cancel(): 取消下载。如果下载已经完成或取消,则不会失败。成功取消后,
download.failure()
将解析为’canceled’ - download.delete(): 删除下载的文件,由于上下文关闭之后会自动删除,所以不常用
- download.failure(): 如果有,则返回下载错误
- download.page: 获取下载所属的页面
with page.expect_download() as download_info:
page.frame(name="iframeResult").click('img[alt="runoob.com"]')
download = download_info.value
path = download.path()
print(download.page)
# <Page url='https://www.runoob.com/try/try.php?filename=tryhtml5_a_download'>
- download.path(): 参考上述代码
- download.save_as(path): 将下载复制并重命名到用户指定的路径,在下载过程中调用此方法是安全的
with page.expect_download() as download_info:
page.frame(name="iframeResult").click('img[alt="runoob.com"]')
download = download_info.value
path = download.path()
download.save_as(path='./image.png')
- download.suggested_filename: 人为点击下载按钮得到的文件名
- download.url: 下载文件的url
看完上面的之后不知道是否还记得开始说的,Download
对象由页面通过page.on(" Download ")事件分派,看到下面代码之后就知道为什么没有用page.on()监听事件来分析download
from playwright.sync_api import sync_playwright
import time
with sync_playwright() as sp:
browser = sp.chromium.launch(headless=False)
context = browser.new_context(accept_downloads=True)
page = context.new_page()
# 代码实现
page.on("download", lambda download: print(download.page))
page.goto("https://www.runoob.com/try/try.php?filename=tryhtml5_a_download")
# Click text=点击此处访问 w3school.com.cn
page.frame(name="iframeResult").click('img[alt="runoob.com"]')
time.sleep(2)
context.close()
browser.close()
如果没有上面的等待时间,由于代码运行太快,可能下载放动作还没做出来,就直接关闭了上下文,可以自行测试