上传文件
WebDriver无法操作Windows控件,所以,一般通过以下两种方式实现文件上传:
- 普通上传:把本地文件路径作为一个值放在input标签中,通过form表单将这个值提交给服务器。 input标签可以直接通过send_keys(文件地址)上传文件。
- 插件上传:一般是指基于Flash、JavaScript或Ajax等技术实现的上传功能。工具:AutoIt。
举例:如果能找到上传的input标签,那么基本可以通过send_keys()方法输入一个本地文件路径实现上传
import os
from selenium import webdriver
file_path = os.path.abspath('./files/')
#这里测试的页面(upfile.html)和上传的文件(test.txt)位于与当前程序同目录的files/目录下
driver = webdriver.Chrome()
upload_page = 'file:///' + file_path + 'upfile.html'
driver.get(upload_page)
#定位上传按钮,添加本地文件
driver.find_element_by_id("file").send_keys(file_path + 'test.txt')
下载文件
webdriver允许我们设置默认的文件下载路径。
firefox浏览器下载文件:
webdriver.FirefoxProfile():为了能在FireFox浏览器中实现文件的下载,我们需要通过FirefoxProfile()对其做一些设置。selenium启动firefox,如果不指定profile文件,将只能使用firefox默认配置,无法进行浏览器定制,比如不显示图片,启动广告插件等,你必须得自己配置profile,让selenium用指定配置启动。
browser.download.folderList:0:下载到浏览器默认的下载路径,2:下载到指定目录
browser.download.dir:指定下载路径
browser.download.manager.showWhenStarting:在开始下载时是否显示下载管理器
browser.helperApps.neverAsk.saveToDisk:指定要下载的类型,binary/octet-stream二进制类型
import os
from selenium import webdriver
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.downloadList", 2) # 下载到指定目录
# os.getcwd()获取当前文件的所在位置,即下载文件保存的目录
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("https://pypi.org/project/selenium/#files")
driver.find_element_by_partial_link_text("selenium-3.141.0.tar.gz").click()
Chrome浏览器下载文件:
import os
from selenium import webdriver
options = webdriver.ChromeOptions()
# 0禁止弹出下载窗口
# download.default_directory设置下载路径
prefs = {
"profile.default_content_settings.popups": 0,
"download.default_directory": os.getcwd()}
options.add_experimental_option("prefs",prefs)
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://pypi.org/project/selenium/#files")
driver.find_element_by_partial_link_text("selenium-3.141.0.tar.gz").click()