Python(PyCharm) Selenium 跳过行代码
Python(PyCharm) Selenium skipping over lines code
我正在开展一个项目,以自动登录到几个站点并在这些站点中创建用户。在我看来,Selenium 正在跳过行,而不是在控制台中等待用户输入。我用 python 注释标记了它跳过的区域。我还用一般信息替换了特定信息。我需要做些什么来强制 Selenium 等待控制台输入还是一个错误?任何意见,将不胜感激。另外,我对 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()
首先, 中的 属性值 和 变量名称 之间似乎有些混淆使用过。
您使用过:
searchBox = driver.find_element_by_name('username')
但是,username
是一个 string 变量,其中包含来自 console[ 的实际 username =70=].
根据最佳实践,变量名称在其范围内应该是唯一的。
这一步可能会解决您当前的问题。
刷新输入流
您还可以按如下方式刷新输入流:
在Windows系统上你可以使用msvcrt.getch()
方法从msvcrt模块。
msvcrt.getch()
:读取按键和 return 结果字符。控制台没有回显任何内容。如果按键不可用,此调用将被阻止,但不会等待按下 Enter。如果按下的键是一个特殊的功能键,这将 return '\000' 或 '\xe0';下一次调用将 return 键码。无法使用此功能读取 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.tcflush(fd, queue)
方法 termios
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
我正在开展一个项目,以自动登录到几个站点并在这些站点中创建用户。在我看来,Selenium 正在跳过行,而不是在控制台中等待用户输入。我用 python 注释标记了它跳过的区域。我还用一般信息替换了特定信息。我需要做些什么来强制 Selenium 等待控制台输入还是一个错误?任何意见,将不胜感激。另外,我对 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()
首先,
您使用过:
searchBox = driver.find_element_by_name('username')
但是,username
是一个 string 变量,其中包含来自 console[ 的实际 username =70=].
根据最佳实践,变量名称在其范围内应该是唯一的。
这一步可能会解决您当前的问题。
刷新输入流
您还可以按如下方式刷新输入流:
在Windows系统上你可以使用
msvcrt.getch()
方法从msvcrt模块。msvcrt.getch()
:读取按键和 return 结果字符。控制台没有回显任何内容。如果按键不可用,此调用将被阻止,但不会等待按下 Enter。如果按下的键是一个特殊的功能键,这将 return '\000' 或 '\xe0';下一次调用将 return 键码。无法使用此功能读取 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.tcflush(fd, queue)
方法 termiostermios.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