【发布时间】:2021-12-22 09:14:56
【问题描述】:
我们目前正在开展一个项目,该项目包含大量内容,需要上传。我决定通过 selenium+python 脚本自动化这个过程。当我尝试上传图片时会出现一些问题。在脚本的帮助下,我将图片路径传递到输入字段,表单显示图片预览,然后点击提交按钮。
表格是这样的,是用 Lavarel (Backpack Admin Panel) 搭建的,不是我搭建的。
表单截图
第一张图片(名为preview的)通常加载没有问题,但其他(命名为additional)主要有两种失败:
- 上传失败:
当我通过 geckodriver 执行此操作时,表单提交成功,但如果我检查它们是否已上传 - 它们不存在。当我使用 chromedriver 执行此操作时,在无限中点击提交按钮 chrome“加载/等待响应”后,脚本控制台似乎也在等待,没有任何异常。
解决此类故障的一种方法是对图片进行额外压缩。有的预览图没有上传完整,还有灰色的部分,所以决定尝试压缩一下。
问题驱动程序是否对上传有一些限制,或者 Lavarel 后端是否看到我不是人类并限制了上传量?因为当我手动操作时,一切正常。
- 上传覆盖:
第二个问题要复杂得多。基本上,该应用程序具有由“任务”组成的“天”实例,并且每个任务都有一个预览图片和附加图片。问题基本上是,以某种方式提交的最新任务中的其他图片会自动覆盖先前上传的相同位置的图片。我知道这可能是更多的后端问题,但如果您有一些理论,我将不胜感激。
我的要求是提供关于这个问题变体的任何理论。
geckodriver脚本代码:
from numpy import NaN
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
import pandas as pd
import os
### Загрузка excel документа
df = pd.read_excel(os.getcwd()+"/program.xlsx", sheet_name="Лист1",header=None)
task_count = df.iat[3,0]
series = df.iat[3,1]
theme = str(df.iat[3,2])
age = df.iat[3,4]
theme_descr = df.iat[1,2]
date= str(df.iat[3,3])
### Функция перевода текста в html разметку для wysiwyg-редактора
def task_formatter(string):
if "*" in string:
final_string=""
final_string=final_string+string[:string.find("*")-1].replace("\n","<br>")+"<ul>"
string = string[string.find("*"):]
while "*" in string:
final_string+= string[:string.find("\n")+1].replace("*","<li>").replace("\n","</li>")
string =string[string.find("\n")+1:]
if "\n" not in string and "*" in string:
final_string+=string.replace("*","<li>")+"</li></ul>"
string=""
if "*" not in string and string != "":
final_string+="</ul><br>"+string
string=""
final_string+="</p>"
else:
final_string="<p>"+string.replace("\n","<br>")+"<p>"
return final_string
### Проверка файла
def check_file():
no_problem = True
try:
f = open(os.getcwd()+"/pdf/prog.pdf")
except:
print("prog.pdf отсуствует")
no_problem = False
try:
f = open(os.getcwd()+"/pdf/print.pdf")
except:
print("print.pdf отсуствует")
no_problem = False
try:
f = open(os.getcwd()+"/img/cover.jpg")
except:
print("cover.jpg отсуствует")
no_problem = False
if no_problem: print("Обожка и файлы под загрузку на месте")
else: print("Есть ошибки")
for col in range(0,3):
for row in range(6, 6+task_count-1):
a=df.iat[row,col]
if str(a)=="nan":
print("Есть пустая ячейка (ряд: "+str(row+1)+", колонка: "+str(col+1)+") продолжать? [y/n]")
no_problem = False
for col in range(5,7):
for row in range(6, 6+task_count-1):
a=df.iat[row,col]
if str(a)=="nan":
print("Есть пустая ячейка (ряд: "+str(row+1)+", колонка: "+str(col+1)+") продолжать? [y/n]")
no_problem = False
if no_problem: print("Пустых ячеек нет")
else: print("Есть ошибки")
for row in range(6, 6+task_count-1):
task_number = df.iat[row, 0]
pic_number = df.iat[row, 7]
if pic_number > 1:
for i in range(1,pic_number+1):
try:
f=open(os.getcwd()+"/img/"+str(task_number)+"."+str(i)+".jpg")
print(str(task_number)+"."+str(i)+".jpg")
except:
print("Нет картинки: "+str(task_number)+"."+str(i)+".jpg")
no_problem = False
elif pic_number == 0:
print("Картинка не нужна, зеленая задача")
else:
try:
f=open(os.getcwd()+"/img/"+str(task_number)+".jpg")
print(str(task_number)+".jpg")
except:
print("Нет картинки: "+str(task_number)+".jpg")
no_problem = False
return no_problem
### Вход на сайт
def site_start():
driver.get("http://system.mr-leader.com/admin/")
if "Увійти" in driver.title:
elem=driver.find_element(By.ID,"email")
elem.clear()
elem.send_keys("***")
elem=driver.find_element(By.ID,"password")
elem.clear()
elem.send_keys("***")
sleep(1)
elem.send_keys(Keys.RETURN)
sleep(1)
else:
print("Вход не требуется")
### Создание списка задач
task_names = []
def create_series():
driver.get("http://system.mr-leader.com/public/admin/seria")
elem = driver.find_element(By.XPATH, "//input[@type='search']")
elem.clear()
elem.send_keys(series)
is_not_loaded = True
series_already_created = False
while is_not_loaded:
sleep(0.5)
try:
elem = driver.find_element(By.CLASS_NAME, "dataTables_empty")
is_not_loaded = False
except:
sleep(0.5)
try:
elem = elem = driver.find_element(By.CLASS_NAME, "odd")
series_already_created = True
is_not_loaded = False
except:
print("Ждем загрузки серии")
if series_already_created is not True:
driver.get("http://system.mr-leader.com/public/admin/seria/create")
elem = driver.find_element(By.NAME, "name")
elem.send_keys(series)
driver.find_element(By.CLASS_NAME, "select2-selection").click()
sleep(1)
driver.find_element(By.XPATH, "/html/body/span/span/span[2]/ul/li["+str(age)+"]").click()
driver.find_element(By.LINK_TEXT, "SEO").click()
elem = driver.find_element(By.NAME, "meta_title")
elem.send_keys(series)
elem = driver.find_element(By.CLASS_NAME, "btn-success")
elem.click()
### Создание программы
def create_program():
driver.get("http://system.mr-leader.com/public/admin/program/create")
elem = driver.find_element(By.NAME,"name")
elem.send_keys(theme)
driver.find_element(By.CLASS_NAME, "select2-selection").click()
sleep(1)
elem = driver.find_element(By.CLASS_NAME, "select2-search__field")
elem.send_keys(series)
elem.send_keys(Keys.RETURN)
elem = driver.find_element(By.NAME,"pdf")
elem.send_keys(os.getcwd()+"/pdf/prog.pdf")
elem = driver.find_element(By.NAME,"pdf2")
elem.send_keys(os.getcwd()+"/pdf/print.pdf")
elem = driver.find_element(By.XPATH,"//input[@accept='image/*']")
elem.send_keys(os.getcwd()+"/img/cover.jpg")
#Вставка даты, в разработке
#driver.find_element(By.LINK_TEXT,"Календар").click()
#driver.find_element(By.XPATH,"//div[@id='tab_kalendar']//button").click()
#elem = driver.find_element(By.XPATH,"//div[@id='tab_kalendar']//input[@type='date']")
#elem.click()
#elem.send_keys(date)
sleep(1)
driver.find_element(By.LINK_TEXT,source_text).click()
sleep(0.3)
elem=driver.find_element(By.CLASS_NAME,"cke_source")
#elem=driver.find_element(By.XPATH,"//div[@id='tab_osnovne']//div[@cke_description]//textarea")
elem.click()
elem.clear()
elem.send_keys(task_formatter(theme_descr))
driver.find_element(By.LINK_TEXT,"SEO").click()
elem = driver.find_element(By.NAME,"meta_description")
elem.send_keys(theme_descr[0:500])
driver.find_element(By.CLASS_NAME,"btn-success").click()
### Создание задач
def fill_tasks(s_task,e_task):
start_row=6
e_task+=start_row
s_task+=start_row-1
for row in range(s_task,e_task):
task_fill_in_process = True
while task_fill_in_process:
try:
num_col=0
name_col=1
text_col=2
rec_col=4
time_col=5
img_col=6
img_count_col=7
task_name = df.iat[row,name_col]
task_text= df.iat[row,text_col]
task_number = df.iat[row,num_col]
task_is_green = False
task_expand = False
if "Підготовка" in str(task_number): task_is_green = True
task_rec=str(df.iat[row,rec_col])
if task_rec == "nan": task_rec=""
task_time=""
if df.iat[row,time_col] != "00:00":
task_time=str(df.iat[row,time_col]).replace(":","")
task_search_name = " ".join((series,theme,str(task_number),task_name))
task_names.append(task_search_name)
if df.iat[row,img_col] == "+": task_expand = True
task_img_count = df.iat[row,img_count_col]
has_multiple_image = False
if task_img_count >1:
has_multiple_image = True
task_img_count+=1
driver.get("http://system.mr-leader.com/admin/task/create")
sleep(1)
elem = driver.find_element(By.NAME,"name")
elem.send_keys(task_search_name)
elem = driver.find_element(By.NAME,"title")
elem.send_keys(task_name)
if task_time != "":
elem = driver.find_element(By.NAME,"time")
elem.click()
sleep(0.3)
elem.send_keys(task_time)
sleep(1)
driver.find_element(By.LINK_TEXT, source_text).click()
sleep(0.3)
elem=driver.find_element(By.CLASS_NAME,"cke_source")
elem.click()
elem.clear()
elem.send_keys(task_formatter(task_text))
driver.switch_to.default_content()
elem = driver.find_element(By.NAME,"info")
elem.send_keys(str(task_rec))
sleep(10)
if task_is_green:
print("Green")
driver.find_element(By.LINK_TEXT,"Розбити завдання").click()
driver.find_element(By.XPATH,"//*[@id='cke_93']").click()
sleep(0.3)
elem=driver.find_element(By.XPATH,"//textarea[@title='"+source_text_field+"']")
elem.click()
elem.clear()
elem.send_keys(task_formatter(task_text))
else:
print(str(row))
sleep(0.3)
driver.find_element(By.LINK_TEXT,"Зображення").click()
sleep(0.3)
if has_multiple_image:
driver.find_element(By.XPATH,"//div[@class='btn-group']/div/input").send_keys(os.getcwd()+"/img/"+str(task_number)+".1.jpg")
for i in range(1, task_img_count):
sleep(0.3)
if i !=1: driver.find_element(By.CLASS_NAME,"add-repeatable-element-button").click()
driver.find_element(By.XPATH,"//div[@data-row-number='"+str(i)+"']/div/div/div/input").send_keys(os.getcwd()+"/img/"+str(task_number)+"."+str(i)+".jpg")
else:
driver.find_element(By.XPATH,"//div[@class='btn-group']/div/input").send_keys(os.getcwd()+"/img/"+str(task_number)+".jpg")
sleep(0.3)
if task_expand:
driver.find_element(By.XPATH,"//div[@data-row-number='1']/div/div/div/input").send_keys(os.getcwd()+"/img/"+str(task_number)+".jpg")
sleep(0.3)
task_fill_in_process=False
except:
print("Ошибка, повторить заполнение задачи? [y/n]")
if input()=="n":
task_fill_in_process=False
else:
task_fill_in_process=True
driver.find_element(By.CLASS_NAME,"btn-success").click()
### Привязка задач
def assign_tasks():
task_names=[]
for row in range(0,task_count):
row=row+6
num_col=0
name_col=1
task_name = df.iat[row,name_col]
task_number = df.iat[row,num_col]
task_search_name = " ".join((series,theme,str(task_number),task_name))
task_names.append(task_search_name)
sleep(1)
driver.get("http://system.mr-leader.com/admin/program/")
elem = driver.find_element(By.XPATH,"//input[@type='search']")
elem.send_keys(theme)
sleep(2)
try:
driver.find_element(By.LINK_TEXT,"Редагувати").click()
except:
print("Не находит ссылку на редактирование программы, растяните окно и нажмите enter")
input()
driver.find_element(By.LINK_TEXT,"Редагувати").click()
sleep(3)
driver.find_element(By.LINK_TEXT,"Завдання").click()
row_number=1
for row in task_names:
driver.find_element(By.CLASS_NAME,"add-repeatable-element-button").click()
driver.find_element(By.XPATH,"//div[@data-row-number='"+str(row_number)+"']/div[2]/span/span[1]/span").click()
elem = driver.find_element(By.CLASS_NAME,"select2-search__field")
row_number+=1
elem.click()
elem.send_keys(row)
loading=True
time_wait=0
while loading:
try:
elem = driver.find_element(By.CLASS_NAME, "loading-results")
sleep(0.5)
time_wait+=0.5
print(time_wait)
except:
loading=False
sleep(0.5)
print("Loading ended")
elem = driver.find_element(By.CLASS_NAME,"select2-search__field")
elem.send_keys(Keys.RETURN)
sleep(1)
driver.find_element(By.CLASS_NAME,"btn-success").click()
if check_file():
print("Проверка прошла успешно, начать скрипт? [y/n]")
if input()=="y":
driver = webdriver.Chrome(os.getcwd()+"/drivers/chromedriver")
source_text="Джерело"
source_text_field="Текстовий редактор, col1"
site_start()
print("Введите 'ru' или 'ukr':")
if input()=="ru":
source_text="Источник"
source_text_field="Визуальный текстовый редактор, col1"
create_series()
create_program()
fill_tasks(1, task_count)
#print(task_names)
assign_tasks()
【问题讨论】:
-
你的程序太难理解和阅读,我建议你做一个小程序来上传一张图片并检查是否存在..
标签: python selenium selenium-webdriver selenium-chromedriver geckodriver