Selenium报错AttributeError: WebElement对象无below属性排查
报错根因
AttributeError: 'WebElement' object has no attribute 'below' 是因为你对Selenium相对定位API的用法完全错误:
below()是Selenium 4 相对定位器的构造方法,属于定位工具类的方法,不是WebElement实例的成员方法,不能在find_element()返回的元素对象后直接链式调用- 相对定位的逻辑是「查找元素时传入参考元素做位置筛选」,不是「先找到元素再调用方法判断它在谁下方」,你的代码逻辑顺序完全写反了。
解决方法
方案1:普通定位(最稳定,适配所有Selenium版本)
Discord登录页的登录按钮本身就可以通过属性精准定位,完全不需要绕相对定位逻辑,直接删掉错误的.below(password_box)调用即可,修正后可运行代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome(r"C:/Users/sexyv/Downloads/chromedriver_win32/chromedriver.exe") driver.get("https://discord.com/login") # 隐式等待在driver初始化后设置一次即可,全局生效 driver.implicitly_wait(10) email_box = driver.find_element(by=By.NAME, value="email") password_box = driver.find_element(by=By.NAME, value="password") # 直接定位提交按钮,不需要额外调用below submit_button = driver.find_element(by=By.XPATH, value="//button[@type='submit']") def login(driver, email_box, password_box, submit_button): email_box.send_keys("johnsonkalel15@gmail.com") password_box.send_keys("Kalel12346") time.sleep(1) submit_button.click() login(driver=driver,email_box=email_box, password_box=password_box, submit_button=submit_button)
方案2:正确使用Selenium4相对定位(适合练习相对定位场景)
如果一定要用below()实现位置关联定位,需要先导入相对定位工具类,把参考元素作为参数传入定位器,注意该写法仅支持Selenium 4.0及以上版本:
- 先新增导入:
from selenium.webdriver.support.relative_locator import locate_with - 替换提交按钮的定位代码:
# 查找标签为button、位置在密码输入框下方的元素 submit_button = driver.find_element(locate_with(By.TAG_NAME, "button").below(password_box))
额外注意点
- 原代码中
implicitly_wait(3)写在登录函数内部、元素查找完成之后是无效写法,隐式等待只需要在driver初始化后设置一次,仅对后续的元素查找操作生效 - 原代码导入的
pydoc.locate、selenium.webdriver.common.keys.Keys全程没有被使用,可以直接删除,避免冗余导入
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

