【问题标题】:Finding elements using selenium in python在 python 中使用 selenium 查找元素
【发布时间】:2022-01-27 11:54:32
【问题描述】:

我正在尝试查找并填写 Instagram 登录页面的用户名和密码:

from selenium.webdriver.common.keys import Keys
import os
from selenium import webdriver
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, 'Chromedriver')
driver = webdriver.Chrome(executable_path = filename)
driver.get("https://www.instagram.com")
username = driver.find_element_by_name("username")
password = driver.find_element_by_name("password")

username.send_keys("blankspace")
password.send_keys("blankspace")

但是,我不断收到错误消息,即使名称正确,它也无法检测到元素

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="username"]"}

HTML:

<input aria-label="Phone number, username, or email" aria-required="true" autocapitalize="off" autocorrect="off" maxlength="75" name="username" type="text" class="_2hvTZ pexuQ zyHYP" value="">

【问题讨论】:

  • @Joel 这个问题根本不涉及获取源代码。
  • 尝试调试驱动程序看到的 HTML 源代码docs。 Instagram 很有可能检测到您不是人类,并在您查看页面之前询问您一些验证码。因为你的代码是合理的,否则。
  • @edd 你似乎是对的,它不要求验证码,但页面会在你到达页面后加载大部分元素,所以我添加了time.sleep(5),然后尝试查找元素它有效。

标签: python selenium


【解决方案1】:

在访问表单字段之前,您必须先关闭 cookie 同意弹出窗口:

import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, 'Chromedriver')
driver = webdriver.Firefox()
driver.get("https://www.instagram.com")

WebDriverWait(driver, 5).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "button.aOOlW.bIiDR"))
)
driver.find_element(By.CSS_SELECTOR, "button.aOOlW.bIiDR").click()

username = driver.find_element(By.NAME, "username")
password = driver.find_element(By.NAME, "password")

username.send_keys("blankspace")
password.send_keys("blankspace")

driver.close()

还可以考虑使用更新的方法find_element():

DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instea

【讨论】:

  • 这可能是一些我没有弹出 cookie 的人的答案。你是对的,需要在搜索元素之前等待几秒钟。
【解决方案2】:

我会查看 Selenium 文档! Link。通过关闭文档,您可以尝试以下操作:

username = browser.find_element(By.NAME, "username")
password = browser.find_element(By.NAME, "password")
username.send_keys("text")
password.send_keys("text")

虽然我会改用 XPATH,因为它会更快:

username = browser.find_element(By.XPATH, '//[@id="loginForm"]/div/div[1]/div/label/input')
password = browser.find_element(By.XPATH, '//*[@id="loginForm"]/div/div[2]/div/label/input')
username.send_keys("text")
password.send_keys("text")

享受吧!

【讨论】:

    【解决方案3】:

    任何想知道的人的答案是,Instagram 在您到达页面后会加载到页面正文中,因此您只需在开始查找元素之前添加延迟即可。这就是@edd 指出来的原因

    driver.get("https://www.instagram.com")
    time.sleep(5)
    username = driver.find_element_by_name("username")
    password = driver.find_element_by_name("password")
    
    username.send_keys("blankspace")
    password.send_keys("blankspace")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      相关资源
      最近更新 更多