【Watir Webdriver】自动化上传照片到百度相册

来源:互联网 发布:公众号小说收费源码 编辑:程序博客网 时间:2024/06/05 03:04

这年月,手机和硬盘里存放的生活照片越来越多,一直都有点担心硬盘坏掉导致照片不可恢复,毕竟这种痛苦是经历过的。

现在好了,各大互联网巨头都提供网盘或者相册之类的服务,把照片归档上去,就安全可靠多了。更保险点,我想一式多份归档到多个提供商的相册,这就不会因为某年某月某个巨头取消该服务而费心机。

这么想应该没错吧,但是想象一下手工把历史照片都归档到各个相册,这种劳动真的有点无聊了。所以,我老早就希望搞个自动上传照片到相册网站的脚本来玩玩,这两天按baidu相册的样子,搞出了一个。


# coding: gb2312require 'watir-webdriver'# 打开chrome driverbrowser = Watir::Browser.new :chromebegin# 登陆baidu相册首页browser.goto 'http://xiangce.baidu.com/'# 点击登陆browser.a(:id, 'userbar-login-btn').wait_until_presentbrowser.a(:id, 'userbar-login-btn').click# 输入用户名browser.input(:name, 'userName').wait_until_presentbrowser.input(:name, 'userName').send_keys('baidu账户')# 输入密码browser.input(:name, 'password').wait_until_presentbrowser.input(:name, 'password').send_keys('登陆密码')# 确定browser.input(:id, 'TANGRAM__PSP_8__submit').clicksleep 5browser.a(:text, '我的相册').wait_until_presentbrowser.a(:text, '我的相册').click# 进入我的相册后,目前会弹出一个对话框。也许以后会没有这个东东,到时需要取消这块代码browser.a(:text, '我知道了').wait_until_presentbrowser.a(:text, '我知道了').clicksleep 5browser.span(:xpath, "//div[@class='bt-upload-wrapper']/a/span").wait_until_presentbrowser.span(:xpath, "//div[@class='bt-upload-wrapper']/a/span").click# 为了简单化,每次都创建新相册browser.a(:text, '创建新的相册').wait_until_presentbrowser.a(:text, '创建新的相册').click# 新相册以test加上当前时间戳来命名,避免冲突browser.input(:name, 'input-album-name').wait_until_presentbrowser.input(:name, 'input-album-name').send_keys('test' + Time.now.to_i.to_s)browser.a(:text, '确认').wait_until_presentbrowser.a(:text, '确认').click# 收集需要上传的照片文件名列表list_photos = Dir.glob("E:/photos/*.gif") if list_photos.size == 0raise "指定目录无gif文件"end# 先指定一个照片文件,其余文件都通过继续上传来完成browser.file_field(:xpath, "//div[@id='filePicker']/div/input").wait_until_presentbrowser.file_field(:xpath, "//div[@id='filePicker']/div/input").value= list_photos[0]# 把剩余的照片上传,因为存在1次上传最多300张的限制,所以下面特别处理了,支持超过300张照片的上传browser.file_field(:xpath, "//div[@id='filePicker2']/div/input").wait_until_presentcurrent_selected_photo_count = 1list_photos[1..-1].each do |photo|current_selected_photo_count += 1if current_selected_photo_count > 300 # 目前baidu相册一次上传限制最多300张相片puts "已选择的文件数目达到300个,先上传一次"browser.div(:text, '开始上传').wait_until_presentbrowser.div(:text, '开始上传').clickupload_expected_timeout = 300 * 10 #按每张照片耗时10秒,计算完成300张照片上传的耗时# 在上传过程中,会出现“暂停上传”按钮,这就是我用来判断上传是否完成的标志browser.div(:text, '暂停上传').wait_while_present(upload_expected_timeout)# 有可能会出现个别照片上传失败,会提示重试。我这里先不处理这种场景了# 每次上传完成后,都会弹出一个对话框,可以选择返回相册,还是继续上传,我们还有更多照片上传,所以继续browser.a(:text, '上传更多照片').wait_until_presentbrowser.a(:text, '上传更多照片').clickcurrent_selected_photo_count = 1# 又回到前面的套路,先指定一个照片文件,其余文件都通过继续上传来完成browser.file_field(:xpath, "//div[@id='filePicker']/div/input").wait_until_presentbrowser.file_field(:xpath, "//div[@id='filePicker']/div/input").value= photoputs "指定上传#{photo}"nextendbrowser.file_field(:xpath, "//div[@id='filePicker2']/div/input").value= photoputs "指定上传#{photo}"end# 最后把剩下还没上传的照片一次上传,预防照片数目刚好是300整数,所以加多个判断,以下类似if current_selected_photo_count > 0browser.div(:text, '开始上传').wait_until_presentbrowser.div(:text, '开始上传').clickend# 如果还有没有上传的照片,就按照每张照片预留10秒耗时计算总耗时,否则预留总耗时为30秒upload_expected_timeout = current_selected_photo_count > 0 ?  current_selected_photo_count * 10 : 30browser.a(:text, '确定,查看相册').wait_until_present(upload_expected_timeout)browser.a(:text, '确定,查看相册').clicksleep 1# 进入我的相册后,目前会弹出一个对话框。也许以后会没有这个东东,到时需要取消这块代码browser.a(:text, '我知道了').wait_until_presentbrowser.a(:text, '我知道了').clicksleep 10puts "上传成功"rescue => errorputs "出现异常:#{error}"puts "出现异常:#{error.backtrace.join('\n')}"ensurebrowser.close if browserend





0 0
原创粉丝点击