带有 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 页面,所以您的代码可能正在尝试抓取重定向页面或类似的东西,使其出现错误。
好的,正如标题所说,我几乎不能让我的 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.45from 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 页面,所以您的代码可能正在尝试抓取重定向页面或类似的东西,使其出现错误。