全栈测试开发系列----WebDriver API及对象识别技术(二)---selenium文件上传及下载

发布时间 2023-06-28 22:40:03作者: C_N_Candy

目录

  一、文件上传

  二、文件下载

 

正文

 

一、文件上传:selenium+AutoIT

  在网页上传文件的时候,Selenium无法直接操作如Flash、JavaScript 或Ajax 等技术所实现的上传功能,selenium是根据网页上的标签来定位的,但是上传文件时却是调用的非网页上的窗口,针对selenium这一个弊端,我们将使用AutoIT脚本来处理桌面或Windows元素,并将AutoIT脚本与Selenium代码结合起来。

  AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作。它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务,而这是其它语言不可能做到或无可靠方法实现的。

 官网下载地址: AutoIt Downloads - AutoIt (autoitscript.com)

 

下载软件和编辑器:

介绍
AutoIt Window Info:元素识别器,是一个类似selenium IDE的工具,元素识别器找到窗口GUI或非HTML弹出窗口的元素,并提供元素的属性,比如 title, class, instance。
SciTE Script Editor:编辑器,用于编写AutoIT脚本。

 

 安装,选择64位

 

安装好之后,没有创建桌面快捷方式,一般存放在默认目录里面:C:\Program Files (x86)\AutoIt3

 

 

使用AutoIt:

  先使用搜索工具,定位到元素,然后使用编辑器编写脚本,一般编写好的脚本默认以.au3为后缀。然后把脚本Complile转换成.exe文件,最后通过代码os.system调用执行.exe文件

使用其中的方法编写脚本:

  • ControlFocus - 这将使窗口焦点
  • ControlSetText - 这将设置文件路径
  • ControlClick - 这将点击按钮
  • WinWait - 设置窗口等待时间

以百度为例

  打开百度窗口,点击图片搜索,选择文件

 

此时打开AutoIT,拖动Finder Tool图标到文件框和“打开”按钮,这将给出关于该窗口和文件名段信息的所有细节; 我们将只使用一些属性,如窗口标题,类和实例

 

 

打开AutoIt编辑器和写脚本    

打开SciTE Sctipt Editor编写脚本,

“打开”就是Title,

Edit1就是Class+Instance

脚本:

# 聚焦一个Windows窗口
# 传入controlID的值对应的ClassnameNN
ControlFocus("打开","","Edit1");

# 设置窗口等待时间
WinWait("打开","",5)

# 将文件路径写入指定的文本框,这里的文件路径是写死的,可以使用$CmdLine[1]
ControlSetText("打开","","Edit1","C:\Users\86187\Pictures\Saved Pictures\15134220.jpg");

# 最后单击打开
ControlClick("打开","","Button1"

 

解决AutoIt脚本中文件路径固定的问题,参数化文件路径:

$CmdLine[1]表示执行exe文件时可以携带一个参数,表示将第一个参数值传入此处。所以可以使用该命令完成文件参数化操作,并不需要固定的值。在调用os模块时,只需要传入一个文件所在具体路径参数,这样就更灵活了。

 示例代码如下:

# 聚焦一个Windows窗口
# 传入controlID的值对应的ClassnameNN
ControlFocus("打开","","Edit1");

# 设置窗口等待时间
WinWait("打开","",5)

# 将文件路径写入指定的文本框,这里的文件路径是写死的,可以使用$CmdLine[1]
ControlSetText("打开","","Edit1",$CmdLine[1]);

# 最后单击打开
ControlClick("打开","","Button1"

 

Python代码传入路径参数

get_path= os.path.dirname(os.path.abspath(__file__))+"\image\python/png"
driver.find_element(By.Xpath,"//*[@id='form']/span[1]/span[1]").click()

# JS定位
js_upfile = "document.getElementsByClassName('upload-pic')[0].click()"
driver.execute_script(js_upfile)

# 执行脚本,上传路径文件
os.system("upfile.exe %s"%get_path)

 

解决AutoIT编辑器中文乱码出错

注意:打开编辑器的写代码的时候,要修改字符编码,不然中文会显示乱码

 

 编写完脚本后,保存到任意路径,在点击菜单栏Tools -> Complile

 最后使用Python代码,实现文件上传操作

# -----------------------------------
'''
@Author:C_N_Candy
@Date  :2023/6/28 18:40
@File  :upfile.py
@Desc  :
'''
# ------------------------------------
from selenium import webdriver
import os
import time
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(20)
driver.get("https://www.baidu.com")


driver.find_element(By.XPATH,"//*[@id='form']/span[1]/span[1]").click()
time.sleep(3)

# 点击“文件上传”按钮,(按照这个定位方式是定位不到的,会报错:selenium.common.exceptions.InvalidArgumentException: Message: invalid argument)
# driver.find_element(By.XPATH,"//*[@id='form']/div/div[2]/div[2]/input").click()

# JS定位,点击“文件上传”按钮
js_upfile = "document.getElementsByClassName('upload-pic')[0].click()"
driver.execute_script(js_upfile)

# 执行脚本,这里文件路径带有空格,执行的时候会报错,在双引号后面加上单引号就可以了
os.system('"C:/Program Files (x86)/AutoIt3/script/upfile.exe"')
time.sleep(2)
# 截图 driver.save_screenshot(
"upfile.png") driver.quit()

 

 

参考、扩展文章

全网最全AutoIt3基础教程及实战案例 - 掘金 (juejin.cn)

 AutoIT+Selenium的使用_守善的博客-CSDN博客



二、文件下载

 

2.1、Firefox文件下载

  如果时候用火狐浏览器进行文件下载,则需要对FirefoxProfile()进行相关的设置操作。

    browser.download.foladerList:该选项值如果设置为0,则表示下载到浏览器的默认下载路径,设置为2,则可以保存到指定的目录

    browser.download.manager.showWhenStarting:表示是否显示开始,其值只有True和False,其中True为显示开始,False为不显示开始

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

    browser.helperApps.neverAsk.saveToDisk:表示对所给文件类型不再进行弹窗询问

以上参数可以通过火狐浏览器中输入about:config查看相关的参数信息

 

具体代码示例:(实现使用Python下载selenium包操作)

# -----------------------------------
'''
@Author:C_N_Candy
@Date  :2023/6/28 21:42
@File  :downfile.py
@Desc  :
'''
# ------------------------------------

from selenium import webdriver
from selenium.webdriver.common.by import By
import os

# 对火狐浏览器的下载参数进行设置
fp = webdriver.FirefoxProfile()

# 设置成0代表下载到浏览器默认路径,设置成2保存到指定的路径
fp.set_preference("browser.download.folderList",2)

# True显示开始,False不显示开始
fp.set_preference("browser.download.manager.showWhenStarting",True)

# 指定下载文件路径,os.getcwd()返回当前目录,综合即指将文件下载到脚本所在目录
fp.set_preference("browser.download.dir",os.getcwd())

# 下载文件类型
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","applaction/octet-stream")

# 将设置的参数传递给浏览器
driver = webdriver.Firefox(firefox_profile=fp)
driver.get('https://pypi.org/project/selenium/#files')

# 定位。点击下载
driver.find_element(By.XPATH,"//*[@id='files']/div[1]/div[2]/a[1]").click()

 

2.2、Chrome文件下载。

  同样的如果要使用谷歌浏览器进行文件下载,也需要完成相应的设置。如指定下载目录、禁止弹窗等。

    download.default_directory:[dir],表示指定下载目录

    profile.default_content_settings.popups:通常设置为0,表示禁止弹窗

    profile.default_content_setting_values.images:通常设置为2,表示禁止图片加载。

 

代码示例如下:

# -----------------------------------
'''
@Author:C_N_Candy
@Date  :2023/6/28 22:06
@File  :downfile_Chrome.py
@Desc  :谷歌浏览器下载selenium文件
'''
# ------------------------------------

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

options = webdriver.ChromeOptions()
prefs = {'profile.default_content_settings.popups': 0,'download.default_directory':'c:\\'}
options.add_experimental_option('prefs',prefs)

driver = webdriver.Chrome(chrome_options=options)
driver.get('https://pypi.org/project/selenium/')
driver.find_element(By.XPATH,"//*[@id='files-tab']").click()
time.sleep(5)

# 点击下载
driver.find_element(By.XPATH,"//*[@id='files']/div[1]/div[2]/a[1]").click()
time.sleep(100)
driver.quit()