002-Selenium简单应用|2020-11-09

前言:最近在思考如何将一些生活中重复做的事情自动化,笔者比较喜欢玩LOL,去一些网站下载免费皮肤软件,奈何LOL更新实在频繁,皮肤软件也需要不断更新,所以有了下载这个软件自动化的想法...

0 开始之前

1 源码

import shutil, os, time, zipfile
from msedge.selenium_tools import EdgeOptions
from msedge.selenium_tools import Edge
from pykeyboard import PyKeyboard


edge_options = EdgeOptions()
'''todo(@Yuan),下面这段代码是将Edge浏览器在后台运行(即不打开浏览器执行自动化,但存在一些问题还未解决)'''
# edge_options.use_chromium = True  
# edge_options.add_argument('headless')
# edge_options.add_argument('disable-gpu')

driver = Edge(executable_path='./msedgedriver.exe', options=edge_options)
driver.get('http://leagueskin.net/p/download-mod-skin-2020-chn')
# 等待网站加载完全,加载不完全可能无法获取所需的数据
# driver.implicitly_wait(10)
# 找到需要的数据属性名,可以通过id,class,tag...
software_download_button = driver.find_element_by_id('link_download3')
# 获取官网最新版本
software_lastest_version = software_download_button.text.replace(' ', '')[14:-4]

# 本地存放软件目录
software_storage_path = r"C:\Users\Yuan\Desktop\skin"
# Edge浏览器文件下载存放目录
Edge_download_path = r"C:\Users\Yuan\Downloads"

# 本地的旧版本
for software_name in os.listdir(software_storage_path):
    if os.path.splitext(software_name)[1] == '.zip':
        software_old_version = software_name[8:-4]

# 判断版本,从而决定是否下载
if software_lastest_version > software_old_version:
    software_download_button.click()
    '''点击下载后会有广告,但只需随意点击就可开始下载,所以用Pykeyword模拟键入了回车键'''
    time.sleep(3)
    k = PyKeyboard()
    k.press_key(k.return_key)
    time.sleep(5)
    driver.quit()
    for download_file in os.listdir(Edge_download_path):
        if software_lastest_version in download_file:
            '''如果有新版本,下载完成,将之前的旧版本删除'''
            shutil.rmtree(software_storage_path)
            os.mkdir(software_storage_path)
            download_file = os.path.join(Edge_download_path, download_file)
            shutil.move(download_file, software_storage_path)
            '''新版以zip包形式存在,需要解压'''
            for new_software in os.listdir(software_storage_path):
                new_software = os.path.join(software_storage_path, new_software)
                zipfile.ZipFile(new_software, 'r').extractall(software_storage_path)
    for software_name in os.listdir(software_storage_path):
        if os.path.splitext(software_name)[1] == '.exe':
            if software_lastest_version in software_name:
                new_software_name = software_name.replace(' ', '')
                os.rename(software_storage_path + '\\' + software_name,
                          software_storage_path + '\\' + new_software_name)
                os.chdir(software_storage_path)
                os.system('%s' %new_software_name)

2 期间遇到的问题

Q1:selenium库导入无法使用

A1:文件名不要和库名一样,将文件名修改后正常使用。(笔者的这个py文件名字和selenium一样)

Q2:无法调用浏览器

A2:设置浏览器安装根目录options = Options() options.binary_location = "C:\\Users\\Yuan\\AppData\\Local\\CentBrowser\\Application\\chrome.exe",最好是默认安装目录(代码中options.binary_location是浏览器在笔者电脑安装位置);还需要安装chromedriver,下载和谷歌浏览器版本相近的解压即可

Q3:软件名带有空格无法用os.system()正常启动

A3:带有空格时,可以用os.system(r'"路径"'),运行名字带有空格的程序。也可以通过修改文件名,将空格改消失,这样也可以正常启动。最后,如果路径是个变量,可以用os.system('%s'%变量)

Q4:百分浏览器下载资源时需要确认,且删除旧文件,移动到指定文件夹解压后运行?

A4:上述代码已经可以完成这个操作,只需将Edge浏览器的Webdriver换成谷歌的Webdriver,再导入selenium库,引用Chorme webdriver(具体可百度)。

Q5:键盘模拟键入Enter,selenium库本身需要绑定页面一个元素,而有些弹窗并不是页面弹出,或是不想去定位元素,只想实现一个按键操作?

A5:利用pykeyboard模拟安装操作,前提安装pyHookPyUserInput,安装教程见0 开始之前,具体实现见1 源码

3 不足之处

N1:是否可以静默确认版本?一开始想的是后台静默确认版本,从网上找到Edge的webdriver后台运行方式(不打开浏览器运行脚本),但是好像和2 期间遇到的问题 Q5冲突?就是如果后台运行了,会出现脚本执行到按键就不继续了,笔者猜测可能是由于浏览器后台运行造成模拟键入Enter无法找到施加的对象,从而脚本不继续运行。(笔者之前想的是在Edge浏览器里下载Adblock插件拦截广告,但是webdriver每次调用的是一个全新的Edge浏览器,所以没办法)

N2:由于请求的是外国的网站,虽然软件才2M多,有时候会存在下载缓慢,从而导致下载超时,代码无法执行完全。有两个解决办法:①科学上网②用迅雷下载,需手动确认(迅雷没怎么用过,所以不知道在哪里设置无需确认),替换下载路径

N3:如果软件存放文件夹为空,或是没有新版本直接启动程序?为空的话可以写一个判断直接下载软件即可,因笔者电脑一般会有旧版本,所以这里不再赘述。如果没有新版本,想要直接启动程序,一般这个脚本发现有新版本后,会把程序执行一次,然后会在桌面生成一个快捷方式直接启动程序即可,无需再使用脚本,比较慢。

4 后续

暂无。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容