Skip to content

🚤 文件上传

上传文件有两种方式:

  • 找到<input>元素,填入文件路径

  • 拦截文件输入框,自动填入路径

✅️️ 传统方式

第一种是传统方式,需要开发者在 DOM 里找到文件上传控件,然后用元素对象的input()方法填入路径。

文件上传控件是type属性为'file'<input>元素进行输入,把文件路径输入到元素即可,用法与输入文本一致。

稍有不同的是,无论clear参数是什么,都会清空原控件内容。

如果控件支持多文件上传,多个路径用listtuple或以\n分隔的字符串传入。

upload = page('tag:input@type=file')

# 传入一个路径
upload.input('D:\\test1.txt')

# 传入多个路径,方式 1
paths = 'D:\\test1.txt\nD:\\test2.txt'
upload.input(paths)

# 传入多个路径,方式 2
paths = ['D:\\test1.txt', 'D:\\test2.txt']
upload.input(paths)

如果<input>元素很好找,这种方式是很简便的。

有些<input>是临时加载的,或者经过修饰隐藏很深,找起来很费劲。

万一有些上传是用 js 控制的,这种方式未必能奏效。

✅️️ 更自然的交互

本库提供一种更自然的文件上传方式,无须在 DOM 里找控件,只要自然地点击触发文件选择框,程序就能主动截获,并填写设定好的路径,开发更省事。

步骤:

  • 设置要上传的文件路径,多路径传入listtuple或以\n分隔的字符串

  • 点击会触发文件选择框的按钮

  • 调用等待录入语句,确保输入完整

示例:

# 设置要上传的文件路径
page.set.upload_files('demo.txt')
# 点击触发文件选择框按钮
btn_ele.click()
# 等待路径填入
page.wait.upload_paths_inputted()

点击按钮后,文本选择框被拦截不会弹出,但可以看到文件路径已经传入其中。

由于此动作是异步输入,须显式等待输入完成才进行下一步操作。

📌 注意事项

如果您要操作的上传控件在一个异域的<iframe>,那必须用这个<iframe>对象来设置上传路径,而不能用页面对象设置。

❌ 错误做法:

page.set.upload_paths('demo.txt')
page.get_frame(1).ele('@type=file').click()
page.wait.upload_paths_inputted()

⭕ 正确做法:

iframe = page.get_frame(1)
iframe.set.upload_paths('demo.txt')
iframe.ele('@type=file').click()
iframe.wait.upload_paths_inputted()

如果<iframe>和主页面是同域的,则用域名对象和<iframe>对象设置均可。