我正在一个项目,以自动登录到几个站点并在这些站点中创建用户。在我看来,Selenium正在跳过行,而不是等待控制台中的用户输入。我已经用python注释标记了它跳过的区域。我还用通用信息替换了特定信息。我需要做些什么来强迫Selenium等待控制台输入吗?还是一个bug?任何意见,将不胜感激。另外,我对整个Python还是比较陌生,如果您发现任何不良做法,请告诉我。下面是到目前为止的代码。
注意:背景故事很少。我首先开始在website2上遇到了一些仍在处理中的问题,所以我搬到website1上,并且在遍历网站各层时正在构建代码,因此代码不完整。
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. Webmail\n"
"2. Exchange\n\n"
"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()
答案 0 :(得分:0)
首先,Locator Strategy中的属性值和使用的变量名称之间似乎有些混淆。
您使用过:
searchBox = driver.find_element_by_name('username')
但同样,username
是一个 string 变量,用于保存控制台中的实际用户名。
根据最佳做法,变量名称应在其范围内唯一。
此步骤可以解决您当前的问题。
您还可以按以下方式刷新输入流:
在 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