首页 > 编程问答 >84 我正在使用 Python 开发 selenium 自动化项目。我收到错误 .NoSuchElementException:

84 我正在使用 Python 开发 selenium 自动化项目。我收到错误 .NoSuchElementException:

时间:2024-07-26 06:03:27浏览次数:14  
标签:python css selenium-webdriver

场景是这样的,我将打开一个网页,在使用 selenium 单击该网页后,它会要求位置访问权限,屏幕上会出现一堆按钮,我正在尝试定位其中一个按钮,但即使正确给出了 Xpath 地址,我得到.NoSuchElementException:错误

能够单击目标按钮


你正在使用 Selenium 在 Python 中开发自动化项目,并遇到了 NoSuchElementException 错误,这很可能是因为你在网页加载完成前就试图定位元素。具体来说,你遇到的问题是点击网页上的一个按钮后,会出现一个请求位置访问权限的弹窗,而你在弹窗完全加载并显示出来之前就试图定位其中的按钮,导致 Selenium 找不到该元素。

以下是一些解决这个问题的方法:

1. 使用 WebDriverWait 等待元素加载:

这是最常用的解决方法。 WebDriverWait 会等待特定的条件满足后再执行下一步操作,这样可以确保元素加载完成后再进行定位。

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

# ... 你的代码 ...

# 点击打开位置权限弹窗的按钮 button = driver.find_element(By.XPATH, "//your/button/xpath") button.click()

# 等待弹窗中的按钮出现 wait = WebDriverWait(driver, 10) # 最多等待10秒 target_button = wait.until(EC.presence_of_element_located((By.XPATH, "//target/button/xpath")))

# 点击目标按钮 target_button.click() ```

这段代码首先会等待最多10秒,直到找到 Xpath 为 //target/button/xpath 的按钮。如果在10秒内找到了,就会点击该按钮;如果没有找到,则会抛出 TimeoutException 异常。

2. 使用 time.sleep() 函数:

这是一种不太优雅但有时有效的解决方案。 你可以添加一段暂停时间,让页面完全加载后再查找元素:

```python import time

# ... 你的代码 ...

# 点击打开位置权限弹窗的按钮 button = driver.find_element(By.XPATH, "//your/button/xpath") button.click()

# 等待2秒 time.sleep(2)

# 尝试定位目标按钮并点击 target_button = driver.find_element(By.XPATH, "//target/button/xpath") target_button.click() ```

这种方法的缺点是等待时间是固定的,如果页面加载时间过长,会导致代码执行效率低下,甚至可能出现元素仍然未加载完成的情况。

3. 检查 XPath 是否正确:

确保你使用的 Xpath 表达式是正确的,并且能够唯一地定位到目标按钮。可以使用浏览器开发者工具 (通常按 F12 键打开) 来验证 XPath。

其他建议:

  • 使用显式等待 ( WebDriverWait ) 优于隐式等待和 time.sleep() ,因为它更可靠且执行效率更高。
  • 尝试使用更精确的定位方法,例如 ID、name 或 CSS 选择器。
  • 确保你的 Selenium WebDriver 版本与你使用的浏览器版本兼容。

通过以上方法,你应该能够解决 NoSuchElementException 错误,并成功定位到目标按钮。

标签:python,css,selenium-webdriver
From: 78795555

相关文章

  • 在Python 3中删除两个指定字符串之间的字符串
    我正在从事一个NLP项目,该项目要求我从一段文本中删除计算机代码。代码包含在标签<pre><code>和</code></pre>之间。现在我可以做一个简单的正则表达式匹配,但我想概括这个函数,以便它可以删除任何两个指定字符串之间的文本,即使它们是嵌套的。例如,如果我有一个......
  • Azure Open AI - Python 和 Java API 之间 gpt4o 的结果截然不同
    我使用Java和PythonAPI对AzureOpenAI进行相同的调用,但收到截然不同的结果:相同的系统提示相同的用户提示适用于Java和Python的azureai包的相同(最新)版本尽管输入的用户和系统提示完全相同,但响应却非常不同-python提示是“正确的”并......
  • leetcode 输出错误? (Python)
    我的VSCode/本地终端给出了[1,4,1,5,1,6]的正确输出,但不知何故leetcode给了我完全不同的输出。我在这里错过了什么吗?这怎么可能?顺便说一下,这是wigglesort2将我的本地代码复制粘贴到leetcode中给出了不同的输出数组很难在没有看到你的代码的情况下......
  • 当 python 窗口的一部分不在屏幕上时,如何让它自己被记录?
    在Windows10中,大多数应用程序窗口都可以使用OBS等程序进行记录。当窗口被拖动以致其部分内容在显示屏上不可见时,通常OBS仍会接收窗口的内容,即使它在屏幕上不可见。但是,在编写python应用程序时,这似乎不以相同的方式工作。我尝试了几种不同的类似GUI的模块......
  • 使用 aws cdk 设置用户池客户端属性以具有读/写访问权限 - Python
    我试图根据属性给予一些自定义属性特定的读/写访问权限。我收到此错误。资源处理程序返回消息:“无效写入创建客户端时指定的属性(服务:CognitoIdentityProvider,状态代码:400,请求ID:<request_id>)”(RequestToken:<request_token>,HandlerErrorCode:InvalidRequest)任何人都可以为......
  • 试图找出此页面的逻辑:存储了大约 ++ 100 个结果 - 并使用 Python 和 BS4 进行了解析
    试图找出此页面背后的逻辑:我们已将一些结果存储在以下数据库中:https://www.raiffeisen.ch/rch/de/ueber-uns/raiffeisen-gruppe/Organization/raiffeisenbanken/deutsche-schweiz.html#accordionitem_18104049731620873397从a到z大约:120个结果或更多:......
  • 如何在 Numpy Python 中将 4 维数组的下三角形复制到上三角形?
    目标是将下三角形复制到上三角形。根据OP中提出的建议,起草了以下代码。importnumpyasnplw_up_pair=np.tril_indices(4,-1)arr=np.zeros((4,4,1,1))arr[1,:1,:,0]=1arr[2,:2,0,0]=2arr[3,:3,0,0]=3arr=arr+arr.T-np.diag(np.diag(arr))但是,它......
  • 如何在 Python 中对多行使用单个 INSERT INTO 语句?
    我目前正在开发一个DiscordPython机器人,我在其中循环遍历ForumTags列表,并为每个对象生成INSERTINTOSQL语句以将数据插入MySQL数据库。但是,我想要通过将所有这些单独的INSERTINTO语句组合到单个查询中来优化我的代码,如下所示:INSERTINTO......
  • 双 for 循环的 Pythonic 方式
    我有以下代码:importnumpyasnpepsilon=np.array([[0.,0.00172667,0.00071437,0.00091779,0.00154501],[0.00128983,0.,0.00028139,0.00215905,0.00094862],[0.00035811,0.00018714,0.,0.00029365,0.00036993......
  • 在 matplotlib 中绘制一个字符串函数 // 将 str 解释为 python 代码?
    我正在创建一个RPN计算器,尝试绘制用户给出的函数。例如,如果用户输入"xsin3*plot"我希望它绘制sin(x)*3其代码如下。注意:问题在ifprompt=="plot"userInputX=""#userInputXisalwaysreplacedbefore......