错误提示是 TypeError: presence_of_element_located() takes 1 positional argument but 2 were given
,这表明 presence_of_element_located
期望接收一个参数,但传递了两个。
问题原因
在 selenium.webdriver.support.expected_conditions
中,presence_of_element_located
确实只接受一个参数,这是一个元组,包含定位器类型(如 By.XPATH
)和定位表达式。错误源于你传递了两个单独的参数,而实际上应该传递一个包含这两个值的元组。
解决方案
你需要将 By.XPATH
和 f"//span[text()='{text_1}']"
作为一个元组传递给 presence_of_element_located
。修改后的代码应该像这样:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdef writetest(driver, list):text_1 = "your_text" # 假设 text_1 已经定义# 修改这里,将两个参数作为一个元组传递WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, f"//span[text()='{text_1}']")))
详细解释
By.XPATH
是一个定位器类型。f"//span[text()='{text_1}']"
是你希望使用的 XPath 定位表达式。- 这两者应该作为一个元组传递给
presence_of_element_located
。
修改后的代码传递了一个包含 By.XPATH
和 XPath 表达式的元组 (By.XPATH, f"//span[text()='{text_1}']")
,这将解决你遇到的 TypeError
。
完整示例
下面是一个完整的示例,展示了如何正确使用 WebDriverWait
和 presence_of_element_located
:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdef get(conf, driver, url):writetest(driver, list)def writetest(driver, list):text_1 = "your_text" # 假设 text_1 已经定义# 等待直到元素位于指定的 XPath 位置element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, f"//span[text()='{text_1}']")))# 继续你的其他操作,例如点击或获取文本等print(element.text)# 示例设置,根据需要调整
conf = {} # 配置信息
driver = webdriver.Chrome() # 使用 Chrome 浏览器作为示例
url = "http://example.com"# 启动浏览器并访问页面
driver.get(url)# 调用 get 函数
get(conf, driver, url)
确保你正确导入了 By
、WebDriverWait
和 expected_conditions
,并将定位器类型和表达式作为一个元组传递给 presence_of_element_located
。
总结
- 错误的根本原因是
presence_of_element_located
只接受一个参数,但这里传递了两个。 - 解决方法是将
By.XPATH
和 XPath 表达式作为一个元组传递。 - 通过这种修改,你可以避免
TypeError
并成功等待元素的存在。