Я написал программу для ссылки на даты, получения соответствующих данных из Excel и ввода на веб-сайте.
Если имеются данные, щелкается первое текстовое поле, вводится точка, вводится клавиша, повтор. Если данных нет, то нажимается кнопка «нет данных», и для данных проверяется следующая дата.
Когда вызывается time.sleep(10)
после нажатия кнопки «нет данных», код работает как положено.
У меня возникают проблемы при замене expected conditions (EC)
на time.sleep(10)
, особенно при попытке ввода данных после нажатия кнопки «нет данных».
Если EC
вызывается в операторе if
для «нет данных», клавиша табуляции постоянно нажимается, и программа прерывается. Если EC
вызывается в операторе else
, используемом для ввода данных (bx_select()....actionchains(browser)
), дальнейший код не выполняется. Если EC
и вызывается функция для щелчка по первому текстовому полю, точка ввода вводится в первое текстовое поле, вводится клавиша табуляции, а затем возвращается к первому текстовому полю.
Есть мысли о том, как исправить?
import time
import pandas as pd
import PySimpleGUI as sg
from tkinter import messagebox
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
#UI
sg.theme('DARKTEAL')
layout = [[sg.Text('Select Student', key='-STUOUTPUT-', font=('Arial', 10))],
[sg.Combo(['A', 'B', 'C','D'], size=(5, None), font=('Arial', 10),
key='-STUIN-')],
[sg.Text('Date to Start Summing', font=('Arial', 10), visible=True),
sg.In(key='-CAL-', size=(12, None), default_text='MM/DD/YYYY')],
[sg.CalendarButton('Calendar', key='-OUTPUT-', target='-CAL-', pad=None, size=(10, None), font=('Arial', 10),
format='%m/%d/%Y')],
[sg.Text('Filename', key='-FOUTPUT-', font=('Arial', 10))],
[sg.In(visible=False),
sg.Input(key='-DIR-', size=(20, None)),
sg.FileBrowse('Browse', target='-DIR-', font=('Arial', 10))],
[sg.OK(font=('Arial', 10)), sg.Cancel(font=('Arial', 10))]]
window = sg.Window('Data Collector', layout, grab_anywhere=False, size=(400, 280), return_keyboard_events=True,
finalize=True)
event, values = window.read()
window['-STUOUTPUT-'](values['-STUIN-'])
window['-OUTPUT-'](values['-CAL-'])
window['-FOUTPUT-'](values['-DIR-'])
acedate = (values['-CAL-'])
stu = (values['-STUIN-'])
file = (values['-DIR-'])
window.close()
browser = webdriver.Chrome()
type(browser)
delay = 20
# erase any existing data
def clear():
ActionChains(browser) \
.send_keys(Keys.BACKSPACE) \
.send_keys(Keys.BACKSPACE) \
.send_keys(Keys.BACKSPACE) \
.perform()
# tab key
def tab():
ActionChains(browser) \
.send_keys(Keys.TAB) \
.perform()
# enter key
def enter():
ActionChains(browser) \
.send_keys(Keys.ENTER) \
.perform()
# scroll page to top
def page_up():
ActionChains(browser) \
.send_keys(Keys.CONTROL + Keys.HOME) \
.perform()
# open excel file selected in UI
df = pd.read_excel(file, Sheet_name=0, header=None)
# wait for page to load
WebDriverWait(browser, delay).until(EC.visibility_of_element_located(
(By.CSS_SELECTOR, 'div.NECCForm:nth-child(5) > div:nth-child(1) > div:nth-child(1) > h5:nth-child(1)')))
# click current date on calendar
sum_start = browser.find_element_by_name('date')
sum_start.click()
# clear date
sum_start.clear()
# enter date selected by user
sum_start.send_keys(str(acedate) + Keys.ENTER)
# wait for page to load
WebDriverWait(browser, delay).until(EC.visibility_of_element_located(
(By.CSS_SELECTOR, 'div.rfForm:nth-child(5) > div:nth-child(1) > div:nth-child(1) > h5:nth-child(1)')))
# click text field for first field
def bx_select():
browser.find_element_by_name('data1_3751').click()
bx_select()
clear()
def autosum():
# length of bx measures
x = len(df.columns)
# number of days in the month
c = len(df.index)
# used to stop once last day of month reached
y = 1
# slices date chosen from calendar (dd) to determine where to start summing
n = int(values['-CAL-'][3:5])
# location of column to start summing
b = 1
# today's date (used to stop once current day is reached)
d = datetime.today().strftime('%Y-%m-%d')
# sum data from date chosen until end of month
while n < c:
# sum data in row excluding last column
while b < x - 1:
# location of [row, column] to start entering data
m = df.iloc[n, b]
# add to column counter
b = b + 1
# stop summing once end of month or current date reached
if n == c or str(pd.to_datetime(df.iloc[n, 0]).date()) == d:
return
# refer to last column in row. if not in program, set as no opportunity day
if df.iloc[n, -1] == 'n':
browser.find_element_by_css_selector('div.stackedMinHeight:nth-child(4) > p:nth-child(1) > a:nth-child(2)').click()
time.sleep(5)
browser.find_element_by_css_selector('#rfDataEntry > div:nth-child(1) > form:nth-child(1) > div:nth-child(3) > button:nth-child(1)').click()
# next row
n = n + 1
# return to second column
b = 1
page_up()
bx_select()
clear()
else:
WebDriverWait(browser, delay).until(EC.visibility_of_element_located(
(By.CSS_SELECTOR,
'div.ZForm:nth-child(5) > div:nth-child(1) > div:nth-child(1) > h5:nth-child(1)')))
bx_select()
# enter data
ActionChains(browser) \
.send_keys(str(m)) \
.perform()
time.sleep(1)
# if all data in row are summed
if b == x - 1:
# next row
n = n + 1
# increase day counter
y = y + 1
# start back at second column
b = 1
enter()
# scroll to top of page
page_up()
# wait for page to load
WebDriverWait(browser, delay).until(EC.visibility_of_element_located(
(By.CSS_SELECTOR,
'div.NECCForm:nth-child(5) > div:nth-child(1) > div:nth-child(1) > h5:nth-child(1)')))
# click first text field
bx_select()
clear()
else:
# if not at end of row, tab to next text field
tab()
time.sleep(0.5)
autosum()