Python Selenium条件循环仅遍历子集

时间:2020-04-15 23:20:35

标签: python selenium selenium-webdriver

我编写了一个程序来引用日期,从Excel中提取相应的数据,并在网站上输入。

如果有数据,请单击第一个文本字段,输入数据,键入选项卡,然后重复。如果没有任何数据,则单击“无数据”按钮,然后检查下一个日期是否有数据。

在单击“无数据”按钮后调用time.sleep(10)时,代码将按预期工作。

expected conditions (EC)换成time.sleep(10)时遇到麻烦,特别是在单击“无数据”按钮后尝试输入数据时。

如果在EC语句中为“无数据”调用if,则将连续键入制表符,并且程序将中断。如果在用于输入数据的EC语句中调用elsebx_select()....actionchains(browser)),则不会执行其他代码。 如果调用EC并单击用于单击第一个文本字段的函数,则在第一个文本字段中输入数据,然后键入Tab键,然后返回第一个文本字段。

对如何解决有什么想法?

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()

0 个答案:

没有答案
相关问题