【问题标题】:Selenium form submission: additional pictures upload failsSelenium 表单提交:附加图片上传失败
【发布时间】:2021-12-22 09:14:56
【问题描述】:

我们目前正在开展一个项目,该项目包含大量内容,需要上传。我决定通过 selenium+python 脚本自动化这个过程。当我尝试上传图片时会出现一些问题。在脚本的帮助下,我将图片路径传递到输入字段,表单显示图片预览,然后点击提交按钮。

表格是这样的,是用 Lavarel (Backpack Admin Panel) 搭建的,不是我搭建的。

表单截图

第一张图片(名为preview的)通常加载没有问题,但其他(命名为additional)主要有两种失败:

  1. 上传失败:

当我通过 geckodriver 执行此操作时,表单提交成功,但如果我检查它们是否已上传 - 它们不存在。当我使用 chromedriver 执行此操作时,在无限中点击提交按钮 chrome“加载/等待响应”后,脚本控制台似乎也在等待,没有任何异常。

解决此类故障的一种方法是对图片进行额外压缩。有的预览图没有上传完整,还有灰色的部分,所以决定尝试压缩一下。

问题驱动程序是否对上传有一些限制,或者 Lavarel 后端是否看到我不是人类并限制了上传量?因为当我手动操作时,一切正常。

  1. 上传覆盖:

第二个问题要复杂得多。基本上,该应用程序具有由“任务”组成的“天”实例,并且每个任务都有一个预览图片和附加图片。问题基本上是,以某种方式提交的最新任务中的其他图片会自动覆盖先前上传的相同位置的图片。我知道这可能是更多的后端问题,但如果您有一些理论,我将不胜感激。

我的要求是提供关于这个问题变体的任何理论。

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


【解决方案1】:

问题已解决,似乎是后端部分的错误。图像没有被赋予唯一的名称,这会导致重写之前上传的图像。

【讨论】:

    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2013-07-20
    • 2014-12-31
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多