Сценарий входа в Instagram с селеном, не в состоянии выполнить.send_keys('test')

Итак, как говорится в заголовке, я почти не могу заставить работать мою программу на Python, это бот для входа в Instagram, и он фактически не выполняет регистрацию частично, я пробовал использовать цепочки действий и без них это мой код (python 3.6.1):

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

browser = webdriver.Chrome()
browser.get('https://www.instragram.com')

login_elem = browser.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[2]/div[2]/p/a')
login_elem.click()

user = browser.find_element_by_name("username")

passw = browser.find_element_by_name('password')

ActionChains(browser)\
    .move_to_element(user).click()\
    .send_keys('test')\
    .move_to_element(passw).click()\
    .send_keys('test')\
    .perform()

login_button = browser.find_element_by_class_name(
'_0mzm- sqdOP  L3NKy       ')


login_button.click()

Довольно просто, правда? и поскольку синтаксических ошибок нет, я действительно растерялся из-за того, что происходит неправильно, поскольку после запуска кода ничего не происходит после перехода на страницу входа. (Это означает, что на самом деле он не активируется в формах имени пользователя и пароля)

Вот что говорит Модуль:

Трассировка (последний вызов был последним): файл "C:\Users\ferna\Desktop\ пытающийся браузер script.py", строка 17, в.send_keys('test')\ Файл "C:\Users\ferna\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\common\action_chains.py", строка 83, в файле execute action() Файл" C: \ Users \ ferna \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ site-packages \ selenium \ webdriver \ common \ action_chains.py ", строка 277, в Command.MOVE_TO, {'element': to_element.id})) Файл" C: \ Users \ ferna \ " AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", строка 321, в файле исполняемого файла self.error_handler.check_response(response), файл" C: \ Users \ ferna " \AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", строка 242, в check_response поднять исключение_класса (сообщение, экран, стековая трассировка) selenium.common.exceptions.StaleElementReferenceException: Сообщение: ссылка на устаревший элемент: элемент не прикреплен к документу страницы (сеанс информация: chrome=71.0.3578.98) (информация о драйвере: chromedriver=2.45.615291 (ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387), платформа =Windows NT 10.0.17134 x86_64)

Selenium не был установлен правильно? или ошибка внутри моего кода? Я был бы очень признателен за любую помощь, которую я могу получить. Кстати, я нахожу элементы имени пользователя и пароля по имени, а не по xpath, так как Instagram изменяет xpath и селектор каждый раз, когда открывается страница, что затрудняет поиск элементов другими способами, по крайней мере, из-за моего очень ограниченного опыта.

Это изображение показывает, как выглядит браузер после тестирования скрипта:

5 ответов

Решение

Это работает с моим кодом, если это полезно, пожалуйста, примите это.


1 добавить ожидаемые условия ожидания при появлении реальной страницы входа


second_page_flag = wait.until(EC.presence_of_element_located(
    (By.CLASS_NAME, "KPnG0")))  # util login page appear


2 изменить синтаксис селектора xpath здесь

login_button_ = browser.find_element_by_xpath(
    "//form[@class='HmktE']/div[3]/button")


login_button_.click()


все коды здесь:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

browser = webdriver.Chrome()
browser.get('https://www.instragram.com')

wait = WebDriverWait(browser, 10)

login_elem = browser.find_element_by_xpath(
   '//*[@id="react-root"]/section/main/article/div[2]/div[2]/p/a')

second_page_flag = wait.until(EC.presence_of_element_located(
    (By.CLASS_NAME, "KPnG0")))  # util login page appear


user = browser.find_element_by_name("username")

passw = browser.find_element_by_name('password')

ActionChains(browser)\
    .move_to_element(user).click()\
    .send_keys('test')\
    .move_to_element(passw).click()\
    .send_keys('test')\
    .perform()

login_button_ = browser.find_element_by_xpath(
    "//form[@class='HmktE']/div[3]/button")

login_button_.click()

Используйте WebDriver Wait:

    WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 
    "input[name='username']"))).send_keys("test")
    WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 
    "input[name='password']"))).send_keys("test")

или же

    user = browser.find_element_by_xpath("//input[@name='username']")
    user.send_keys('test')
    passw = browser.find_element_by_xpath("//input[@name='password']")
    passw.send_keys('test')'

Надеюсь, это сработает!

Попробуйте этот код. Это сработало для меня. Класс действий не требуется. Надеюсь, что это поможет вам. Любые вопросы, пожалуйста, ответьте. Вам необходимо загрузить последнюю версию Chrome драйвера ChromeDriver 2.45 с http://chromedriver.chromium.org/downloads

from selenium import webdriver
import time
driver=webdriver.Chrome("Path of the chromdriver location" + "chromedriver.exe" )
driver.get("https://www.instagram.com/accounts/login/?source=auth_switcher")
user=driver.find_element_by_name("username")
user.send_keys("kajal")
passwd=driver.find_element_by_name("password")
passwd.send_keys("1234")
time.sleep(1)
button=driver.find_element_by_xpath(".//*[@id='react-root']/section/main/div/article/div/div[1]/div/form/div[3]/button")
button.click()

Я была такая же проблема. Проблема в том, что python пытается найти элемент немедленно, но веб-драйвер еще не загрузил элемент. Чтобы решить эту проблему, заставьте программу ждать загрузки элементов и только потом вызывать их. Вы можете сделать это, импортировав время и добавив: time.sleep(4). Итак, это было бы:

      import time
from selenium import webdriver
browser = webdriver.Chrome("/usr/lib/chromium-browser/chromedriver")
browser.get("https://www.instagram.com/accounts/login/")
time.sleep(4) #so you let the webpage load
browser.find_element_by_name("username").send_keys("blablabla")

Что бы это ни стоило, в коде, представленном в исходном сообщении, есть опечатка: «browser.get('https://www.instRAgram.com')». Похоже, что страница перенаправляется на главную страницу Insta, поэтому, возможно, ваш код пытается очистить страницу перенаправления или что-то в этом роде, что приводит к ошибкам.

Другие вопросы по тегам