前端使用element框架。
登录进去使用开发人员工具能看到元素,复制xpath使用find_element死活找不到。
其中一次复制的xpath 注意红色部分:
#先点击一下输入框
driver.find_element(By.XPATH,'/html/body/div[1]/section/section/section/main/div/div[1]/div/form/div[1]/div/div/div/div/div/input').click()
time.sleep(1)
#再点击弹出内容选项
driver.find_element(By.XPATH,'/html/body/div[3]/div[11]/div/div/div[1]/ul/li[1]')
我也是小白只能反复试试。
直到我关闭了几个标签页,刷新了一下页面。才发现页面div元素少了好几个。
我真是服了。
原因居然是因为是多标签页,每多打开一个页面,我找的那个元素所在div,前面就会多几个div元素。
问题难找的原因有很多,比如:
- 框架没有使用原生控件,使用input+ul 实现下拉效果,页面没有显性value值。
- 最坑的是我要操作的那个页面是个“”新增功能"页面,必须先打开列表页才能打开这个新增页。
- 另外框架元素的很多值都是实时变化的。
耗费4个多小时能找到问题也是比较偶然,好在问题解决了。感谢百度,感谢努力的我。
这是查找元素方法。
def find_element_by_xpath(driver, xpath):
"""
使用给定的XPath查找元素。
:param driver: Selenium WebDriver的实例。
:param xpath: 要查找的元素的XPath。
:return: 如果找到了元素,则返回True;否则返回False。
"""
try:
# 设置隐式等待为0毫秒(通常不推荐这样做,但根据您的需求)
# 注意:隐式等待在这里实际上不会生效,因为是在查找元素之前设置的
# 且隐式等待会被每个find_element调用重置,所以这里设置为0影响不大
driver.implicitly_wait(0)
# 尝试找到元素
driver.find_element(By.XPATH, xpath)
return True
except NoSuchElementException:
# 如果没有找到元素,则捕获异常
return False
finally:
# 注意:通常我们不会在这里关闭浏览器,因为方法可能被多次调用
# 但如果您确定每次调用后都不再需要WebDriver,可以这样做
# 这里我将其注释掉,因为通常更好的做法是在方法外部管理WebDriver的生命周期
# driver.quit()
pass
if find_element_by_xpath(driver, '/html/body/div[3]/div[2]/div/div/div[1]/ul/li[1]/span'):
print("找到了")
else:
print("未找到指定元素")