You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何find_element_by_xpath()提示传入3个参数?Python Selenium新手求助

解决 TypeError: find_element_by_xpath() takes 2 positional arguments but 3 were given

我来帮你拆解这个问题,核心原因其实很明确:

你在base.py的find_element_with_click方法里,错误地用了find_element_by_xpath(*locator),而你的locator是一个包含两个元素的元组(By.XPATH, "//button[contains(text(),'Customer')]")。当你用*解包这个元组时,相当于给find_element_by_xpath()传了两个参数:By.XPATH和定位字符串,但**find_element_by_xpath()只需要1个参数(就是xpath字符串本身)**——加上方法自身的self参数,总共只接受2个位置参数,你却传了3个,这就触发了这个错误。

另外还要纠正你代码里的一个小bug:在pages.py的create_customer方法中,你写的是self.driver.find_element_with_click(...),但find_element_with_click是Page类的方法,属于你的CustomerCreation实例(也就是self),不是WebDriver对象的方法,应该改成self.find_element_with_click(...),否则会先触发AttributeError。


正确的解决方案(推荐第一种)

方案1:改用通用的find_element()方法(更灵活)

既然你的locator已经包含了定位方式(By.XPATH)和定位值,直接用Selenium通用的find_element()方法最合理,它正好接受两个参数:定位方式和定位值。修改base.py的方法:

def find_element_with_click(self,*locator):
    # 替换成通用的find_element方法,适配所有定位类型
    self.driver.find_element(*locator).click()

然后pages.py里的调用修正为:

def create_customer(self):
    # 调用自身的find_element_with_click方法,而非driver的方法
    self.find_element_with_click(*self.locator.Customer)

这种方式的好处是,不管你的locator用XPATH、ID还是CSS_SELECTOR,这个方法都能适配,扩展性更强。

方案2:如果非要用find_element_by_xpath()

那你只需要给它传xpath字符串,不需要传By.XPATH。修改如下:

pages.py的调用:

def create_customer(self):
    # 只取元组的第二个元素(xpath字符串)传入
    self.find_element_with_click(self.locator.Customer[1])

base.py的方法:

def find_element_with_click(self,xpath):
    self.driver.find_element_by_xpath(xpath).click()

但这种方式局限性很大,只能处理xpath定位,不如方案1通用。


额外小提示

你的testPages.py里写了from locators import *,但你的定位文件实际叫locator.py(少了个s),这里可能会触发导入错误,记得修正文件名或者导入语句哦。

内容的提问来源于stack exchange,提问作者Deepak Mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:00:56