vlambda博客
学习文章列表

更新:利用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

两个软件的版本号一定要一致才可以使用。

需要注意以下几点:

  1. 如果下载的测试版本的Chrome,他默认的安装位置文件夹名会多一个data的名字,如果你不想修改源代码,就直接把文件名的data删掉。

  2. 由于我是在自己的电脑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()