首页 > 编程问答 >为什么 Selenium 找不到我在代码中指定的元素,即使它在 HTML 中?

为什么 Selenium 找不到我在代码中指定的元素,即使它在 HTML 中?

时间:2024-07-26 09:47:47浏览次数:10  
标签:python html selenium-chromedriver browser-automation

我正在学习如何使用 ChromeDriver 在 Python 3.9.2 上使用 Selenium 自动浏览网站,但我被困在 GitHub 的登录页面,这是我正在练习的网站。

这是我的代码用于自动登录:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
browser = webdriver.Chrome(chrome_options)
browser.get("https://github.com")`
    
sign_in_link = browser.find_element(By.LINK_TEXT, "Sign in")
sign_in_link.click()
username_box = browser.find_element(By.ID, "login_field")
username_box.send_keys("<username>")
password_box = browser.find_element(By.NAME, "password")
password_box.send_keys("<password>")
password_box.submit()

现在,当我执行此代码时,这是我得到的异常:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"css selector", "selector":"\[id="login_field"\]"}

我尝试将 (By.ID, "login_field") 替换为 (By.NAME, "login") ,但我仍然得到相同的异常,说它找不到元素。当我检查网页上的元素时,它显示以下内容:

<input type="text" name="login" id="login_field" class="form-control input-block js-login- field" autocapitalize="off" autocorrect="off" autocomplete="username" autofocus="autofocus" required="required">

我相信我为函数 find_element() 使用了正确的参数,但 Selenium 找不到这些元素,但如果我手动登录,它工作正常。 我还尝试使用完整的 XPath 作为函数 find_element() 的参数,如下所示:

username_box = browser.find_element(By.XPATH, "/html/body/div\[1\]/div\[3\]/main/div/div\[4\]/form/input\[3\]")

第一次运行代码时有效,但当我再次尝试时,抛出相同的异常,表示找不到元素。关于如何成功地一致地自动登录有什么想法吗?


你所面临的问题是,GitHub的登录页面需要一些时间来加载,而你的Selenium脚本试图在页面完全加载之前找到元素。这就是为什么你有时会在第一次运行时侥幸成功,因为网络和计算机的速度在不同的时间点上有所不同。

你可以通过几种方法解决这个问题:

1. 使用 WebDriverWait:

这是推荐的解决方案。 WebDriverWait 允许你等待一个特定的条件被满足,然后再继续执行脚本。在这种情况下,你可以等到用户名输入框出现。

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

# ...你的代码...

sign_in_link.click()

# 等待用户名输入框出现
username_box = WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.ID, "login_field"))
)
username_box.send_keys("<username>")

# 密码输入框也需要等待
password_box = WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.NAME, "password"))
)
password_box.send_keys("<password>")
password_box.submit()

这段代码将等待最多10秒,等待ID为 "login_field" 的元素出现在页面上,然后再继续执行。

2. 使用 time.sleep():

这是一种不太优雅的解决方案,但它在某些情况下也可以奏效。 time.sleep() 会暂停你的脚本执行一段时间,这可以给页面加载时间。

import time

# ...你的代码...

sign_in_link.click()

# 等待5秒
time.sleep(5)

username_box = browser.find_element(By.ID, "login_field")
username_box.send_keys("<username>")
# ...你的代码...

关于使用XPath的说明:

虽然使用XPath可以找到元素,但它非常脆弱,因为HTML结构的任何微小变化都会导致你的脚本失败。最好是使用更可靠的定位器,比如ID、名称或CSS选择器。

通过使用 WebDriverWait 或者在必要时添加 time.sleep() ,你应该能够解决这个问题,让你的脚本更可靠地运行。

标签:python,html,selenium-chromedriver,browser-automation
From: 78795791

相关文章

  • Python安装第三方库
    Python安装PILPIL(PythonImagingLibrary)是一个旧的Python库,用于处理图像。然而,PIL已经不再维护,并被一个名为Pillow的库所取代。Pillow是PIL的一个分支,并且完全兼容PIL。建议使用Pillow而不是PIL。pipinstallpillowPython安装moviepymoviepy是一个用于视频编辑的Python库,......
  • 优化Python中图像中的OCR文本检测
    我目前正在用python编写一个程序,该程序获取包含大量文本的图像,将其提取到.txt文件,然后将找到的单词与另一个文件中的单词列表进行比较,并创建一些坐标(根据像素)在图像中找到的单词中,如果找到图像,则会在图像中绘制红色方块。到目前为止,我已经正确处理了坐标部分,在单词周围绘制了......
  • Python保存字典类型数据到文件的三种方法
    1、在Python中使用pickle模块的dump函数将字典保存到文件中importpicklemy_dict={'Apple':4,'Banana':2,'Orange':6,'Grapes':11}#保存文件withopen("myDictionary.pkl","wb")astf:pickle.dump(my_dict,tf)......
  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-53- 处理面包屑(详细教程)
    1.简介面包屑(Breadcrumb),又称面包屑导航(BreadcrumbNavigation)这个概念来自童话故事“汉赛尔和格莱特”,当汉赛尔和格莱特穿过森林时,不小心迷路了,但是他们发现沿途走过的地方都撒下了面包屑,让这些面包屑来帮助他们找到回家的路。所以,面包屑导航的作用是告诉访问者他们在网站中......
  • 如何使用 Python 在 Telegram 中进行标签搜索
    Telegram最近添加了一项新功能,可以在所有公共频道中同时按主题标签进行搜索:https://telegram.org/blog/message-effects-and-more#hashtag-search如何进行此类搜索用蟒蛇?(Telethon,Python-Telegram-Bot,...)我在Telethon文档中找到了这个函数:https://tl.......
  • cpanel 上的 React-django - MIME 类型('text/html')不是受支持的样式表
    我正在开发一个React-Django应用程序,并且它在本地运行当我将其安装在运行cpanel的服务器上时,它只显示一个空白页面。我的提供者检查了它并做了以下陈述:python应用程序在cpanel上正确安装错误原因应该在开发者端找到我制作......
  • 使用 Python 构建一个简单的 REST API
    使用Python构建一个简单的RESTAPI简介本文档将引导您使用Python和Flask框架构建一个简单的RESTAPI。我们将创建一个API,用于管理一个虚拟的书籍数据库。准备工作Python环境:确保您的系统上安装了Python3.x。Flask框架:使用pip安装Flask:pipinstallFla......
  • python学习之闭包与装饰器
    一、闭包闭包允许一个函数访问并操作函数外部的变量(即父级作用域中的变量),即使在该函数外部执行。特性:(1)外部函数嵌套内部函数。(2)外部函数可以返回内部函数。(3)内部函数可以访问外部函数的局部变量。defout():print("我是外层")n=10defins():......
  • 如何正确处理Python中的可选功能
    我正在开发实现科学模型的python包,我想知道处理可选功能的最佳方法是什么。这是我想要的行为:如果无法导入某些可选依赖项(例如,在无头机器上绘制模块),我想在我的类中禁用使用这些模块的功能,警告用户如果他尝试使用它们以及所有这些,而不会破坏执行。所以下面的脚本在任何情况下......
  • 在Python中,对于一个数字列表,如何找到具有最大和的数字的连续子集范围?
    输入的一个示例可能是nums1=[-1,4,-3,5,-5]nums2=[-1,4]我想知道这里什么可能是有效的解决方案。谢谢。defmax_subarray_sum_range(nums):"""找到数字列表中具有最大和的连续子集范围。Args:nums:数字列表。Returns:一个包含最大和子集起......