Я пытаюсь автоматизировать задачу с селеном. Мой код будет разбит на функции, которые я определил.
Сначала я прочитал лист 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 не будет больше данных. Я думаю, что что-то не так с тем, как я передаю данные в свои функции. Любая помощь приветствуется
Я решил все проблемы с этой ошибкой, и код/процесс автоматизации работает отлично! Разрешенный код приведен ниже:
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()
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
, что упрощает чтение того, что к чему :)