Как найти поле имени пользователя и пароля на странице входа в Instagram с помощью Chromedriver и Selenium Python - PullRequest
1 голос
/ 26 мая 2020

Вот проверенный исходный код

input aria-label="Phone number, username, or email" aria-required="true" autocapitalize="off" autocorrect="off" maxlength="75" name="username" type="text" class="_2hvTZ pexuQ zyHYP" value=""

Я пробовал запустить этот код

driver = webdriver.Chrome()
driver.get('https://www.instagram.com/')
driver.find_element_by_xpath("//input[@name=\"username\"]").send_keys(username)
driver.find_element_by_xpath("//input[@name=\"password\"]").send_keys(pw)
driver.find_element_by_xpath('//button[@type="submit"]').click()

Но с такой ошибкой

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//input[@name="username"]"}
  (Session info: chrome=83.0.4103.61)

Мой хромированный драйвер и chrome версии совпадают, и поиск элементов выполняется по следующей инструкции. Почему я получаю эту ошибку?

Ответы [ 4 ]

2 голосов
/ 26 мая 2020

Приложение Instagram построено с помощью элементов React . Следовательно, сразу после вызова URL-адреса, когда вы инициируете поиск элемента входа, вы сталкиваетесь с NoSuchElementException


Решение

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

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

    driver.get("https://www.instagram.com/")
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='username']"))).send_keys("username")
    driver.find_element_by_xpath("//input[@name='password']").send_keys("password")
    driver.find_element_by_xpath("//button/div[text()='Log In']").click()
    
  • Примечание : вам необходимо добавить следующие импорты:

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

Снимок браузера:

instagram_login


Ссылка

Вы можете найти пару соответствующих обсуждений в:

0 голосов
/ 26 мая 2020

Попробуйте следующий код:

driver = webdriver.Chrome()
driver.get('https://www.instagram.com/')
txt_user = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.NAME, 'username')))
txt_user.send_keys('yourUserName')
txt_pwd = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.NAME, 'password')))
txt_pwd.send_keys('yourPassword')
btn_submit = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[type="submit"]')))
btn_submit.click()

После импорта:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
0 голосов
/ 26 мая 2020
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()  
driver.get('https://www.instagram.com/')
element = WebDriverWait(driver, 2).until(
    EC.presence_of_element_located((By.ID, "//input[@name=\"username\"]"))
)
element.sendkeys('user')
0 голосов
/ 26 мая 2020

Обратите внимание, что пока открыта домашняя страница Instagram, она показывает счетчик в форме входа на некоторое время, а затем отображает поля. Поэтому вам необходимо управлять синхронизацией в вашем скрипте.

Используйте явное ожидание в вашем коде, пока желаемое поле не будет готово к взаимодействию.

username = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//input[@name='username']")))
username.send_keys('username')
password = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//input[@name='password']")))
password.send_keys('pw')

Необходимо импортировать следующие пакеты

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