Я пытаюсь создать сценарий Python, который читает файл Excel и сохраняет данные в словаре. У меня все построено, но когда мой скрипт запущен, веб-страница открывается на нужной странице и больше не двигается. Все мои элементы найдены, и код записывается в поля, когда я запускаю построчно.

Мои столбцы Excel: Имя, Фамилия, Email1, EmployeeID

Мой скрипт на python, который я написал:

#Importing necessary tools
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from collections import defaultdict
import openpyxl
import time
import os
import sys

#loading the data from the excel
def read_excel():
    d = defaultdict(list)
    workbook = openpyxl.load_workbook("path of the excel file")
    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

#Load all employees information from excel sheet
def load_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')
    #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()

def mark_iteration():
    file = open('iterations.txt', 'r+')
    num = file.read()
    file.seek(0)
    file.write(str(int(num) + 1))
    file.truncate()
    file.close()

def mark_failed(EmployeeID):
   file = open('failed.txt', 'a')
   file.write(EmployeeID + '\n')
   file.close()
   #sign into Lightspeed Customer Page

def sign_in():
   #get to the Lightspeed customer page
   chrome_path = ('C:\\chromedriver.exe')
   driver = webdriver.Chrome(chrome_path)
   driver.get("link to my webpage")
   #input email and password
    username = driver.find_element_by_name('login')
    password = driver.find_element_by_name('password')
    username.send_keys("login")
    password.send_keys("password")
    #click submit
    driver.find_element_by_id('submitButton').click()
    #click New Customer Button
    driver.find_element_by_id('newCustomerButton').click()
    return driver

def main():
    excel_data = read_excel()
    driver = sign_in()
    time.sleep(10)
    for EmployeeID in excel_data:
        try:
            load_emp_data(EmployeeID, excel_data[EmployeeID][0], driver)
            mark_iteration()
        except:
            mark_failed(EmployeeID)
            continue
main()

Когда я запускаю этот модуль, веб-страница открывается и не перемещается туда. Мой файл fail.txt показывает 5 результатов идентификаторов сотрудников, что означает, что он не удался ни на одном. Любые идеи относительно того, почему этот сценарий не завершается от начала до конца?

Я добавил трассировку стека и решил индекс списка из-за ошибки диапазона. Теперь это то, что дает PowerShell. Это дает мне эти 4 объекта генератора и затем закрывает веб-страницу, как будто это закончено.

<generator object main.<locals>.<genexpr> at 0x04C78530>
<generator object main.<locals>.<genexpr> at 0x04C78530>
<generator object main.<locals>.<genexpr> at 0x04C78530>
<generator object main.<locals>.<genexpr> at 0x04C78530>

Я получаю правильную информацию, напечатанную из моего словаря:

defaultdict(<class 'list'>, {'Xxxxxx': [('John', 'Doe', 'john.doe@email.com')]

Почему скрипт не берет эту информацию и пишет в браузер, я не знаю.

1
TP34 20 Авг 2018 в 22:06

3 ответа

Лучший ответ

Я решил все проблемы этого кода. Процесс отлично работает!

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
TP34 23 Авг 2018 в 20:03

РЕДАКТИРОВАТЬ 3 - Вы не передаете правильные значения своей функции Определение функции

load_emp_data(FirstName, LastName, Email1, EmployeeID, driver)

Назовите это в вашем последнем цикле

load_emp_data(excel_data[EmployeeID][0], excel_data[EmployeeID][1], excel_data[EmployeeID][2], EmployeeID, driver)

Оригинальный ответ Ваша программа не выполняется после этой точки - внутри функции sign_in

return driver 

Код ниже, который пытается получить все элементы. Это даже не выполнение, потому что функция заканчивается там. Вы можете попробовать переместить оператор return в конец функции sign_in. Это откроет браузер.

РЕДАКТИРОВАТЬ - Кроме того, при обнаружении исключения всегда следует пытаться сохранить трассировку стека ошибок, поскольку ее полное переопределение затрудняет отладку программы для других.

РЕДАКТИРОВАНИЕ 2 - удалено создание предложения класса драйвера

0
AnkDasCo 21 Авг 2018 в 20:18

Отступы вашего кода, похоже, испорчены, и я бы посоветовал исправить это, поскольку отступы важны в Python.

Однако, похоже, что вы возвращаете driver из sign_in до того, как фактически введете информацию для входа в систему и пароль. Это может привести к неправильному состоянию драйвера при попытке вызвать load_emp_data, что приведет к его отказу.

1
Izaak Weiss 20 Авг 2018 в 19:20
51937046