python+playwright自动化如何解决文件上传问题

最近在使用python+playwright框架做网页UI自动化,该框架的录制功能很厉害和强大。录制后直接将录制的代码复制到python中,很方面和好用。

在使用该浏览器录制功能的时候,录制的文件上传代码运行不成功。

复制代码
page.locator("div").filter(has_text=re.compile(r"^\+$")).first.click()
page.locator("body").set_input_files("测试pdf文件.pdf")

无论怎样都识别不了并上传文件。

我在网上查询资料,找到了上传文件的第一种方法。

复制代码
# with page.expect_file_chooser() as fc_info:
#     page.locator("div").filter(has_text=re.compile(r"^\+$")).first.click()
# page.pause()
# file_chooser = fc_info.value
# file_chooser.set_files("/Users/zc/desktop/1.png")

这种方法可以成功的上传文件,但是在跑自动化的时候会自动弹出一个页面,需要手动在这个页面上点击启动按钮,才可以成功上传文件。这对于跑自动化不太友好。另外,对于多个文件的上传该功能也不好使用。

为解决文件上传定位不了的问题,使用page.set_input_files()函数来解决,set_input_files有selector和files参数。set_input_files只能使用于input标签中type="file"类型,selector是文件上传入口定位参数,files是上传文件的路径。打开网页使用f12来定位上传文件的前端代码元素。

<div data-v-15edcce14="" class="upload-box">

<input data-v-15edcce14="" type="file" id="upFile" accept="image/png, image/jpeg"><div data-v-12edcce8="" class="icon-before"><span data-v-12edcce8="">+</span></div></div>

尝试使用page.set_input_files('inputid="upFile"',"/Users/zc/desktop/1.png") 并测试,可以正常上传文件。

如果有多个文件上传,同时文件上传都是 type="file" id="upFile"的input类型的元素。此时我们可以观察其他参数是否不一样,如果不一样的话可以通过其他参数的定位并上传文件。

如果其他参数都一致如何解决问题呢?我们可以通过xpath或元素索引来定位并上传。下面我们讲通过索引来定位并上传文件的方法。

最开始我使用page.locator('inputid="upFile"'):nth-of-type(index).set_input_files("上传的文件")的方法来上传,但是识别不了上传的入口,尝试寻找识别不了的原因,暂时没有找出来。

page.locator('inputid="upFile"'):nth-of-type(1).set_input_files("/Users/zc/desktop/1.png")

page.locator('inputid="upFile"'):nth-of-type(2).set_input_files("/Users/zc/desktop/1.png")

然后我换了下面的索引方式来尝试,文件都可以对应的上传成功。

复制代码
page.locator('input[id="upFile"]').nth(0).set_input_files("/Users/zc/desktop/1.png")
相关推荐
镜子AI5 小时前
镜子AI 技术复盘:三条自动化链路上的“停止条件“设计
运维·人工智能·自动化
tianyuanwo5 小时前
NetBox 数据库详解:当“关系型数据库”被装进一个网络运维的领域模型里
运维·数据库·netbox
知已难寻7 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
huainingning8 小时前
Windows syslog日志服务器搭建与模拟器对接
运维·服务器·智能路由器
say_fall8 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
wacsii9 小时前
【Linux进程(一)】Linux 进程初探:操作系统如何管理进程?fork() 为什么返回两次?
linux·运维·服务器
相思难忘成疾9 小时前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes
PellyKoo9 小时前
【docker】cifs卷改smb密码后容器起不来的解决方法
运维·docker·容器
云飞云共享云桌面10 小时前
1台SolidWorks服务器如何承载10个设计并发?
运维·服务器·网络·3d·制造