Playwright是一个现代化的自动化测试工具,它支持多种浏览器和操作系统,可以帮助开发人员和测试人员轻松地构建和运行可靠的端到端测试。除了测试功能之外,Playwright还提供了一些实用工具和API,其中包括文件上传和下载的功能。这些功能可以帮助用户模拟用户上传或下载文件的场景,并验证这些操作是否按预期执行。在本文中,我们将探讨如何在Playwright中实现文件上传和下载,并提供一些示例代码和最佳实践。
比如平台上面的上传功能,会提供一个模板(如excel,csv),此时,我们就需要下载这个模板,修改完成后,再上传,作为测试人员,我们需要验证它是否已下载到本地。
01 文件上传
文件上传分为input和非input元素,对于input元素上传文件的,我们之前有讲解过,可以参考:新一代最强开源UI自动化测试神器Playwright(Java版)页面元素交互。
非input元素的文件上传,意味着没有类型为file的元素,我们必须使用filchooser方法。我们使用fileChooser.setFiles()方法设置需要上传的文件,只需要输入文件路径+文件名即可。
// 点击 Select files按钮
FileChooser fileChooser = page.waitForFileChooser(() -> page.getByRole(AriaRole.LINK, new Page.GetByRoleOptions().setName("[Select files]")).click());
// 输入要上传的文件路径+文件名
fileChooser.setFiles(Paths.get("src/main/resources/R-C.jpg"));
// 点击 Upload files 按钮上传文件
page.getByRole(AriaRole.LINK, new Page.GetByRoleOptions().setName("[Upload files]")).click();
02 文件下载
对于页下载的每个附件,都会发出Page.onDownload(handler)事件。所有这些附件都下载到一个临时文件夹中。你可以使用事件中的Download对象获取下载URL、文件系统路径和有效负载流。
Playwright下载文件非常简单,我们只需要将调用下载的click方法作为一个Runnable回调函数传递到Page类的waitForDownload()方法中。waitforDownload()执行所需的操作并等待下载完成,如果在触发下载事件之前关闭页,则会下载失败。waitForDownload()方法返回一个Download对象。下载完成后,我们可以从这个生成的Download对象中获取下载的详细信息。下载完成后,下载路径将变为可用。
Download download = page.waitForDownload(() -> {
page.getByRole(AriaRole.LINK, new Page.GetByRoleOptions().setName("LambdaTest.txt")).click();
});
具体代码如下
import com.microsoft.playwright.*;
import com.microsoft.playwright.options.AriaRole;
import java.nio.file.Paths;
import java.util.Arrays;
/**
* @author 作者:测试工程师成长之路
* @version 创建时间:2023/7/2
* 类说明:下载文件
*/
public class DownloadTest {
public void downloadTest() {
try (Playwright playwright = Playwright.create()) {
Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions()
.setArgs(Arrays.asList("-start-maximized"))
.setChannel("chrome")
.setHeadless(false));
BrowserContext context = browser.newContext(new Browser.NewContextOptions().setViewportSize(null));
Page page = context.newPage();
page.navigate("https://the-internet.herokuapp.com/download");
Download download = page.waitForDownload(() -> {
page.getByRole(AriaRole.LINK, new Page.GetByRoleOptions().setName("LambdaTest.txt")).click();
});
// 输出结果:文件下载链接:https://the-internet.herokuapp.com/download/LambdaTest.txt
System.out.printf("文件下载链接:%s%n",download.url());
// 获取下载所属的页面
System.out.printf("获取下载所属的页面:%s%n",download.page());
// 返回下载页面标题
System.out.printf("获取要下载的文件名:%s%n",download.page().title());
// 取消下载
download.cancel();
// 返回下载失败,如 cancel
System.out.printf("文件下载失败:%s%n",download.failure());
// 返回此下载的建议文件名。它通常由浏览器从 Content-Disposition 响应头或 download 属性计算。
// 查看whatwg的规范。不同的浏览器可以使用不同的逻辑来计算它。
System.out.printf("获取下载所属的页面:%s%n",download.suggestedFilename());
// 返回文件的临时保存路径:/var/folders/z9/cgrwh_ln7w31pj_j3wj791bh0000gn/T/playwright-artifacts-qit3Fe/3ea564b4-1d4b-4801-b359-e2a6b9b7592d
System.out.printf("文件下载保存路径:%s%n",download.path());
// 为下载的文件指定保存路径
download.saveAs(Paths.get("src/main/resources/LambdaTest.txt"));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
DownloadTest download = new DownloadTest();
download.downloadTest();
}
}
Playwright相对于Selenium,上传和下载文件是非常方便的,无需借助第三方工具,大家可以在实际项目中灵活应用。
行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!