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

Instagram login script with selenium, not being able to execute .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()

很简单,对吧?由于没有语法错误,我真的很困惑到底出了什么问题,因为一旦我 运行 我的代码,进入登录页面后什么也没有发生。 (这意味着,它实际上并没有在用户名和密码表单上执行)

模块是这么说的:

Traceback (most recent call last): File "C:\Users\ferna\Desktop\trying browser script.py", line 17, in .send_keys('test')\ File "C:\Users\ferna\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\common\action_chains.py", line 83, in perform action() File "C:\Users\ferna\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\common\action_chains.py", line 277, in Command.MOVE_TO, {'element': to_element.id})) File "C:\Users\ferna\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute self.error_handler.check_response(response) File "C:\Users\ferna\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document (Session info: chrome=71.0.3578.98) (Driver info: chromedriver=2.45.615291 (ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387),platform=Windows NT 10.0.17134 x86_64)

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

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

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

希望这会奏效!

它适用于我的代码,如果有帮助请采纳。


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

试试这个 code.It 为 me.No 行动工作 class required.Hope 这将帮助 you.Any 问题请回复 back.You 需要下载最新的chrome 来自 http://chromedriver.chromium.org/downloads

的驱动程序 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()

我遇到了同样的问题。问题是 python 试图立即找到该元素,但 webdriver 尚未加载该元素。要解决此问题,请让程序等待元素加载,然后才调用它们。您可以通过导入时间并添加: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")

尽管如此,原始 post 中提供的代码中有一个拼写错误:“browser.get('https://www.instRAgram.com')”。看起来该页面重定向到主 Insta 页面,所以您的代码可能正在尝试抓取重定向页面或类似的东西,使其出现错误。