使用Selenium登录页面时无法定位用户名输入框、sendKeys调用报错问题
问题根源
- 方法使用错误:
find_elements_by_xpath返回的是符合条件的元素列表,列表本身不存在sendKeys方法,哪怕要操作首个匹配元素也需要加[0]索引,更建议直接使用单数形式的find_element_by_xpath直接获取首个匹配元素。 - XPath逻辑错误:你写的XPath是匹配包含
Username文本的元素,页面上显示的「Username」文本通常是标注用的<label>标签,不是实际可输入的<input>输入框,所以要么返回空列表,要么匹配到的元素不支持输入操作。
可行解决方案
下面是几种通用的定位方式,都可以在不知道输入框id、class的情况下完成定位:
- 方案1:通过label关联关系定位
如果页面的Username标签和输入框做了语义关联(label有for属性指向输入框id),可以用如下代码:
from selenium.webdriver.common.by import By # 先定位Username文本标签 username_label = driver.find_element(By.XPATH, "//*[contains(text(),'Username')]") # 获取标签关联的输入框id input_id = username_label.get_attribute("for") # 定位输入框并填入内容,注意Python版本Selenium的输入方法是send_keys,不是驼峰写法sendKeys driver.find_element(By.ID, input_id).send_keys("thakneh")
- 方案2:通过相邻节点定位
如果输入框就在Username标签的后方相邻位置,可以直接用XPath的兄弟节点轴定位:
from selenium.webdriver.common.by import By driver.find_element(By.XPATH, "//*[contains(text(),'Username')]/following-sibling::input[1]").send_keys("thakneh")
- 方案3:通过输入框占位符定位
如果输入框有提示占位符,可以直接匹配<input>标签的placeholder属性:
from selenium.webdriver.common.by import By driver.find_element(By.XPATH, "//input[contains(@placeholder,'Username')]").send_keys("thakneh")
额外注意
目前Selenium新版本已经废弃了find_element_by_*系列写法,更推荐统一导入By类后用find_element(By.定位类型, 定位值)的写法,兼容性更强。
内容的提问来源于stack exchange,提问作者nehat280
相关产品推荐
相关产品推荐

