网页设计知名网站,江苏企业网站制作哪家好,快速建站模板自助建站,他达拉非的副作用和危害背景
研究下 PythonSelenium 自动化测试框架#xff0c;简单实现 Mac 下自动化批量上传视频西瓜视频并发布#xff0c;分享给需要的同学#xff08;未做过多的异常处理#xff09;。
脚本实现 首先通过手工手机号登录#xff0c;保存西瓜视频网站的 cookie 文件 之后加载…
背景
研究下 PythonSelenium 自动化测试框架简单实现 Mac 下自动化批量上传视频西瓜视频并发布分享给需要的同学未做过多的异常处理。
脚本实现
首先通过手工手机号登录保存西瓜视频网站的 cookie 文件 之后加载 cookie 内容使用脚本批量上传视频保存到草稿也可自动发布为了二次编辑如修改封面 最后通过遍历视频草稿列表来进行草稿视频发布PS: 同一天上传或发布视频太多时会被西瓜视频限流。 安装依赖
# 安装依赖保存网站 cookie# 安装 chromedriver
$ brew install chromedriver
脚本内容
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import json
import os
import shutil
import sysfrom selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import ActionChains
from pykeyboard import PyKeyboard
from pymouse import PyMouse
import pyperclipclass XiGua:Mac 西瓜视频自动上传视频及发布草稿def __init__(self):初始化打开浏览器self.driver webdriver.Chrome()def save_cookies(self, cookies_file_name):保存 cookiescookies_file_name: cookies 文件名称# 预留 20 秒来进行手工登录time.sleep(20)# 登录成功后保存 cookies 文件with open(cookies_file_name, w) as cookies_file:cookies_file.write(json.dumps(self.driver.get_cookies()))def load_cookies(self, cookies_file_name):加载 cookiecookies_file_name: cookies 文件名称# 加载 cookies 文件with open(cookies_file_name, r) as cookies_file:cookies_list json.load(cookies_file)for cookie in cookies_list:if expiry in cookie:del cookie[expiry]self.driver.add_cookie(cookie)# 加载 cookie 后刷新页面生效self.driver.refresh()def is_exist_element_by_xpath(self, xpath):判断元素是否存在flag Truetry:self.driver.find_element_by_xpath(xpath)return flagexcept Exception as e:flag Falseprint(xpath: [%s] 的元素不存在错误%s % xpath, e)return flagdef upload_video(self, video_file_path):上传视频video_file_path: 上传视频路径# 打开上传视频页面self.driver.get(https://studio.ixigua.com/upload?frompost_article)# 点击上传self.driver.find_element_by_class_name(byte-upload-trigger-drag).click()time.sleep(5)# 选择视频文件k PyKeyboard()m PyMouse()# 打开k.press_keys([Command, Shift, G])x_dim, y_dim m.screen_size()k.press_keys([Shift])m.click(x_dim // 2, y_dim // 2, 1)# 复制视频文件路径pyperclip.copy(video_file_path)# 粘贴k.press_keys([Command, V])time.sleep(2)k.press_key(Return)time.sleep(2)k.press_key(Return)time.sleep(2)# 设置转载选项self.driver.find_element_by_xpath(//*[idjs-video-list-content]/div/div[2]/div[4]/div[2]/div/div/label[2]/span/span).click()time.sleep(1)# 同步到抖音# self.driver.find_element_by_class_name(byte-checkbox-mask).click()# 循环判断视频上传成功不成功等待10秒后再次判断直到成功while 上传成功 not in self.driver.find_element_by_xpath(//*[idjs-video-list-content]/div/div[1]/div[1]/div[2]/div[2]).text:print(循环等待视频上传成功等待10秒)time.sleep(10)# 设置视频封面self.driver.find_element_by_class_name(m-xigua-upload).click()print(点击-上传封面)time.sleep(5)try:reload self.driver.find_element_by_xpath(/html/body/div[3]/div/div[2]/div/div[1]/div/div/div/div[2])# 视频封面解析失败处理循环刷新if reload ! :print(视频封面解析失败处理开始循环刷新)while XiGua.is_exist_element_by_xpath(self,/html/body/div[3]/div/div[2]/div/div[1]/div/div/div/div[2]):# 点击循环self.driver.find_element_by_xpath(/html/body/div[3]/div/div[2]/div/div[1]/div/div/div/div[2]).click()print(刷新失败后等待5秒再次刷新)time.sleep(5)# 选择第一个图片img self.driver.find_element_by_xpath(/html/body/div[3]/div/div[2]/div/div[1]/div/div/div[1]/img)img.click()except Exception as e:print(封面解析正常无需刷新)pass# 下一步cover_next_element WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath(/html/body/div[3]/div/div[2]/div/div[2]/div))cover_next_element.click()print(点击-封面下一步)try:# 完成裁剪cover_crop_element WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath(//*[idtc-ie-base-content]/div[2]/div[2]/div[2]/div/div[2]/div/div/div[2]))if cover_crop_element ! :cover_crop_element.click()print(点击-封面完成裁剪)else:print(封面无需裁剪)except Exception as e:print(裁剪封面出现异常%s % e)passtime.sleep(5)# 确定self.driver.find_element_by_xpath(//*[idtc-ie-base-content]/div[2]/div[2]/div[3]/div[3]/button[2]).click()print(点击-封面确定)time.sleep(1)# 再次确定self.driver.find_element_by_xpath(/html/body/div[4]/div/div[2]/div/div[2]/button[2]).click()print(点击-封面再次确定)time.sleep(5)# 存草稿draft_element WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath(//*[idjs-submit-draft-0]/button))action ActionChains(self.driver)print(点击-保存草稿)# 移动滚动条到底部js window.scrollTo(0,document.body.scrollHeight)self.driver.execute_script(js)# 移动到 存草稿 按钮点击action.move_to_element(draft_element).click().perform()def close(self):关闭浏览器self.driver.close()def batch_upload(self, videos_dir_path):批量上传视频videos_dir_path: 上传视频存储路径files os.listdir(videos_dir_path)# 降序排序上传草稿发布时视频序号则为顺序files.sort(reverseTrue)# 批量上传视频for file in files:if os.path.splitext(file)[1] .mp4:full_file_path os.path.join(videos_dir_path, os.path.splitext(file)[0])print(开始上传视频%s % full_file_path)self.upload_video(full_file_path)src os.path.join(videos_dir_path, file)dst os.path.join(videos_dir_path, bak, file)# 发布完成后移到到备份目录shutil.move(src, dst)def videos_release(self):草稿视频发布self.driver.get(https://studio.ixigua.com/content)time.sleep(2)# 点击草稿导航draft_navigation_element WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath(//*[idapp]/div/section/div/div[1]/ul/li[3]))draft_navigation_element.click()print(点击-草稿导航)time.sleep(2)# 草稿列表draft_elements self.driver.find_elements_by_class_name(content-card__title )# 草稿列表为空则退出if len(draft_elements) 0:print(草稿列表为空)XiGua.close(self)sys.exit()# 循环发布草稿每次都发布第一个for i in range(1, 99999):# 草稿列表为空退出if draft_elements :print(草稿发布完成总共%s % str(i))XiGua.close(self)sys.exit()print(当前发布数量 %s 发布视频: %s % (str(i), draft_elements[0].text))# 发布草稿第一个视频draft_elements[0].click()time.sleep(3)# 立即发布element2 WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath(//button[contains(text(), 发布)]))element2.click()print(点击-视频发布)# 判断是否发布失败如标题超长try:# 错误处理if XiGua.is_exist_element_by_xpath(self, /html/body/div[3]/div/div/div/span):print(发布出现错误退出请检查错误如标题超长等)sys.exit()except Exception as e:print(草稿发布异常%s % e)pass# 处理封面分辨率低提示try:# 封面分辨率低cover_cancel_element self.driver.find_element_by_xpath(//div[contains(text(), 取消)])print(封面分辨率低处理,直接取消)# 错误处理if cover_cancel_element ! :print(取消封面分辨率低)cover_cancel_element.click()# 立即发布cover_publish_element WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath(//button[contains(text(), 发布)]))cover_publish_element.click()except Exception as e:print(封面分辨率低出现异常%s % e)pass# 点击草稿draft_publish_element WebDriverWait(self.driver, 30).until(lambda x: x.find_element_by_xpath(//*[idapp]/div/section/div/div[1]/ul/li[3]))draft_publish_element.click()time.sleep(2)print(重新获取草稿列表)draft_elements self.driver.find_elements_by_class_name(content-card__title )print(draft_elements)def xigua_videos_release(self, base_url, cookies_file_path):西瓜视频发布草稿base_url: 西瓜视频网站cookies_file_path: 西瓜视频 cookies 文件路径self.driver.get(base_url)# 加载 cookiesXiGua.load_cookies(self, cookies_file_path)# 草稿发布视频XiGua.videos_release(self)# 关闭浏览器XiGua.close(self)def xigua_batch_upload(self, base_url, cookies_file_path, videos_dir_path):西瓜视频批量发布视频base_url: 西瓜视频网站cookies_file_path: 西瓜视频 cookies 文件路径videos_dir_path: 上传视频存储路径self.driver.get(base_url)XiGua.load_cookies(self, cookies_file_path)XiGua.batch_upload(self, videos_dir_path)XiGua.close(self)def xigua_save_cookies(self, base_url, cookies_file_path):保存网站 cookiebase_url: 网站地址cookies_file_path: 网站 cookies 文件路径self.driver.get(base_url)# 保存 cookiesXiGua.save_cookies(self, cookies_file_path)XiGua.close(self)if __name__ __main__:xi_gua XiGua()# 西瓜视频base_url https://www.ixigua.com/xigua_cookies /tmp/xigua_update_video/xigua_cookies.txtvideos_dir_path /tmp/rm## 1. 保存 cookie# xi_gua.xigua_save_cookies(base_url, xigua_cookies.txt)## 2. 批量上传xi_gua.xigua_batch_upload(base_url, xigua_cookies, videos_dir_path)## 3. 批量发布草稿# xi_gua.xigua_videos_release(base_url, xigua_cookies)
行动吧在路上总比一直观望的要好未来的你肯定会感 谢现在拼搏的自己如果想学习提升找不到资料没人答疑解惑时请及时加入扣群 320231853里面有各种软件测试开发资料和技术可以一起交流学习哦。
最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走
这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你