使用Heroku上托管的Selenium登录Instagram时,找不到元素'用户名' [英] Unable to locate element 'username' while logging in Instagram with Selenium hosted on Heroku

查看:39
本文介绍了使用Heroku上托管的Selenium登录Instagram时,找不到元素'用户名'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用Instagram登录时使用无头模式的硒有问题。我找到了Selenium无头模式的默认Web代码片段,但是在网页上找不到特定的元素(比如Instagram主页中的用户名)。代码在我的PC上本地运行良好,但当它部署在Heroku上时,它会显示错误。错误日志位于代码下方。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import random as rd
import os
import schedule


def job():
  try:

    user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36"

    options = webdriver.ChromeOptions()
    options.headless = True
    options.add_argument(f'user-agent={user_agent}')
    options.add_argument("--window-size=1920,1080")
    options.add_argument('--ignore-certificate-errors')
    options.add_argument('--allow-running-insecure-content')
    options.add_argument("--disable-extensions")
    options.add_argument("--proxy-server='direct://'")
    options.add_argument("--proxy-bypass-list=*")
    options.add_argument("--start-maximized")
    options.add_argument('--disable-gpu')
    options.add_argument('--disable-dev-shm-usage')
    options.add_argument('--no-sandbox')
    options.binary_location = os.environ.get("GOOGLE_CHROME_BINARY")

    CHROMEDRIVER_PATH = os.environ.get("CHROMEDRIVER_PATH")
    wd = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH,chrome_options=options)
    
    wd.get('https://instagram.com')
    time.sleep(rd.uniform(9,11))

    username = os.environ.get("INSTAGRAM_USER")
    password = os.environ.get("INSTAGRAM_PASSWORD")

    time.sleep(rd.uniform(2.5,3.5))
    wd.find_element_by_name('username').send_keys(username)
    time.sleep(rd.uniform(0.95,1.45))
    wd.find_element_by_name('password').send_keys(password + Keys.ENTER)
    time.sleep(rd.uniform(6,8))

    wd.get('https://instagram.com')
    time.sleep(rd.uniform(2.5,3.5))
    print("SUCCESS")

    wd.quit()
  except Exception as e:
    print(e)


schedule.every(3).minutes.do(job)


while True:
  schedule.run_pending()
  time.sleep(10)

错误:

Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="username"]"} 
(Session info: headless chrome=88.0.4324.96)

推荐答案

要在Instagram上的用户名字段中发送字符序列,您可以使用以下任一Locator Strategies

  • 使用css_selector

    driver.find_element(By.CSS_SELECTOR, "input[name='username']").send_keys("Artem")
    
  • 使用xpath

    driver.find_element(By.XPATH, "//input[@name='username']").send_keys("Artem")
    

但是,Instagram上的username字段是启用了ReactJS的元素,因此理想情况下,要将字符序列发送到您需要为element_to_be_clickable()诱导WebDriverWait的元素,您可以使用以下Locator Strategies之一:

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='username']"))).send_keys("Artem")
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='username']"))).send_keys("Artem")
    
  • 注意::您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • 浏览器快照:

这篇关于使用Heroku上托管的Selenium登录Instagram时,找不到元素'用户名'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆