Python не отправляет ключи из словаря

1

Я пытаюсь автоматизировать задачу с селеном. Мой код будет разбит на функции, которые я определил.

Сначала я прочитал лист excel и сохранил эти данные в словаре как строки.

def get_excel():
    d = defaultdict(list)

    workbook = openpyxl.load_workbook(sys.argv[1])
    sheet = workbook.get_sheet_by_name('Sheet1')

    row_count = sheet.max_row
    for r in range(2, row_count + 1):
        d[str(sheet.cell(r, 4).value)].append((str(sheet.cell(r, 1).value), str(sheet.cell(r, 2).value), str(sheet.cell(r, 3).value)))
    return d

Теперь у меня есть отдельная функция, которая получает данные от excel:

def get_emp_data(FirstName, LastName, Email1, EmployeeID, driver):
    f_name = driver.find_element_by_name('f_name')
    l_name = driver.find_element_by_name('l_name')
    email = driver.find_element_by_name('contact_id.email')
    employeeID = driver.find_element_by_name('contact_id.custom')

    time.sleep(5)
    #writing in the fields
    f_name.send_keys(FirstName)
    l_name.send_keys(LastName)
    email.send_keys(Email1)
    employeeID.send_keys(EmployeeID)

    #clicking save button
    save = driver.find_element_by_id('saveButton').click()

    driver.get('link to web address')

Затем у меня есть функция, которая выполняет автоматизацию. Он передает данные с листа excel.

def log_in():
    chrome_path = ("C:\\chromedriver.exe")

    driver = webdriver.Chrome(chrome_path)
    driver.get("link to web address")

    #setting variables for username and password fields
    username = driver.find_element_by_name('login')
    password = driver.find_element_by_name('password')

    #input email and password
    username.send_keys("my email")
    password.send_keys("my password")

    #click submit
    driver.find_element_by_id('submitButton').click()

    #click New Customer Button
    time.sleep(5)
    driver.find_element_by_id('newCustomerButton').click()
    return driver

Наконец, я включил все в основную функцию:

def main():
    excel_data = get_excel()
    driver = log_in()
    time.sleep(2)
    for EmployeeID in excel_data:
        try:
            get_emp_data(excel_data[EmployeeID][0], excel_data[EmployeeID][1], excel_data[EmployeeID][2], EmployeeID, driver)
        continue
    except:
        print(FirstName)

Затем я вызываю main()

main()

Код делает все, что нужно, помимо записи в значениях из excel. Он должен log_in(), использовать первую строку данных из excel, нажать "Сохранить", перейти к следующей странице редактирования и использовать следующую строку данных из excel и сохранить снова, пока в Excel не будет больше данных. Я думаю, что что-то не так с тем, как я передаю данные в свои функции. Любая помощь приветствуется

  • 0
    Есть ли ошибка?
  • 0
    Нет, я не очень хорош в программировании и не уверен в обработке ошибок и ошибках печати. Все, что я знаю, это то, что автоматизация работает для всего, кроме отправки текста, и это заставляет меня поверить, что именно так словарь передается моим функциям.
Показать ещё 5 комментариев
Теги:
selenium
selenium-webdriver
dictionary

1 ответ

0
Лучший ответ

Я решил все проблемы с этой ошибкой, и код/​​процесс автоматизации работает отлично! Разрешенный код приведен ниже:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from collections import defaultdict
import openpyxl
import time
import os
import sys
import traceback

def get_excel():
    d = defaultdict(list)

    workbook = openpyxl.load_workbook(sys.argv[1])
    sheet = workbook.get_sheet_by_name('Sheet1')

    row_count = sheet.max_row
    for r in range(2, row_count + 1):
        d[(sheet.cell(r, 1).value), (sheet.cell(r, 2).value), (sheet.cell(r, 3).value), (sheet.cell(r, 4).value)]
    return d

def get_emp_data(FirstName, LastName, Email1, EmployeeID, driver):
    emp_type = driver.find_element_by_xpath("//select[@id='name_of_id']/option[text()='option_name']").click()
    f_name = driver.find_element_by_name('f_name')
    l_name = driver.find_element_by_name('l_name')
    email = driver.find_element_by_name('contact_id.email')
    employeeID = driver.find_element_by_name('contact_id.custom')

    f_name.send_keys(FirstName)
    l_name.send_keys(LastName)
    email.send_keys(Email1)
    employeeID.send_keys(EmployeeID)

    save = driver.find_element_by_id('saveButton').click()

def log_in():
    chrome_path = ("C:\chromedriver.exe")

    driver = webdriver.Chrome(chrome_path)
    driver.get("link to webpage")

    username = driver.find_element_by_name('login')
    password = driver.find_element_by_name('password')

    username.send_keys("username")
    password.send_keys("password")

    driver.find_element_by_id('submitButton').click()

    time.sleep(5)
    driver.find_element_by_id('newCustomerButton').click()

    return driver

def main():
    excel_data = get_excel()
    driver = log_in()
    time.sleep(3)
    for EmployeeID in excel_data:
        try:
            get_emp_data(EmployeeID[0], EmployeeID[1], EmployeeID[2], EmployeeID[3], driver)
            time.sleep(3)
            driver.get("link to webpage")
            time.sleep(5)
            driver.find_element_by_id('newCustomerButton').click()
            time.sleep(2)
            continue
        except:
            driver.quit()
    driver.get("link to webpage")

main()
  • 0
    Просто небольшая обратная связь, поскольку вчера я фактически не закрывал вкладку, это определенно не то, как использовать dict, ха-ха, лучше было бы использовать список ( d[(sheet.cell(r, 1).value), (sheet... to lst.append((sheet.cell(r, 1).value), (sheet... ). Также вы можете не знать, что вместо for EmployeeID in excel_data вы также можете сделать for FirstName, LastName, Email1, EmployeeID in excel_data , что упрощает чтение того, что к чему :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню