Как исправить OSError: [WinError 6] Дескриптор недопустим с Python и Selenium? - PullRequest
1 голос
/ 11 ноября 2019

Я пытаюсь войти в свой аккаунт Fidelity, используя Selenium и Fidelity. Я убедился, что использую правильный веб-драйвер (версия 78 для моего Chrome версии 78). Я думаю, что это связано с единственным веб-драйвером Chrome, 32-разрядным, и я использую 64-разрядный. Это последняя ошибка, которую я получаю. Он открывает веб-страницу, вводит мое имя пользователя и пароль, и затем я думаю, что при нажатии кнопки происходит сбой или прямо перед ним.

from selenium import webdriver


def test_bot(username, password):
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
    br = webdriver.Chrome(chrome_options=chrome_options)
    br.get("https://www.fidelity.com")
    br.implicitly_wait(10)

    user = br.find_element_by_id('userId-input')
    user.clear()
    user.send_keys(username)

    pwd = br.find_element_by_id('password')
    pwd.clear()
    pwd.send_keys(password)

    btn = br.find_element_by_id('fs-login-button')
    btn.click()


test_bot("MYUSERNAME", "MYPASSWORD")

Вот ошибка, которую я получаю.

Exception ignored in: <function Popen.__del__ at 0x03957270>
Traceback (most recent call last):
  File "C:\Users\Notebook\AppData\Local\Programs\Python\Python37-32\lib\subprocess.py", line 860, in __del__
    self._internal_poll(_deadstate=_maxsize)
  File "C:\Users\Notebook\AppData\Local\Programs\Python\Python37-32\lib\subprocess.py", line 1216, in _internal_poll
    if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
OSError: [WinError 6] The handle is invalid

Я использую Pycharm и Selenium.

1 Ответ

1 голос
/ 11 ноября 2019

Чтобы отправить последовательность символов в Имя пользователя и Пароль , вам необходимо ввести WebDriverWait для element_to_be_clickable() и выможет использовать любую из следующих стратегий локатора :

  • Использование CSS_SELECTOR:

    options = webdriver.ChromeOptions()
    options.add_argument("start-maximized")
    #options.add_experimental_option("excludeSwitches", ["enable-automation"])
    #options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://www.fidelity.com/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#userId-input"))).send_keys("Brandon")
    driver.find_element_by_css_selector("input#password").send_keys("Jacobson")
    driver.find_element_by_css_selector("button#fs-login-button").click()
    
  • Использование XPATH:

    options = webdriver.ChromeOptions()
    options.add_argument("start-maximized")
    #options.add_experimental_option("excludeSwitches", ["enable-automation"])
    #options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://www.fidelity.com/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='userId-input']"))).send_keys("Brandon")
    driver.find_element_by_xpath("//input[@id='password']").send_keys("Jacobson")
    driver.find_element_by_xpath("//button[@id='fs-login-button']").click()
    
  • Примечание : необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
...