错误提示是 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并成功等待元素的存在。