更新:利用webdriver, pyautogui向westransfer自动上传多个文件夹,并把文件名和下载链接写入txt文件
接上一篇,
五. 封装(更新)
在对代码进行封装时,chromedriver.exe同样需要一起封装,否者在启动exe不能打开浏览器。这就要用到下面这行代码,我们需要指明chromedirver.exe的路径。我们把chromedriver.exe同autoit的exe文件放在同一个文件夹exefile里,把相对路径带入resource_path(relative_path)函数,并赋值给他们的路径参数就可以了。详细做法参考上面链接的文章。
browser = webdriver.Chrome(executable_path='chromedriver.exe')
还有一点特别重要,所有的文件名不能有空格,否则传入的路径名会少掉空格后面的字符串。
六. Chrome更新后
由于Chrome在不断更新中,而且Chromedriver的版本必须要跟Chrome的版本一致,所以Chrome更新后就不能使用旧的Chromedriver了,就必须进行更新。
但是我们有时候会遇到自动更新的Chrome版本却找不到对应版本的driver, 那就需要找其他版本的下载使用。
Chromedriver Mirror:http://npm.taobao.org/mirrors/chromedriver
Chrome versions: https://google_chrome.en.downloadastro.com/old_versions/ https://www.slimjet.com/chrome/google-chrome-old-version.php
两个软件的版本号一定要一致才可以使用。
需要注意以下几点:
如果下载的测试版本的Chrome,他默认的安装位置文件夹名会多一个data的名字,如果你不想修改源代码,就直接把文件名的data删掉。
由于我是在自己的电脑A上写代码,但在电脑B上运行代码,但又不想把过多的文件搬到其他电脑B上去。所以在电脑A上打包成exe文件时,把需要一起打包的文件夹exefile里的chromedriver.exe换成电脑B上Chrome同一版本号, 打包后就可以在电脑B上使用了。
更新后的代码:
#encoding = UTF-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import pyautogui as pag
import pyperclip
import time
import os
import sys
import shutil
import easygui as g
#由于需要把autoit的EXE文件一起打包,所以使用了本函数
def resource_path(relative_path): #这段函数是为了把这个程序用pyintaller打包成exe。参数是相对路径,即在程序所在文件夹的路径
else:
#定义显性等待,参数为需要等待出现的具体元素的xpath值
def waitok(location):
locator = (By.XPATH, location)
try:#由于需要上传大量文件,需要长时间等待,所有最大为10分钟
WebDriverWait(browser, 600, 0.5).until(EC.presence_of_element_located(locator))
print('Get the target.%s' % location)
except TimeoutException:
print('网络超时,页面加载失败。')
browser.quit()#如果出现长时间(600秒)不能加载完成,就关闭浏览器,退出程序。
sys.exit()
#显性等待,特定的元素通过classname来判断。由于有些特殊元素需要通过元素类名进行准确查找。
def waitokname(classname):
locator = (By.CLASS_NAME, classname)
try:
WebDriverWait(browser, 600, 0.5).until(EC.presence_of_element_located(locator))
print('Get the target.')
except TimeoutException:
print('网络超时,页面加载失败。')
browser.quit()#如果出现长时间(600秒)不能加载完成,就关闭浏览器,退出程序。
sys.exit()
#利用easygui的 交互界面选择需要上传的文件夹的上上级目录,作为工作目录。
root = g.diropenbox('选择需要上传文件夹的上级文件夹', default = r'D:')
basefolder = ''.join([root, '\\', 'wetransfer']) #指定wetransfer目录下的文件夹都会自动上传
if basefolder:
pass
else:
print('没有选择文件夹。')
sys.exit()
#目录下所有文件和文件夹组成的列表
folderlist = os.listdir(basefolder)
#判断目录下是否为空,非空才能进行下一步
if len(folderlist):
pass
else:
print('%s 目录下没有文件。' % basefolder)
sys.exit()
#指定工作目录下的wetransferlinks为存放链接文件的文件夹,判断是否存在links.txt文件,如果存在就删除
linksfilepath = ''.join([root, '\\', 'wetransferlinks\links.txt'])
if os.path.exists(linksfilepath):
os.remove(linksfilepath)
else:
pass
#为了避免browser.get()的长时间加载,详细请看文章
desired_capabilities = DesiredCapabilities.CHROME
desired_capabilities["pageLoadStrategy"] = "none"
#下面这句被注释掉了,是因为他的功能与webdriver.Chrome()一样,不过为了学习,在这里留下了。
chromepath = resource_path('exefile/chromedriver.exe')
browser = webdriver.Chrome(executable_path=chromepath)
#browser = webdriver.Chrome()#打开浏览器
browser.maximize_window()#最大化浏览器窗口
browser.get('https://wetransfer.com/') #打开网页
waitok('/html/body/div[2]/div/div[1]/div[2]/div[2]/div[4]/button')#等待I agree的按钮出现
Iagree = browser.find_element_by_xpath('/html/body/div[2]/div/div[1]/div[2]/div[2]/div[4]/button')
Iagree.click()
#由于第一次打开网页和后面继续上传Select a folder按钮的位置不一样,所有在这里进行了区别
n = 0
#开始批量上传文件夹
for eachfolder in folderlist:
fullpath = ''.join([basefolder, '\\', eachfolder])#所有文件夹的绝对路径
if os.path.isdir(fullpath):#判断是否为文件夹,所有不是文件夹就会跳过
pass
else:
print('%s 不是文件夹。' % fullpath)
continue
#利用pyautogui来完成webdriver不能完成的任务
if n == 0:
#点击Select a folder
'''pag.moveTo(x=388, y=678) #选择文件夹
time.sleep(0.5)
pag.click()
time.sleep(0.5)'''
#office version 点击Select a folder
pag.moveTo(x=236, y=458) #选择文件夹
time.sleep(0.5)
pag.click()
time.sleep(0.5)
else:
#点击Select a folder
'''pag.moveTo(x=406, y=773) #选择文件夹
time.sleep(0.5)
pag.click()
time.sleep(0.5)'''
#office点击Select a folder
pag.moveTo(x=234, y=512) #选择文件夹
time.sleep(0.5)
pag.click()
time.sleep(0.5)
#selectfolder.exe需要一起打包进入EXE
autoitpath = resource_path(r'exefile\selectfolder.exe')
#系统调用autoit来控制windows窗口,来输入文件夹路径
os.system('%s %s' % (autoitpath,fullpath))
time.sleep(0.5)
#点击上传按钮
'''pag.moveTo(x=1491, y=363)
time.sleep(0.5)
pag.click()'''
#office version 点击上传按钮
pag.moveTo(x=1092, y=229)
time.sleep(0.5)
pag.click()
#点击显示生成链接的按钮
'''waitok('/html/body/div[2]/div/div[2]/div/div[2]/button[1]')
pag.moveTo(x=222, y=1218)
time.sleep(0.5)
pag.click()
time.sleep(0.5)'''
#office点击显示生成链接的按钮
waitok('/html/body/div[2]/div/div[2]/div/div[2]/button[1]')
pag.moveTo(x=140, y=797)
time.sleep(0.5)
pag.click()
time.sleep(0.5)
#点击Get transfer link
'''pag.moveTo(x=344, y=872)
time.sleep(0.5)
pag.click()
time.sleep(0.5)'''
#office点击Get transfer link
pag.moveTo(x=137, y=582)
time.sleep(0.5)
pag.click()
time.sleep(0.5)
#点击get a link
'''pag.moveTo(x=453, y=1228)
time.sleep(0.5)
pag.click()'''
#office点击get a link
pag.moveTo(x=275, y=801)
time.sleep(0.5)
pag.click()
#点击copy link
'''waitokname('transfer-link__url')
pag.moveTo(x=481, y=1231)
time.sleep(0.5)
pag.click()'''
#office点击copy link
waitokname('transfer-link__url')
pag.moveTo(x=275, y=801)
time.sleep(0.5)
pag.click()
#利用pyperclip读取剪贴板信息,导出复制的链接
link = pyperclip.paste()
info = '%s : %s\n' % (eachfolder, link)
print(info)
#把文件夹名和对应的下载链接写入文件中
with open(linksfilepath,'a') as file:
file.write(info)
n = 1 #从n=1开始,Select a foloder的位置发生变化
shutil.rmtree(fullpath) #利用shutil删除非空文件夹
#点击Send another
'''pag.moveTo(x=481, y=1231)
time.sleep(0.5)
pag.click()
time.sleep(0.5)'''
#office点击Send another
pag.moveTo(x=275, y=801)
time.sleep(0.5)
pag.click()
time.sleep(0.5)
#点击Continue
'''pag.moveTo(x=481, y=1231)
time.sleep(0.5)
pag.click()
time.sleep(0.5)'''
#office点击Continue
pag.moveTo(x=275, y=801)
time.sleep(0.5)
pag.click()
time.sleep(0.5)
#结束后退出浏览器和程序
browser.quit()
sys.exit()