好吧,正如标题所说,我几乎不能让我的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和选择器,这使得元素很难以其他方式找到,至少在我非常有限的经验中。
它适用于我的代码,如果有用,请接受它。
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()
使用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')'
希望这会奏效!
试试这个代码。它对我有用。不需要动作类。希望这会对你有所帮助。任何问题请回复。你需要从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()