用于Python和Selenium的HTML用户输入
我有一个python应用程序,它使用PySimpleGUI获取用户输入(名称、日期和文件),浏览网站,并根据给定的输入输入数据。我希望在pythonanywhere上运行这个程序,但是由于gui不受支持,我需要找到另一种方法来获取用户的输入。我已经创建了一个HTML web表单,但不确定如何继续 1) 使用用于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
request.get
是否可以获得名称、日期和文件
2) Selenium不控制通过提交HTML表单打开的网页。我需要显式调用browser(打开)。因为Selenium没有绑定到打开的HTML页面,所以代码在提交web表单之前执行,我得到一个超时异常。对于以前使用的GUI,剩余的代码在提交后才会执行(这是理想的)
我想:
- 使用Selenium控制通过提交HTML表单打开的网页
- 在提交HTML表单之前停止运行我的代码。提交后,关闭表单并运行代码
<!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()