本文主要讲解,在selenium自动化中,实现文件上传的两种方式。

本章节实验的HTML代码:

<html>
<form action="http://baidu.com" target="" id="uploadForm" enctype="multipart/form-data"></form>
      <input id="file" type="file" name="file" />
      <input type="submit" name="submit" id="submit" value="upload" />
</form>
</html>

第一种方式是,使用send_keys来实现文件的上传

<input type="file">可以先定位到该元素,然后直接将文件的路径作为send_keys的参数

from selenium import webdriver
import time

if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.get(r"file:///E://Project//Selenium//upload.html")
    driver.maximize_window()
    ele =driver.find_element_by_id("file")
    ele.send_keys(r"E:\Project\Selenium\test.jpg") #此步骤中直接将文件的路径作为send_keys的参数传递
    time.sleep(3)
    driver.find_element_by_id("submit").click()

第二种方式是,点开Windows的窗口,使用 PyUserInput 库进行全局的鼠标键盘操作。

1.第一步需要安装PyUserInput,可以通过pip install PyUserInput直接安装,但是在安装过程中,提示需要首先安装PyHook。

PyHook只能离线安装,进入https://www.lfd.uci.edu/~gohlke/pythonlibs/  选择合适自己的版本

python selenium 文件上传 selenium怎么上传文件_python

比如 pyHook‑1.5.1‑cp27‑cp27m‑win32.whl 代表 pyHook的1.5.1版本 适用于python2.7版本 windows32位 

pyHook‑1.5.1‑cp27‑cp27m‑win_amd64.whl 代表 pyHook的1.5.1版本 适用于python2.7版本 windows64位 

下载好后,可以在cmd中,输入以下内容安装

pip install  pyhook-xxx-xxx.whl路径

2.安装pyhook后,再进行PyUserInput便可顺利完成。测试代码如下。

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
#PyMouse和PyKeyboard的使用,导入以下,而不是导入PyUserInput
from pymouse import PyMouse
from pykeyboard import PyKeyboard

if __name__ == '__main__':
    mouse = PyMouse()
    key =PyKeyboard()
    driver = webdriver.Chrome()
    driver.get(r"file:///E://Project//Selenium//upload.html")
    driver.maximize_window()
    ele =driver.find_element_by_id("file")
    ActionChains(driver).click(ele).perform()
    time.sleep(3)
    #点开Windows窗口后,光标就会自动在windows的输入栏内,可以直接进行全局输入
    key.type_string(r"E:\Project\Selenium\test.jpg")
    time.sleep(5)
    #输入后,再按回车
    key.press_key(key.enter_key)

 

总结:因为web的代码无法操作Windows的窗口,所以衍生出了两种方式,一种直接调API,一种进行系统层面的全局操作。当然,能用第一种尽量用第一种,方便简单。如果实在无法,也可以使用第二种方式

第二种方式,因为是在全局进行操作,所以也可以应用在其他C/S上的测试,这个问题,以后再细说吧

我走的很慢,但从不后退