Python(PyCharm)Selenium跳过行代码



我正在进行一个项目,以自动登录到几个网站并在这些网站中创建用户。在我看来,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
      

最新更新