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

Хорошо, так как, как говорится в названии, я почти не могу заставить свою программу на 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()

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

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

Traceback (последний вызов был последним): File «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, в исполнении 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. ру», строка 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 и селектор каждый раз, когда открывается страница, что затрудняет поиск элементов другими способами, по крайней мере, из-за моего очень ограниченного опыта.

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

Ответы [ 3 ]

0 голосов
/ 10 января 2019

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


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()
0 голосов
/ 10 января 2019

Попробуйте код

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()
0 голосов
/ 10 января 2019

Использовать 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')'

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

...