|
@@ -5,9 +5,12 @@ from selenium.webdriver.common.by import By
|
|
|
from selenium.webdriver.support import expected_conditions as EC
|
|
|
from selenium.webdriver.support.wait import WebDriverWait
|
|
|
from selenium.webdriver import ChromeOptions
|
|
|
+import logging
|
|
|
import time
|
|
|
import random
|
|
|
import re
|
|
|
+import os
|
|
|
+from logging import handlers
|
|
|
|
|
|
|
|
|
class CreateAd:
|
|
@@ -33,12 +36,76 @@ class CreateAd:
|
|
|
WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name('topArea-qOwEAeNuIn'))
|
|
|
|
|
|
def create_layout(self):
|
|
|
+ # 数据库获取数据,然后进行编排
|
|
|
# 创建编排
|
|
|
pass
|
|
|
|
|
|
def set_head_assemb(self, info):
|
|
|
def single_page_set():
|
|
|
- pass
|
|
|
+
|
|
|
+ self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/div[1]/div/div[1]/div/div').click()
|
|
|
+ time.sleep(random.uniform(0.1, 0.2))
|
|
|
+
|
|
|
+ file_name = os.path.basename(info_v)
|
|
|
+ self.driver.find_element_by_class_name('upload-img-item-inner-2gsg7NjaZ8').click()
|
|
|
+ WebDriverWait(self.driver, 10).until(
|
|
|
+ lambda x: len([_ for _ in self.driver.find_elements_by_class_name('title-29sncpKgTl') if
|
|
|
+ _.is_displayed() and _.is_enabled()]) > 0)
|
|
|
+
|
|
|
+ turn_page_buttons = self.driver.find_elements_by_class_name('paginationIcon-1EfoH0sNRF')
|
|
|
+ can_use_button = []
|
|
|
+ for _ in turn_page_buttons:
|
|
|
+ if _.is_enabled() and _.is_displayed():
|
|
|
+ can_use_button.append(_)
|
|
|
+ # 不断翻页获取到元素为止
|
|
|
+ chose_over = False
|
|
|
+ while True:
|
|
|
+ page_elements = self.driver.find_elements_by_class_name('title-29sncpKgTl')
|
|
|
+ for _ in page_elements:
|
|
|
+ if _.is_displayed() and _.is_enabled():
|
|
|
+ if file_name in _.text:
|
|
|
+ _.click()
|
|
|
+ chose_over = True
|
|
|
+ break
|
|
|
+ if chose_over or len(can_use_button)==0:
|
|
|
+ break
|
|
|
+ # 翻到最后一页时停止
|
|
|
+ page_text = self.driver.find_element_by_class_name('count_small-37CcvfzoTl').text
|
|
|
+ page_nums = re.findall('\d+', page_text)
|
|
|
+ if int(page_nums[0].strip()) == int(page_nums[1].strip()):
|
|
|
+ break
|
|
|
+ # 翻页
|
|
|
+ can_use_button[2].click()
|
|
|
+ # 确保翻页成功
|
|
|
+ WebDriverWait(self.driver, 10).until(
|
|
|
+ lambda x: page_text != self.driver.find_element_by_class_name('count_small-37CcvfzoTl').text)
|
|
|
+
|
|
|
+ self.driver.find_element_by_xpath('//*[@id="test_material_container_confirm"]').click()
|
|
|
+ try:
|
|
|
+ WebDriverWait(self.driver, 4).until(
|
|
|
+ lambda driver: driver.find_element_by_class_name(
|
|
|
+ 'btnFist-uueBS6DQFa'))
|
|
|
+ _ = self.driver.find_element_by_class_name(
|
|
|
+ 'btnFist-uueBS6DQFa')
|
|
|
+ WebDriverWait(self.driver, 4).until(
|
|
|
+ lambda x: (_.is_displayed() and _.is_enabled()))
|
|
|
+ time.sleep(1)
|
|
|
+ _.click()
|
|
|
+
|
|
|
+ WebDriverWait(self.driver, 100).until(
|
|
|
+ lambda driver: driver.find_element_by_class_name(
|
|
|
+ 'btn-3E823IXt3m'))
|
|
|
+ _ = self.driver.find_element_by_class_name(
|
|
|
+ 'btn-3E823IXt3m')
|
|
|
+ WebDriverWait(self.driver, 100).until(
|
|
|
+ lambda x: (_.is_displayed() and _.is_enabled()))
|
|
|
+ time.sleep(1)
|
|
|
+ _.click()
|
|
|
+
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ pass
|
|
|
+ logging.info('头版首页单图上传结束')
|
|
|
|
|
|
def multi_page_set():
|
|
|
self.driver.find_element_by_css_selector(
|
|
@@ -68,32 +135,36 @@ class CreateAd:
|
|
|
from selenium.webdriver.common.keys import Keys
|
|
|
|
|
|
for _ in info_v:
|
|
|
- import os
|
|
|
file_name = os.path.basename(_)
|
|
|
- print(file_name)
|
|
|
- input_find_element.clear()
|
|
|
- print('clear')
|
|
|
- print(input_find_element.get_attribute('value'))
|
|
|
- time.sleep(5)
|
|
|
-
|
|
|
- #TODO:input----clear 进行清空有问题
|
|
|
-
|
|
|
+ logging.info(file_name)
|
|
|
input_find_element.send_keys(file_name)
|
|
|
input_find_element.send_keys(Keys.RETURN)
|
|
|
WebDriverWait(self.driver, 1000).until(
|
|
|
- lambda driver: driver.find_element_by_class_name('imgWrp-3KLtxlD1Db'))
|
|
|
- file_element = self.driver.find_element_by_class_name('imgWrp-3KLtxlD1Db')
|
|
|
+ lambda driver: driver.find_element_by_class_name('img-2HvhMmpnzP'))
|
|
|
+ file_element = self.driver.find_element_by_class_name('img-2HvhMmpnzP')
|
|
|
WebDriverWait(self.driver, 1000).until(
|
|
|
lambda x: (file_element.is_displayed() and file_element.is_enabled()))
|
|
|
-
|
|
|
+ ActionChains(self.driver).move_to_element(file_element).perform()
|
|
|
+ time.sleep(random.uniform(1, 2))
|
|
|
file_element.click()
|
|
|
- time.sleep(random.uniform(1,4))
|
|
|
|
|
|
- time.sleep(1000)
|
|
|
- self.driver.find_elements_by_class_name('adui-tabs-tab')[1].click()
|
|
|
- for i in range(len(info_v)):
|
|
|
- self.driver.find_element_by_xpath("//div[starts-with(@id,'js_multi_upload_material')]/input").send_keys(
|
|
|
- info_v[i])
|
|
|
+ for i in range(len(file_name) + 10):
|
|
|
+ input_find_element.send_keys(Keys.BACKSPACE)
|
|
|
+ time.sleep(random.uniform(1, 4))
|
|
|
+
|
|
|
+ self.driver.find_element_by_xpath('/html/body/div[12]/div/div/div[2]/div/div[3]/button[2]').click()
|
|
|
+ time.sleep(random.uniform(2, 4))
|
|
|
+ # 切图操作如果有的话进行对应操作.
|
|
|
+ for i in range(len(info_v) + 1):
|
|
|
+ try:
|
|
|
+ WebDriverWait(self.driver, 4).until(
|
|
|
+ lambda driver: driver.find_element_by_xpath(
|
|
|
+ '/html/body/div[13]/div/div/div[2]/div/div[3]/button[2]'))
|
|
|
+ self.driver.find_element_by_xpath('/html/body/div[13]/div/div/div[2]/div/div[3]/button[2]').click()
|
|
|
+ except:
|
|
|
+ pass
|
|
|
+
|
|
|
+ logging.info('头版多图选择 结束')
|
|
|
|
|
|
info_key = list(info.keys())[0]
|
|
|
info_v = info[info_key]
|
|
@@ -105,9 +176,81 @@ class CreateAd:
|
|
|
# 设置头部组件
|
|
|
pass
|
|
|
|
|
|
- def set_page(self):
|
|
|
+ def set_page(self, page_path):
|
|
|
# 设置图片模块
|
|
|
- pass
|
|
|
+ self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/section/div[2]/div[1]/div/div').click()
|
|
|
+ time.sleep(random.uniform(0.1, 0.2))
|
|
|
+
|
|
|
+ file_name = os.path.basename(page_path)
|
|
|
+ upload_elements = self.driver.find_elements_by_class_name('upload-img-item-inner-2gsg7NjaZ8')
|
|
|
+ for _ in upload_elements:
|
|
|
+ if _.is_displayed() and _.is_enabled():
|
|
|
+ _.click()
|
|
|
+ WebDriverWait(self.driver, 10).until(
|
|
|
+ lambda x: len([_ for _ in self.driver.find_elements_by_class_name('title-29sncpKgTl') if
|
|
|
+ _.is_displayed() and _.is_enabled()]) > 0)
|
|
|
+
|
|
|
+
|
|
|
+ turn_page_buttons = self.driver.find_elements_by_class_name('paginationIcon-1EfoH0sNRF')
|
|
|
+ can_use_button = []
|
|
|
+ for _ in turn_page_buttons:
|
|
|
+ if _.is_enabled() and _.is_displayed():
|
|
|
+ can_use_button.append(_)
|
|
|
+ # 不断翻页获取到元素为止
|
|
|
+ chose_over = False
|
|
|
+ while True:
|
|
|
+ page_elements = self.driver.find_elements_by_class_name('title-29sncpKgTl')
|
|
|
+ for _ in page_elements:
|
|
|
+ if _.is_displayed() and _.is_enabled():
|
|
|
+ if file_name in _.text:
|
|
|
+ _.click()
|
|
|
+ chose_over = True
|
|
|
+ break
|
|
|
+ if chose_over or len(can_use_button)==0:
|
|
|
+ #can_use_button 数量说明是否可以翻页,如果不可以翻页,则直接停止
|
|
|
+ break
|
|
|
+ # 翻到最后一页时停止
|
|
|
+ page_text_elements = self.driver.find_elements_by_class_name('count_small-37CcvfzoTl')
|
|
|
+ for _ in page_text_elements:
|
|
|
+ if _.is_enabled() and _.is_displayed():
|
|
|
+ page_text = _.text
|
|
|
+ page_text_element = _
|
|
|
+
|
|
|
+ page_nums = re.findall('\d+', page_text)
|
|
|
+ if int(page_nums[0].strip()) == int(page_nums[1].strip()):
|
|
|
+ break
|
|
|
+ # 翻页
|
|
|
+ can_use_button[2].click()
|
|
|
+ # 确保翻页成功
|
|
|
+ WebDriverWait(self.driver, 10).until(
|
|
|
+ lambda x: page_text != page_text_element.text)
|
|
|
+
|
|
|
+ sc_buttons = self.driver.find_elements_by_id('test_material_container_confirm')
|
|
|
+ for _ in sc_buttons:
|
|
|
+ if _.is_enabled() and _.is_displayed():
|
|
|
+ _.click()
|
|
|
+ try:
|
|
|
+ WebDriverWait(self.driver, 4).until(
|
|
|
+ lambda driver: driver.find_element_by_class_name(
|
|
|
+ 'btnFist-uueBS6DQFa'))
|
|
|
+ _ = self.driver.find_element_by_class_name(
|
|
|
+ 'btnFist-uueBS6DQFa')
|
|
|
+ WebDriverWait(self.driver, 4).until(
|
|
|
+ lambda x: (_.is_displayed() and _.is_enabled()))
|
|
|
+ #已经出现但任需要等待
|
|
|
+ time.sleep(1)
|
|
|
+ _.click()
|
|
|
+
|
|
|
+ WebDriverWait(self.driver, 100).until(
|
|
|
+ lambda x: len([_ for _ in self.driver.find_elements_by_class_name('btn-3E823IXt3m') if
|
|
|
+ _.is_displayed() and _.is_enabled()]) > 0)
|
|
|
+ for _ in self.driver.find_elements_by_class_name('btn-3E823IXt3m'):
|
|
|
+ if _.is_displayed() and _.is_enabled():
|
|
|
+ _.click()
|
|
|
+ except Exception as e:
|
|
|
+ logging.info(e)
|
|
|
+ pass
|
|
|
+ logging.info('图片模块设置结束')
|
|
|
|
|
|
def set_title(self):
|
|
|
# 设置标题模块
|
|
@@ -118,6 +261,7 @@ class CreateAd:
|
|
|
pass
|
|
|
|
|
|
def set_follow_button(self):
|
|
|
+ # TODO:先暂定设置三种格式
|
|
|
# 设置关注按钮
|
|
|
pass
|
|
|
|
|
@@ -126,12 +270,12 @@ class CreateAd:
|
|
|
pass
|
|
|
|
|
|
def send_file_multi(self, layout, err_num=0):
|
|
|
+ # 有问题,暂时不使用
|
|
|
# 上传文件,文件上传与整体流程切割开
|
|
|
token = re.findall('token=(\d+)', self.driver.current_url)
|
|
|
url_ = 'https://mp.weixin.qq.com/promotion/frame?t=ad_system/common_frame&t1=material_std/material_library&token={}'.format(
|
|
|
token[0])
|
|
|
js = "window.open('{}')".format(url_)
|
|
|
- print(js)
|
|
|
self.driver.execute_script(js)
|
|
|
time.sleep(random.uniform(1, 2))
|
|
|
self.driver.switch_to.window(self.driver.window_handles[-1])
|
|
@@ -146,11 +290,11 @@ class CreateAd:
|
|
|
else:
|
|
|
file_set.add(v[v_name])
|
|
|
file_list = list(file_set)
|
|
|
- print(file_list)
|
|
|
- print('file list size', len(file_list))
|
|
|
+ # print(file_list)
|
|
|
+ # print('file list size', len(file_list))
|
|
|
send_file_sign = self.send_file_limit_num
|
|
|
for _ in file_list:
|
|
|
- print(_)
|
|
|
+ # print(_)
|
|
|
self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(_)
|
|
|
|
|
|
time.sleep(100)
|
|
@@ -200,6 +344,7 @@ class CreateAd:
|
|
|
self.driver.execute_script('window.close();')
|
|
|
|
|
|
def send_file(self, file_path, err_num=0):
|
|
|
+ # 有问题,暂时不使用
|
|
|
self.driver.execute_script('location.reload();')
|
|
|
self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(file_path)
|
|
|
|
|
@@ -252,13 +397,13 @@ class CreateAd:
|
|
|
layout = {-1: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'},
|
|
|
0: {'title': '这是标题'},
|
|
|
1: {'content': '这是文本'},
|
|
|
- 2: 'follow_button-1',
|
|
|
+ 2: {'follow_button': 1},
|
|
|
3: {'title': '这是标题'},
|
|
|
4: {'content': '这是文本'},
|
|
|
5: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'},
|
|
|
6: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'},
|
|
|
- 7: 'follow_button-2',
|
|
|
- 8: 'follow_button-3',
|
|
|
+ 7: {'follow_button': 2},
|
|
|
+ 8: {'follow_button': 3},
|
|
|
}
|
|
|
# TODO:测试,多图,测试,图文表
|
|
|
layout = {-1: {'multi_page': ['/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg',
|
|
@@ -267,14 +412,43 @@ class CreateAd:
|
|
|
'/usr/share/wallpapers/deepin/Reflection_of_the_Kanas_Lake_by_Wang_Jinyu.jpg']},
|
|
|
0: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'}
|
|
|
}
|
|
|
+ layout = {
|
|
|
+ -1: {'page': '/usr/share/wallpapers/deepin/Reflection_of_the_Kanas_Lake_by_Wang_Jinyu.jpg'},
|
|
|
+ 0: {'page': '/usr/share/wallpapers/deepin/Reflection_of_the_Kanas_Lake_by_Wang_Jinyu.jpg'},
|
|
|
+ 1: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'},
|
|
|
+ 2: {'page': '/usr/share/wallpapers/deepin/The_Gongga_Mountain_by_wangjinyu.jpg'},
|
|
|
+ 3: {'page': '/usr/share/wallpapers/deepin/Reflection_of_the_Kanas_Lake_by_Wang_Jinyu.jpg'},
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
# self.send_file_alone(layout)
|
|
|
self.set_head_assemb(layout[-1])
|
|
|
for _ in range(max(layout.keys())):
|
|
|
- pass
|
|
|
- time.sleep(100)
|
|
|
+ info = layout[_]
|
|
|
+ info_key = list(info.keys())[0]
|
|
|
+ info_v = info[info_key]
|
|
|
+ if info_key == 'page':
|
|
|
+ self.set_page(info_v)
|
|
|
+ if info_key == 'title':
|
|
|
+ self.set_page(info_v)
|
|
|
+ if info_key == 'content':
|
|
|
+ self.set_content(info_v)
|
|
|
+ if info_key == 'follow_button':
|
|
|
+ self.set_follow_button(info_v)
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
+ logging.basicConfig(
|
|
|
+ handlers=[
|
|
|
+ logging.handlers.RotatingFileHandler('./create_ad.log',
|
|
|
+ maxBytes=10 * 1024 * 1024,
|
|
|
+ backupCount=5,
|
|
|
+ encoding='utf-8')
|
|
|
+ , logging.StreamHandler() # 供输出使用
|
|
|
+ ],
|
|
|
+ level=logging.INFO,
|
|
|
+ format="%(asctime)s - %(levelname)s %(filename)s %(funcName)s %(lineno)s - %(message)s"
|
|
|
+ )
|
|
|
+
|
|
|
create_ad = CreateAd()
|
|
|
create_ad.get_layout()
|