如何使用Selenium Python下载文件

890 阅读14分钟

尽管Firefox和Chrome等浏览器已经使下载文件变得更容易,但这些下载取决于用户访问网站并手动点击下载按钮。如果用户对下载多个文件感兴趣,这可能是一个问题。

通过自动化下载文件的任务,你可以节省时间和精力,并专注于重要的功能。然而,有各种方法可以做到这一点。

Python和Selenium的结合为自动执行各种任务提供了许多机会,如点击、输入、悬停和下载文件。将Selenium与Python结合使用,可以通过识别和点击下载按钮来实现下载文件这一过程的自动化。

在这个Selenium Python教程中,我将向你展示如何用Selenium WebDriver和Python使用unittest测试框架来下载文件。然后你可以下载任何类型的文件,并将其保存在一个特定的文件夹中。

那么,让我们开始吧!

测试环境设置

你需要在我们的机器上安装unittest框架、Selenium和不同的浏览器驱动。在这篇关于如何使用 Selenium Python 下载文件的博客中,我们将考虑在 Chrome、Firefox 和 Safari 上运行我们的测试。

什么是 unittest 框架?

unittest测试框架最初是受 JUnit 的启发,其味道类似于其他语言的主要单元测试框架。这是Python软件包提供的默认Python测试框架,因此,大多数开发者都是用它来开始他们的测试。它也可以用于测试自动化、集合聚合等。

安装 unittest 框架

为了让unittest安装在我们的机器上,我们首先需要安装Python。

但要确保你的机器上有Homebrew,因为在这个关于如何使用Selenium Python下载文件的教程中,我们将使用MacOS操作系统。

  1. 在你的终端中输入以下命令。
brew install Python

Python的安装应该是这样的

brew install Python

  1. 一旦你安装了它,确保你的机器上已经安装了Python,在终端键入。
Python --version

Python3 --version

Python installed

  1. 接下来,你需要在我们的机器上安装Selenium。要做到这一点,我们将使用get-pip.py安装pip。

这是一个Python脚本,使用一些引导逻辑来安装pip

  • bootstrap.pypa.io/get-pip.py 下载该脚本。
  • 打开一个终端/命令提示符,cd到包含get-pip.py文件的文件夹,然后运行。
python3 get-pip.py
  • 在你的终端输入,检查pip是否已安装
pip3 --version

get-pip.py

  1. 一旦pip被安装,你可以用同样的方法安装Selenium。
pip install selenium

或者根据你的权限。

sudo pip install selenium

对于Python3。

sudo pip3 install selenium
  1. 添加浏览器驱动程序。WebDriver是一个开源的工具,用于在许多浏览器上自动测试网络应用。它提供了浏览网页、用户输入、执行JavaScript等方面的功能。

我们将用Google Chrome、Mozilla Firefox和Safari浏览器运行测试,用Selenium Python下载文件。

在你的终端键入以下命令。

brew cask install chromedriver

ChromeDriver 将帮助我们在谷歌浏览器中运行我们的测试。没有它,就不可能在谷歌浏览器中运行Selenium测试脚本并实现任何网络应用的自动化。这就是为什么你需要ChromeDriver来在Google Chrome浏览器上运行测试案例。

安装完成后,通过输入命令检查ChromeDriver是否已经安装。

chromeDriver -v

brew cask install chromedriver

  1. 现在我们来安装GeckoDriver,这是一个由Mozilla基金会和Mozilla公司开发的许多应用程序中使用的网络浏览器引擎。GeckoDriver是你在Selenium中的测试和Firefox浏览器之间的联系。
brew cask install geckodriver

通过输入命令来检查GeckoDriver是否已经安装。

geckodriver -v

geckodriver -v

然而,如果测试将在LambdaTest这样的云Selenium网格上执行,则不需要安装浏览器驱动程序。

LambdaTest是一个基于云的跨浏览器测试平台,它为你提供了一个由3000多种浏览器和操作系统组合组成的在线浏览器农场,以大规模地进行跨浏览器兼容性测试。

你也可以订阅LambdaTest的YouTube频道,随时了解围绕自动化浏览器测试Selenium测试Cypress E2E测试、CI/CD等的最新教程。

使用Selenium Python下载文件到特定文件夹

在本节Python自动化测试教程中,我们将考虑以下测试场景,使用Selenium Python下载文件。

  1. 转到Selenium Playground
  2. 点击 "文件下载"按钮。
  3. 输入数据字段中,输入 "如何使用Selenium和Python下载文件?"
  4. 点击 "生成文件"按钮。
  5. 点击下载按钮,下载文件Lambdainfo.txt,其中应该包含 "如何使用Selenium & Python下载文件?"

这就是我们项目的结构应该是这样的。

structure of our project

在关于如何使用Selenium Python下载文件的博客中,我们将创建三个文件夹,其内容如下:页面、测试utils

Python包是由这个**__init__.py**文件(读作 "dunder init")表示的。它只是在一个目录中的一个空文件,它说:"嘿,这是一个 Python 包,你可以这样对待它,特别是对于导入语句。"

在我们的 "utils"文件夹中,我们将创建一个locators.py文件,在其中放置我们不同的定位器。

locators.py

测试 使用定位器来寻找页面上的元素。定位器是用于寻找元素的简单查询字符串。它们将返回所有符合其查询的元素。

Selenium WebDriver支持许多类型的定位器。一些最常用的Selenium定位器包括:IDs, Names, Class Names, CSS Selectors, XPaths, Link Text, Partial Link Text, and Tag Name。

现在让我们来看看如何为我们的测试场景所需的目标项目获取定位器。我们已经创建了一个SeleniumPlaygroundPageLocators 类,在这个类中,我们为每个元素创建了变量,我们将在其中保存我们的选择器,以便以后在代码中使用。

file_download = (By.XPATH, '//li[.="File Download"]')

SeleniumPlaygroundPageLocators

data_field = (By.XPATH, '//*[@id="textbox"]')

data_field

generate_file = (By.ID, 'create')

generate_file

download_button = (By.XPATH, '//*[@id="link-to-download"]')

download_button

我还创建了一个名为 "页面"的目录。在 "pages"中,我们将创建一个文件selenium_playground_page.py,其中写有页面对象。要了解更多关于页面对象的信息,请参考我们之前的博客:Selenium Python中的页面对象模型(POM)

代码演练。

from selenium.webdriver.common.keys import Keys

selenium.webdriver模块提供了所有WebDriver的实现。Keys类提供了一些方法,你可以通过这些方法访问key。你可以参考这篇关于Selenium Keys的博客来了解更多关于Keys类的信息。

from utils.locators import *

在这里,我们在utils文件夹下的locators.py文件中导入所有的

import time

Python sleep()是Python时间模块的一个方法。所以,首先,我们必须导入时间模块,然后我们才能使用这个方法。

time.sleep(5)

在Python项目中,通常的做法是在项目的根目录下创建一个 "测试"目录,用来存放所有的测试方案。在测试中,我们有两个文件test_download_file.pyconftest.py

代码演练。

import unittest

unittest模块为构造和运行测试提供了一套丰富的工具。在这个关于如何使用Selenium Python下载文件的博客中,我们使用了unittest,但也可以使用其他几个Python测试框架,如PyTest、Robot、DocTest等。

PATH = "/Users/macbookair/Desktop/how_download_files_selenium_python/download"

我们创建了一个PATH 变量,在其中保存了我们想要保存的文件的路径,我们将用Selenium Python下载文件。

稍后我们将在conftest.py文件中添加一些代码,以便能够在我们的不同浏览器上运行测试。

在3000多个浏览器环境中运行你的Python自动化脚本。现在就试试LambdaTest吧!

如何在Chrome中使用Selenium Python下载文件?

在我们的conftest.py文件中,我们需要添加一些代码。首先,我们将用以下导入语句导入chromeOptions。

from selenium.webdriver.chrome.options import Options

Chrome Options类用于控制Chrome驱动程序的属性,并与Desired Capabilities结合使用。它可以帮助你执行各种操作,比如定义你要保存下载文件的文件夹。

用法是创建一个Chrome驱动实例。

#Google Chrome
       options = Options()
       prefs = {"download.default_directory" : PATH}
       options.add_experimental_option("prefs",prefs)
       self.driver = webdriver.Chrome(options=options)
  • options(选项)。这允许你设置Chrome浏览器的偏好。
  • download.default_directory:允许修改默认的下载目录。默认的下载文件夹将是我们的PATH变量中定义的路径。
  • add_experimental_option:允许用户在他们的Selenium webdriver对象中添加这些偏好。

我们的conftest.py文件现在看起来应该是这样的。

现在你可以通过在终端输入来运行你的测试。

python3 -m unittest

你的测试应该以如下方式运行。

python3 -m unittest

一旦你的测试运行成功,你的下载文件夹中应该有Lambdainfo.txt文件。

Lambdainfo.txt

该文件确实包含 "如何使用Selenium & Python下载文件?"的文字。

如何在Firefox中使用Selenium Python下载文件?

现在,我们将需要创建一个Firefox配置文件。如果你打算用Mozilla Firefox运行你的测试,这里是你需要添加到conftest.py文件中的代码。

#Firefox
       profile = webdriver.FirefoxProfile()
       profile.set_preference("browser.download.folderList", 2)
       profile.set_preference("browser.download.manager.showWhenStarting", False)
       profile.set_preference("browser.download.dir", PATH)
       profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/x-gzip")
       self.driver = webdriver.Firefox(firefox_profile=profile)

更多解释。

  • 配置文件。profile对象是FirefoxDriver特有的,包含了所有要定义的偏好。
  • browser.download.folderList:指示不要使用默认的下载目录。
  • browser.download.manager.showWhenStarting(下载管理器)。显示下载进度的转折点。
  • browser.download.dir:设置下载的目录。
  • browser.helperApps.neverAsk.saveToDisk:通知 Firefox 自动下载文件。通知Firefox自动下载所选mime类型的文件。
self.driver = webdriver.Firefox(firefox_profile=profile)

这一行代码允许我们创建一个带有所有偏好的Firefox驱动对象。

我们的conftest.py****文件现在应该是这样的。

现在,我们可以重新运行我们的测试了。

rerun our tests

如何在Safari中使用Selenium Python下载文件?

没有必要为Selenium WebDriver下载Safari驱动。相反,内置的Safari驱动,safaridriver,目前在大多数Selenium客户端库中都有。但是在Safari中运行WebUI测试之前,请确保在Safari浏览器中启用远程自动化。

要在Safari浏览器中允许远程自动化,你必须打开WebDriver支持。

  1. 要在Safari浏览器中启用 "开发 "菜单,请点击Safari > 偏好设置 > 高级 标签。选择 "显示开发菜单 "复选框。开发菜单会出现在菜单栏中。

turn on WebDriver support

  1. 要启用远程自动化,请点击菜单栏中的开发>允许远程自动化。
  2. 授权safaridriver启动承载本地Web服务器的webdriver服务。要允许这一点,请手动运行一次**/usr/bin/safaridriver**并完成认证提示。

run usr bin safaridriver

  1. 现在,我们需要在运行测试之前做一些改变。首先,我们将改变Safari的默认下载文件夹。你可以在Safari偏好设置中的常规选项卡中这样做。

make some changes before running the tests

  1. 现在,我们将禁用下载确认提示。在网站标签中,在偏好设置中。

download confirmation alerts

现在让我们添加一些代码。

#Safari
       self.driver = webdriver.Safari()

我们的conftest.py文件现在应该是这样的。

一切准备就绪,可以用Safari浏览器运行测试了。运行你的测试后,结果应该是这样的

ready to run the tests with Safari

如何使用云Selenium网格下载文件?

每个项目都是独一无二的,你必须为任何配置优化你的应用程序,以便在所有设备、浏览器和操作系统上提供流畅和一致的用户体验。

在一个理想的世界里,开发者会在真实的条件下使用真实的设备测试他们的应用程序。然而,内部实验室往往很小,因此无法为用户提供真实世界的体验。相反,他们选择使用模拟器或仿真器,旨在模仿用户的真实感受。虽然这些工具对应用测试很有帮助,但它们不能取代真实设备。在这种情况下,你必须选择提供真实设备的真实设备云测试解决方案。

LambdaTest云Selenium Grid提供了一个拥有3000多个真实设备和浏览器的在线设备场,帮助你完成工作。

在这个关于如何使用Selenium Python下载文件的Python网络自动化教程中,我们将使用LambdaTest REST APIs(/user-files/download)来从LambdaTest云存储中下载文件。

LambdaTest REST APIs

我们将不得不使用POST请求将文件上传到我们的LambdaTest存储,然后使用PUT请求从LambdaTest存储中下载用户文件。

在我们继续之前,我们将安装request,一个允许我们在Python中进行HTTP请求的Python库。它将请求的复杂性抽象在一个简单的API后面,所以你可以专注于在你的应用程序中与服务互动和消费数据。

从终端运行以下命令。

pip3 install requests

一旦 requests 被安装,你就可以在你的项目中使用它们。导入requests看起来像这样。

import requests

在我们的文件test_download_file.py中,我们导入JSON和request包。

import requests
import json

然后让我们添加一些代码。

GitHub

代码演练。

在我们添加到文件中的新类TestAPIDownloadFile 中,我们声明两个变量,如下。

username = "username"
access_Key = "access key"

这些变量将在我们的API调用中用于识别,然后再访问端点。

你需要使用你可以从LambdaTest配置文件页面检索到的认证数据替换用户名访问密钥的值。

LambdaTest profile page.

#POST_REQUEST
       url = "https://api.lambdatest.com/automation/api/v1/user-files"
 
       payload={}
 
       files=[     ('files',('Lambdainfo.txt',open('/Users/macbookair/Downloads/Lambdainfo.txt','rb'),'text/plain'))
       ]
 
       headers = {
       'authority': 'api.lambdatest.com',
       'accept': 'application/json',
       }
 
       response = requests.request("POST", url, auth=(username, access_Key), headers=headers, data=payload, files=files)
 
       print(response.text)

然后我们做一个POST请求,从我们的电脑上传一个文件到lambda存储。

files=[     ('files',('Lambdainfo.txt',open('/Users/macbookair/Downloads/Lambdainfo.txt','rb'),'text/plain'))
       ]

你必须用你的文件名替换 "Lambdainfo.txt",用文件所在的路径替换"/Users/macbookair/Downloads/Lambdainfo.txt"。

response = requests.request("POST", url, auth=(username, access_Key), headers=headers, data=payload, files=files)

在一个响应变量中,我们保存了我们的请求的响应,之后通过做显示。

print(response.text)


       #PUT_REQUEST
       url = "https://api.lambdatest.com/automation/api/v1/user-files/download"
 
 
       payload = json.dumps({
       "key": "Lambdainfo.txt"
       })
 
       headers = {
       'accept': 'application/octet-stream',
       'Content-Type': 'application/json'
       }
 
       response = requests.request("PUT", url, auth=(username, access_Key), headers=headers, data=payload)
       open('/Users/macbookair/Documents/how_download_files_selenium_python/download/Lambdainfo.txt', 'wb').write(response.content)
 
       print(response.text)

一旦我们的文件被上传到lambda存储,我们现在可以使用我们的PUT请求将其下载到我们选择的目录中。

payload = json.dumps({
       "key": "Lambdainfo.txt"
       })

Key标识了我们在存储上的文件,所以你必须用我们在存储上的文件名来替换它。

open('/Users/macbookair/Documents/how_download_files_selenium_python/download/Lambdainfo_API.txt', 'wb').write(response.content)

然后我们把文件保存在我们选择的目录中。你必须用你想保存文件的路径来替换指定的路径。

一旦测试在你的控制台运行,你可以看到对你的请求的响应。

test is run in your console

以及在定义的目录中已经下载的文件。

downloaded in the defined directory

如果你是一个Python程序员,希望在自动化测试领域取得名声,那么LambdaTest的Selenium Python 101认证项目是你最好的选择。

总结

关于如何使用Selenium Python下载文件的教程到此结束。当你使用Selenium自动化网络测试时,你可能需要测试一个网站或一个网络应用的完整功能。这意味着你将不得不行使下载和上传文件、流媒体视频或音频以及读/写文件等功能。

在这个关于Selenium Python测试的教程中,我们看到了如何使用Selenium Python下载文件到一个特定的文件夹。此外,我们学会了在不同的浏览器中使用Selenium Python下载文件,如Chrome、Firefox和Safari。最后,我们研究了在LambdaTest这样的云Selenium网格上下载文件的问题。

我希望这能让你对如何使用Selenium Python下载文件有一个良好的概述。如果你有任何问题或评论,请在下面的部分留言。

常见问题 (FAQ)

如何下载Selenium for Python?

Selenium Python 绑定很容易安装。首先,通过在终端键入pip确保pip软件包管理器已经安装。然后运行以下命令:
pip install selenium

如何使用Python Selenium保存图像?

用Selenium WebDriver下载图像是可能的。首先,在id;class;xpath等定位器的帮助下,确定你要下载的图片。一旦确定后,使用open方法,以写和二进制模式打开文件。