Instagram登录脚本与selenium,无法执行.send_keys('test')

问题描述 投票:0回答:3

好吧,正如标题所说,我几乎不能让我的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')\ File“C:\ Users \ ferna \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ site-packages \ selenium \ webdriver \ common \ action_chains.py“,第83行,执行动作()文件”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(响应)文件”C:\ Users \ ferna \ appData \ Local \ Programs \ Python \ Python36-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py“,第242行,在check_response中引发exception_class(message,screen,stacktrace)selenium.common.exceptions。 StaleElementReferenceException:消息:陈旧元素引用:元素未附加到页面文档(会话info:chrome = 71.0.3578.98)(驱动程序信息:chromedriver = 2.45.615291(ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387),platform = Windows NT 10.0.17134 x86_64)

Selenium安装不正确吗?或者是我的代码中的错误?我真的很感激我能得到的任何帮助。顺便说一句:我找到了名称而不是xpath的用户名和密码元素,因为Instagram每次打开页面都会更改xpath和选择器,这使得元素很难以其他方式找到,至少在我非常有限的经验中。

此图显示了测试脚本后浏览器的外观:enter image description here

python python-3.x selenium bots chrome-web-driver
3个回答
0
投票

它适用于我的代码,如果有用,请接受它。

1添加expected_conditions等待直到出现实际登录页面


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
投票

使用WebDriver等待:

    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')'

希望这会奏效!


0
投票

试试这个代码。它对我有用。不需要动作类。希望这会对你有所帮助。任何问题请回复。你需要从http://chromedriver.chromium.org/downloads下载最新的chrome驱动程序ChromeDriver 2.45

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()
© www.soinside.com 2019 - 2024. All rights reserved.