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