我正在进行一个项目,以自动登录到几个网站并在这些网站中创建用户。在我看来,Selenium是在跳行,而不是在等待控制台中的用户输入。我已经用python注释标记了它跳过的区域。我还用一般信息取代了具体信息。我需要做些什么来强制Selenium等待控制台输入吗?或者这是一个错误吗?如有任何建议,我们将不胜感激。此外,作为一个整体,我对Python还比较陌生,你看到的任何坏做法都请告诉我。以下是到目前为止我的代码。
注:小背景故事。我首先从网站2开始,遇到了一些问题,我仍在处理中,所以我转到了网站1,代码不完整,因为我在网站的各个层中构建代码。
def website1Login():
driver.get('website1.com')
username = input("Please enter your username: ") # Waits for action
searchBox = driver.find_element_by_name('username')
searchBox.send_keys(username)
password = input("Please enter your password: ") # skips action
searchBox = driver.find_element_by_name('password')
searchBox.send_keys(password)
searchBox.submit()
def website1Create():
webOrExchange = 0
webOrExchange = input("Select a service: n" # Skips action
"1. Webmailn"
"2. Exchangenn"
"Service Selected: ")
time.sleep(10)
if webOrExchange == 1:
webmailSelect = driver.find_element_by_partial_link_text('EmailHosting/Mail/Mailboxes/List.aspx')
webmailSelect.click()
time.sleep(2)
else:
exchangeSelect = driver.find_element_by_partial_link_text('Exchange/Mail/Mailboxes/List.aspx')
exchangeSelect.click()
time.sleep(2)
def website2login():
driver.get('website2.com')
username = input("Please enter your username: ") # Waits for this action
searchBox = driver.find_element_by_id('USER')
searchBox.send_keys(username)
password = input("Please enter your password: ") # Skips this action
searchBox = driver.find_element_by_id('PASSWORD')
searchBox.send_keys(password)
searchBox.submit()
def website2Create():
idmSelect = driver.find_element_by_id('Identity Management') # Selects Identity Management app
idmSelect.click()
time.sleep(15)
createNewUser_Select = WebDriverWait(driver, 15).until(
EC.visibility_of_element_located((By.XPATH, '//*[@id="request_category2"]/ul/li')) # Selects Create New User
)
createNewUser_Select.click()
time.sleep(10)
driver.quit()
def main():
website1Login()
website1Create()
# website2login()
# website2Create()
main()
首先,Locator Strategy中的属性值和正在使用的variable name之间似乎存在一些混淆。
您使用过:
searchBox = driver.find_element_by_name('username')
但是,username
是一个字符串变量,包含控制台中的实际用户名。
根据最佳实践,变量名称应根据其范围而具有唯一性。
此步骤可能会解决您当前的问题。
刷新输入流
您还可以按如下方式刷新输入流:
在Windows系统上,您可以使用msvcrt模块中的
msvcrt.getch()
方法。msvcrt.getch()
:读取按键并返回结果字符。控制台没有任何响应。如果按键不可用,则此调用将被阻止,但不会等待按下Enter。如果按下的键是特殊功能键,则返回"\000"或"\xe0";下一个调用将返回密钥代码。使用此功能无法读取Control-C按键示例:
import msvcrt import sys x = input("First Input: ") print("First Input: {}".format(x)) sys.stdout.flush() # Try to flush the buffer while msvcrt.kbhit(): msvcrt.getch() y = input("Second Input: ") print("Second Input: {}".format(y))
控制台输出:
First Input: asdfg First Input: asdfg Second Input: ;lkjh Second Input: ;lkjh
在Unix系统上,您可以使用termios中的
termios.tcflush(fd, queue)
方法termios.tcflush(fd, queue)
:丢弃文件描述符fd上的排队数据。队列选择器指定哪个队列:TCIFLUSH用于输入队列,TCOFLUSH用于输出队列,或TCIOFLUSH用于两个队列示例:
from termios import tcflush, TCIFLUSH import time,sys a = raw_input("First input ") b = raw_input("Second input ") time.sleep(5) tcflush(sys.stdin, TCIFLUSH) a = raw_input("Third input ") b = raw_input("Fourth input ")
控制台输出:
First Input 1 Second Input 2 33 33 Third Input 3 Fourth Input 4