一、文件上传

1、普通上传:将本地文件路径作为一个值放在input标签中,通过form表单将这个值提交给服务器
2、插件上传:一般是指基于Flash、JavaScript或Ajax等技术实现的上传功能。

  • 图片上传
from selenium import webdriver
import win32com.client
import time

# 创建浏览器驱动对象
driver = webdriver.Chrome("D:\\tool\selenium\chromedriver.exe")
# 访问网址
driver.get("https://tinypng.com/")

# # 对于 input 标签实现的文件上传功能,我们可以直接将其看做是一个输入框
# # 即可通过send_keys 指定本地文件路径的方式实现文件上传
# driver.find_element_by_css_selector("input[type=\"file\"]").send_keys("D:\\test\script\study\seleniumStu\day4\\all.png")

# 对于非 input 标签实现的上传功能,我们可以通过模拟键盘敲击的方式实现
# 注意:1、输入法必须为英文状态;2、操作期间,不要操作鼠标或键盘
# 触发文件上传的操作
driver.find_element_by_css_selector("figure.icon").click()
sh = win32com.client.Dispatch("WScript.shell")
time.sleep(3)
sh.Sendkeys("D:\\test\script\study\seleniumStu\day4\\all.png\r\n")

1.input标签

众所周知,input标签是可以直接send_keys的,
2.非input型上传

接下来难度要升级了,对于那些不是input框实现的上传怎么办,这种上传千奇百怪,有用a标签的,有用div的,有用button的,有用object的,我们没有办法通过直接在网页上处理掉这些上传,唯一的办法就是打开OS弹框,去处理弹框。

问题又来了,OS弹框涉及的层面已经不是selenium能解决的了,怎么办?很简单,用OS层面的操作去处理呗,到这里我们基本找到了问题的处理方法。
大体上有以下几种解决方案:

  1. autoIT,借助外力,我们去调用其生成的au3或exe文件。
  2. Python pywin32库,识别对话框句柄,进而操作
  3. SendKeys库
  4. keybd_event,跟3类似,不过是模拟按键,ctrl+a,ctrl+c, ctrl+v

二、文件下载

webdriver 允许我们设置默认的文件下载路径。也就是说文件会自动下载并且存在设置的那个目录中,下面以firefox及chrome为例

  1. Firefox下载
    为了让Firefox浏览器能实现文件下载,需要通过FirefoxProfile()对其做一些设置。

browser.download.foladerList :设置成0代表下载到浏览器默认下载路径,设置成2则可以保存到指定的目录。

browser.download.manager.showWhenStarting :是否显示开始:True为显示开始,Flase为不显示开始。

browser.download.dir :用于指定所下载文件的目录。

os.getcwd()函数不需要传递参数。用于返回当前的目录。

browser.helperApps.neverAsk.saveToDisk :对所给文件类型不再弹出框进行询问。

#!/usr/bin/env python
# -*- codinfg:utf-8 -*-
'''
from selenium import webdriver
import os,time
 
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",0)
fp.set_preference("browser.download.manager.showhenStarting",True)
fp.set_preference("browser.download.dir",os.getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","binary/octet-stream")#下载文件类型
 
driver = webdriver.Firefox(firefox_profile = fp)
driver.get("http://pypi.Python.org/pypi/selenium")
driver.find_element_by_xpath("//a[@id='files-tab']").click()
time.sleep(5)
 
#选择下载文件
driver.find_element_by_xpath("//a[contains(@href,'.tar.gz')]").click()
time.sleep(30)
 
driver.quit()
  • Chrome下载
    download.default_directory:设置下载路径
    profile.default_content_settings.popups:设置为0禁止弹出窗口
from selenium import webdriver
import time
 
options = webdriver.ChromeOptions()
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': 'd:\\'}
options.add_experimental_option('prefs', prefs)
 
driver = webdriver.Chrome(executable_path='F:\chromedriver\chromedriver.exe', chrome_options=options)
driver.get("http://pypi.Python.org/pypi/selenium")
driver.find_element_by_xpath("//a[@id='files-tab']").click()
time.sleep(5)
 
#选择下载文件
driver.find_element_by_xpath("//a[contains(@href,'.tar.gz')]").click()
time.sleep(30)
driver.quit()