为何find_element_by_xpath()提示传入3个参数?Python Selenium新手求助
我来帮你拆解这个问题,核心原因其实很明确:
你在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

