Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)

  • Post category:Python

下面是详细讲解:

Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)

问题描述

在使用Python+Selenium对网页进行自动化测试的过程中,经常会出现找不到页面元素的情况,控制台报错信息一般为 NoSuchElementException。这种错误通常是由于元素定位方式不正确或者页面元素加载速度过慢等原因引起的。下面就这些问题逐一进行探讨,并提供解决方案。

定位方式不正确

问题描述

在使用Python+Selenium定位一个元素时,使用的定位方式可能不正确,导致找不到该元素。

解决方案

使用正确的定位方式。Selenium 提供了多种定位方式,包括但不仅限于以下方式:

  • id
  • name
  • class name
  • tag name
  • link text
  • partial link text
  • css selector
  • xpath

使用前需要先确认页面元素的 <tag>classid 以及其他特定属性,并根据网页源代码选择合适的定位方式。

下面以找到百度首页的搜索框为例进行演示:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
searchbox = driver.find_element_by_id("kw")
searchbox.send_keys("Selenium")

在上述代码片段中,我们使用 find_element_by_id() 方法来定位搜索框元素,这里的参数 "kw" 是搜索框元素的 id,该方式可以精确定位到该元素。

页面元素加载速度过慢

问题描述

在使用Python+Selenium定位元素时,页面元素加载速度过慢,导致找不到该元素,控制台报错 NoSuchElementException

解决方案

  1. 显示等待

使用显示等待来等待页面元素加载完成。这里的 WebDriverWait() 是一个显式等待类,用于等待页面上的某个元素出现。在这之前,要使用 from selenium.webdriver.support.ui import 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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
searchbox = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "kw"))
)
searchbox.send_keys("Selenium")

在上述代码片段中,我们使用 WebDriverWait()expected_conditions 类的 presence_of_element_located() 方法来等待页面元素加载完成并定位搜索框元素。

  1. 隐式等待

使用隐式等待来等待页面元素加载完成。隐式等待是设置在 WebDriver 实例中的,对整个生命周期周期内起作用。在这之前,要使用 from selenium.webdriver.common.by import By 来导入等待模块。下面以找到百度首页的搜索框为例进行演示:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")
searchbox = driver.find_element(By.ID, "kw")
searchbox.send_keys("Selenium")

在上述代码片段中,我们使用 implicitly_wait() 方法来隐式等待,10 表示等待的秒数。设置好后,WebDriver 会在等待时间内不断查找页面元素,直到找到该元素或时间到期。如果该元素在等待时间内未出现,便会抛出异常。在定位元素时,使用 By 类来指定定位类型,如上例中的 By.ID 指定通过 id 属性定位元素。

以上就是关于 Python+Selenium 定位不到元素的常见原因及解决办法的介绍。