Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于Python和Selenium的HTML用户输入_Python_Html_Selenium_Selenium Webdriver - Fatal编程技术网

用于Python和Selenium的HTML用户输入

用于Python和Selenium的HTML用户输入,python,html,selenium,selenium-webdriver,Python,Html,Selenium,Selenium Webdriver,我有一个python应用程序,它使用PySimpleGUI获取用户输入(名称、日期和文件),浏览网站,并根据给定的输入输入数据。我希望在pythonanywhere上运行这个程序,但是由于gui不受支持,我需要找到另一种方法来获取用户的输入。我已经创建了一个HTML web表单,但不确定如何继续 1) 使用request.get是否可以获得名称、日期和文件 2) Selenium不控制通过提交HTML表单打开的网页。我需要显式调用browser(打开)。因为Selenium没有绑定到打开的HTM

我有一个python应用程序,它使用PySimpleGUI获取用户输入(名称、日期和文件),浏览网站,并根据给定的输入输入数据。我希望在pythonanywhere上运行这个程序,但是由于gui不受支持,我需要找到另一种方法来获取用户的输入。我已经创建了一个HTML web表单,但不确定如何继续

1) 使用
request.get
是否可以获得名称、日期和文件

2) Selenium不控制通过提交HTML表单打开的网页。我需要显式调用browser(打开)。因为Selenium没有绑定到打开的HTML页面,所以代码在提交web表单之前执行,我得到一个超时异常。对于以前使用的GUI,剩余的代码在提交后才会执行(这是理想的)

我想:

  • 使用Selenium控制通过提交HTML表单打开的网页

  • 在提交HTML表单之前停止运行我的代码。提交后,关闭表单并运行代码
有什么想法吗

下面我介绍了HTML文件、我正在尝试使用的Python代码,以及使用PySimpleGUI实现所需功能的程序的相关部分

<!DOCTYPE html>
<html>
<body>

<label for="opt_select">Select an Option:</label>
<select id="opt"
        name="opt_list">
  <option value="AA">AA</option>
  <option value="BB">BB</option>
  <option value="CC">CC</option>
</select>

</body>

<form action="/action_page.php">
  <label>Date:</label>
  <input type="date" id="sum_date" name="sum_start">
</form>
</body>
<form target="_blank" action="http://awebsite"
      method="post" id="submitted_form"
      name="submission" class="validate">
</form>
<form>
  <label for="myfile">Select a file:</label>
  <input type="file" id="myfile" name="myfile"><br><br>
  <input type="submit">
</form>
</html>
将tkinter作为tk导入
导入时间
作为pd进口熊猫
将PySimpleGUI导入为sg
从日期时间导入日期时间
从selenium导入webdriver
从selenium.webdriver.common.keys导入密钥
从selenium.webdriver.common.action\u链导入ActionChains
从selenium.webdriver.support.ui导入WebDriverWait
从selenium.webdriver.support将预期的_条件导入为EC
从selenium.webdriver.common.by导入
sg.theme('DARKTEAL'))
布局=[[sg.Text('Select Student',key='-stoutput-',font=('Arial',10))],
[sg.Combo(['AA','BB','CC','DD'],大小=(5,无),字体=('Arial',10),
键='-OPT-')],
[sg.Text('开始求和的日期',字体=('Arial',10),可见=真),
sg.In(键='-CAL-',大小=(12,无),默认值为_text='MM/DD/YYYY')],
[sg.CalendarButton('Calendar',key='-OUTPUT-',target='-CAL-',pad=None,size=(10,None),font=('Arial',10),
格式=“%m/%d/%Y”)],
[sg.Text('Filename',key='-FOUTPUT-',font=('Arial',10)),
[sg.In(可见=假),
输入(键='-DIR-',大小=(20,无)),
sg.FileBrowse('Browse',target='-DIR-',font=('Arial',10)),
[sg.OK(字体=('Arial',10)),sg.Cancel(字体=('Arial',10))]
window=sg.window('Data Collector',layout,grab\u anywhere=False,size=(400280),return\u keyboard\u events=True,
最终确定=真)
事件,值=window.read()
窗口['-STUOUTPUT-'](值['-STUIN-'])
窗口['-OUTPUT-'](值['-CAL-'])
窗口['-FOUTPUT-'](值['-DIR-'])
acedate=(值['-CAL-'])
opt=(值['-opt-'])
文件=(值['-DIR-'])
window.close()
browser=webdriver.Chrome()
browser.get('awebsite')
类型(浏览器)
延迟=20
df=pd.read\u excel(文件,工作表名称=0,页眉=None)
def bx_select():
如果数据==“AA”:
WebDriverWait(浏览器,延迟)。直到(EC.元素的存在位置((By.ID,'AALanding'))
浏览器。按\u id(“AALanding”)查找\u元素。\u。单击()
如果数据==“BB”:
WebDriverWait(浏览器,延迟)。直到(例如,存在位于((By.ID,'BBLanding'))的元素)
浏览器。按\u id('BBLanding')查找\u元素。单击()
如果数据==“CC”:
WebDriverWait(浏览器,延迟)。直到(EC.存在位于((By.ID,'CCLanding'))的元素)
浏览器。按\u id(“CCLanding”)查找\u元素。\u。单击()
def clear():
动作链(浏览器)\
.发送密钥(密钥。清除)\
.perform()
def选项卡():
动作链(浏览器)\
.发送密钥(密钥选项卡)\
.perform()
def enter():
动作链(浏览器)\
.发送密钥(密钥。输入)\
.perform()
def page_up():
动作链(浏览器)\
.发送按键(按键。控制+按键。主页)\
.perform()
bx_选择()
清除()
def autosum():
#bx度量的长度
x=长度(测向列)
#用于确定何时位于行的末尾
z=1
#要开始求和的列的位置
b=1
#当月天数
c=长度(测向指数)
#用于在月的最后一天停止一次
y=1
#从日历(dd)中选择日期,以确定从何处开始求和
n=int(值['-CAL-'][3:5])
#今天的日期(用于到达当前日期后停止)
d=datetime.today().strftime(“%Y-%m-%d”)
当ndiv:n个孩子(1)>div:n个孩子(1)>h5:n个孩子(1)’)
bx_选择()
清除()
其他:
tab()
睡眠时间(0.5)
autosum()

所以在我看来,这个问题更多的是关于烧瓶,而不是硒或HTML。您似乎希望允许用户在HTML表单上输入数据,并允许该表单在python脚本中调用某些函数。你做这件事不难。我相信这很好地解决了你的问题

一旦表单调用了所需的脚本,就可以使用该方法上的输入数据启动selenium,并让它在所需的位置输入数据

这就是你要找的吗?

那么
    import pandas as pd
    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
    from flask import Flask, render_template, request

    app = Flask(__name__)

    @app.route('/hello', methods=['POST'])
    def hello():
        return render_template('gui.html')

    def user_data():
        data = request.GET['opt_list']

    browser = webdriver.Chrome()
    browser.get('https:/awebsite')
    type(browser)
    delay = 20

    if data == "AA":
        WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'AALanding')))
        browser.find_element_by_id('AALanding').click()
    if data == "BB":
        WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'BBLanding')))
        browser.find_element_by_id('BBLanding').click()
    if data == "CC":
        WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'CCLanding')))
        browser.find_element_by_id('CCLanding').click()

    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=3000)

import tkinter as tk
import time
import pandas as pd
import PySimpleGUI as sg
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

sg.theme('DARKTEAL')
layout = [[sg.Text('Select Student', key='-STUOUTPUT-', font=('Arial', 10))],
          [sg.Combo(['AA', 'BB', 'CC', 'DD'], size=(5, None), font=('Arial', 10),
                    key='-OPT-')],
          [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-'])
opt = (values['-OPT-'])
file = (values['-DIR-'])
window.close()

browser = webdriver.Chrome()
browser.get('awebsite')
type(browser)

delay = 20

df = pd.read_excel(file, Sheet_name=0, header=None)

def bx_select():
    if data == "AA":
    WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'AALanding')))
    browser.find_element_by_id('AALanding').click()
if data == "BB":
    WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'BBLanding')))
    browser.find_element_by_id('BBLanding').click()
if data == "CC":
    WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'CCLanding')))
    browser.find_element_by_id('CCLanding').click()

def clear():
    ActionChains(browser) \
        .send_keys(Keys.CLEAR) \
        .perform()
def tab():
    ActionChains(browser) \
        .send_keys(Keys.TAB) \
        .perform()
def enter():
    ActionChains(browser) \
        .send_keys(Keys.ENTER) \
        .perform()
def page_up():
    ActionChains(browser) \
        .send_keys(Keys.CONTROL + Keys.HOME) \
        .perform()

bx_select()

clear()


def autosum():
    # length of bx measures
    x = len(df.columns)
    # used to determine when at end of row
    z = 1
    # location of column to start summing
    b = 1
    # 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])
    # today's date (used to stop once current day is reached)
    d = datetime.today().strftime('%Y-%m-%d')

    while n < c:
        while z < x:
            m = df.iloc[n, b]
            z = z + 1
            b = b + 1
            if pd.isnull(m):
                tab()
                continue
            else:
                ActionChains(browser) \
                    .send_keys(str(m)) \
                    .perform()
            if z == x:
                n = n + 1
                y = y + 1
                z = 1
                b = 1
                enter()
                page_up()
                if n == c or str(pd.to_datetime(df.iloc[n, 0]).date()) == d:
                    return
                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()
                clear()
            else:
                tab()
                time.sleep(0.5)
autosum()