如何在Python的Selenium中传入变量检测元素存在?
解决
presence_of_element_located()参数错误的问题 核心错误原因
EC.presence_of_element_located()只接受1个参数,这个参数必须是包含定位策略(如By.ID)和元素标识的元组,而你传入了两个独立参数,导致抛出TypeError。
分步解决方法
1. 修正调用语法(快速修复)
在login.py中,将EC.presence_of_element_located的参数改为元组形式,同时访问Selector实例的value属性获取实际元素标识:
# 原错误代码 WebDriverWait(context.driver,20).until(EC.presence_of_element_located(By.ID,Selectors.LOGIN)) # 修改后代码 WebDriverWait(context.driver,20).until(EC.presence_of_element_located( (By.ID, Selectors.LOGIN.value) ))
同时修正点击元素的代码,同样需要访问value属性:
context.driver.find_element(By.ID, Selectors.LOGIN.value).click()
2. 修正selectors.py中的元素定义
如果你用ID定位元素,LOGIN的取值应该是元素的ID字符串,而非不完整的XPATH:
# 原错误代码(XPATH语法不完整) LOGIN = Selector("//*[@id=login-button") # 修改后(ID定位) LOGIN = Selector("login-button") # 如果要用XPATH,需修正语法 # LOGIN = Selector("//*[@id='login-button']")
3. 优化Selector类设计(更优雅的方案)
可以改造Selector类,让它同时存储定位策略和元素标识,避免重复写By.ID这类代码:
# selectors.py 修改后 from selenium.webdriver.common.by import By class Selector: def __init__(self, by: By, value: str): self.by = by self.value = value # 返回定位元组,方便直接传入Selenium方法 def to_tuple(self): return (self.by, self.value) class Selectors: # Initial Login Page LOGIN = Selector(By.ID, "login-button") # 若用XPATH:LOGIN = Selector(By.XPATH, "//*[@id='login-button']")
此时login.py中的调用可以简化为:
# 等待元素出现 WebDriverWait(context.driver,20).until(EC.presence_of_element_located(Selectors.LOGIN.to_tuple())) # 点击元素 context.driver.find_element(*Selectors.LOGIN.to_tuple()).click()
验证要点
- 确保元素的ID或XPATH正确,直接用
(By.ID, "login-button")能正常工作,说明标识本身没问题。 - 检查
Selector实例的value属性是否正确返回了元素标识字符串。
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

