目录
一、文件上传
二、文件下载
正文
一、文件上传:selenium+AutoIT
在网页上传文件的时候,Selenium无法直接操作如Flash、JavaScript 或Ajax 等技术所实现的上传功能,selenium是根据网页上的标签来定位的,但是上传文件时却是调用的非网页上的窗口,针对selenium这一个弊端,我们将使用AutoIT脚本来处理桌面或Windows元素,并将AutoIT脚本与Selenium代码结合起来。
AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作。它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务,而这是其它语言不可能做到或无可靠方法实现的。
下载软件和编辑器:
介绍
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()
参考、扩展文章
二、文件下载
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()