Python Selenium按name定位元素报错 如何通过required字段定位
问题复现代码
username_textbox = driver.find_element(By.NAME,"email") username_textbox.send_keys(username)
问题描述
执行上述代码,尝试通过name属性定位属性值为email的元素时程序抛出错误,猜测问题与元素的required_field = 'email'属性有关,咨询是否可以直接通过required字段定位页面元素。
解答
By.NAME定位报错和元素的required类属性无关,这类属性不会干扰name属性的匹配逻辑,报错通常是三类原因:
- 定位执行时元素尚未加载完成,缺少等待逻辑
- 目标元素位于iframe内,未先切换iframe上下文
- 页面存在多个name属性为email的元素,当前定位命中了隐藏、不可交互的节点
你完全可以通过required相关属性直接定位元素,Selenium支持匹配任意原生或自定义HTML属性,两种常用实现方式:
- CSS选择器定位
匹配原生required属性+type为email的输入框:
匹配自定义属性username_textbox = driver.find_element(By.CSS_SELECTOR, "input[required][type='email']")required_field值为email的输入框:username_textbox = driver.find_element(By.CSS_SELECTOR, "input[required_field='email']") - XPath定位
匹配自定义属性required_field值为email的输入框:username_textbox = driver.find_element(By.XPATH, "//input[@required_field='email']")
注意:无论用哪种属性做定位,都建议搭配显式等待,等元素进入可交互状态后再执行输入操作,能规避大部分找不到元素、元素不可交互的报错,参考写法:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) # 最长等待10秒直到目标元素可点击 username_textbox = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[required_field='email']"))) username_textbox.send_keys(username)
内容的提问来源于stack exchange,提问作者Anna Chan
相关产品推荐
相关产品推荐

