搞定!(Java/Python) 跨平台(win/mac/linux)Selenium Web UI 非input标签 浏览器上传 本地文件的方法!

上传文件 场景描述

在使用selenium操作 web 做自动化的时候,我们会遇到以下一种常见的场景:

在这里插入图片描述
在上述图片场景中,我们发现,当我们点击了选择文件这个标签之后,它会默认打开本地的文件窗口,然后让我们通过这个窗口控件去选择你上传的文件。

此时这种场景根据 前端控件标签分为2种方式:

  • input 标签
  • 非input 标签

input标签

我们已百度搜索上传文件为例子,我们打开开发者模式,查看上传文件标签控件,我们发现如下所示:

在这里插入图片描述
我们发现我们上传文件的 标签是 input,因此针对 input 这种标签,自带属性,我们可以通过
selenium中的自带的 输入文本方法去解决 send_keys(文件路径),只需要上传文件路径即可。

以百度上传文件为例子:

import os
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from webdriver_manager.microsoft import EdgeChromiumDriverManager

# 文件路径
BASE_DIR = os.path.dirname(__file__)
file_path = BASE_DIR + os.sep + "1.png"

driver = webdriver.Edge(EdgeChromiumDriverManager().install())

driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
driver.maximize_window()

driver.find_element(By.CSS_SELECTOR, ".soutu-btn").click()
# 通过send_keys 方法 将需要的文件路径上传进去即可
driver.find_element(By.XPATH, "//input[@class='upload-pic']").send_keys(file_path)

time.sleep(10)

此种方式适合 前端 上传文件标签为 input 标签,如果是非input 标签,则不合适了。需要如下方式。

非 input 标签

如果是非 input 标签,则不能直接使用 selenium 自带的 send_keys 方法,那么该如何去做呢?
无外乎两种解决方式:

  • 利用第三方库进行快速上传
  • 模拟键盘操作,例如:ctrl + c 复制文件路径,ctrl + v 粘贴路径,enter 回车键表示确定

python 中解决非input标签的方法

pywinauto

Pywinauto 是一个用于自动化测试的 Python 模块,主要针对 Windows 标准图形界面。它允许你很容易地发送鼠标和键盘动作给 Windows 的对话框和控件,并可编程处理一系列针对窗口控件的动作,包括窗口的指定、鼠标或键盘操作、获得控件属性等等。

对于使用 Pywinauto,你需要先安装它,可以使用 pip(Python 的包管理器)进行安装。例如,可以通过在命令行中输入 pip install pywinauto 来安装。

以下是一些简单的使用示例:

  • 从命令行启动应用程序:
from pywinauto.application import Application  
app = Application().start("notepad.exe")
  • 在记事本程序中输入文本:
python复制代码

app.Notepad.Edit.type_keys('Hello{SPACE}World!')

这将在记事本中输入“Hello World!”。其中,“{SPACE}”表示按下空格键。

注意:如果 Windows 的默认输入法是中文,可能无法正常显示空格或中文。为了解决这个问题,可以在输入法设置中将其设置为英文。

总的来说,Pywinauto 提供了一种在 Python 中控制 Windows GUI 的方式,可以发送各种用户输入,包括鼠标点击、键盘输入等等,并且也提供了一些方法和属性用于获取和操作控件的属性。

用pywinauto来上传win本地的文件

edge打开是这样的:
在这里插入图片描述

谷歌打开是这样的:
在这里插入图片描述

上述两者打开窗口按钮不同,因此,元素也不同
edge 窗口底部是3个按钮,打开按钮排第二,google 底部是2个按钮,打开按钮排第一
因此:

一个是 Button1(谷歌) 一个是Button2(Edge)

如下:

def upload_file_by_pywinauto(file_path):
    """
    :param file_path: 需上传的文件路径
    :return:
    """
    # 使用pywinauto创建一个操作桌面窗口的对象
    app = pywinauto.Desktop()
    # 选择文件上传的窗口 窗口句柄默认为‘打开’
    dialog = app["打开"]
    # 文件上传的时间
    dialog["Edit1"].type_keys(file_path)
    time.sleep(1)
    dialog["Button1"].click()  #  如果是谷歌则是button1  如果是edge则是button2

百度文件上传

使用 pywinauto

import os
import time


import pywinauto
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from webdriver_manager.microsoft import EdgeChromiumDriverManager

driver = webdriver.Edge(EdgeChromiumDriverManager().install())

driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
driver