Python(PyCharm)Selenium跳过行代码

时间:2018-10-30 20:39:03

标签: python selenium selenium-webdriver buffer selenium-chromedriver

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

1 个答案:

答案 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