场景:一个列表,我点击翻页后,想定位第一行的某个数据(比如姓名),与用例相符。
我不能直接定位置,因为我定位的文字所在的列表要翻页,直接定位出的文字是翻页前的。
所以我得等待列表翻页完后,查看该位置的文字与我想要是否相符。
等待到元素出现我会,等待元素的 text(element.text)与我想要的相符该如何做?
我从网上查到用
text_to_be_present_in_element
代码形如
WebDriverWait(driver, 10).until(expected_conditions.text_to_be_present_in_element((By.CSS_SELECTOR,"#TANGRAM__PSP_10_error"), u'请您填写手机/邮箱/用户名'))
但是我使用后提示报错
find element:takes from 1 to 3 positional arguments but 13 were given
也没查出是哪的问题,想问问大家有什么别的办法没有。
查一下这个方法的具体传参方式,应该是你把字符串直接传到队列里面了
怎么感觉查找的元素不对才会报这个错的。
把你完整错误和堆栈贴出来看看?没看出为啥你这一行会报这个错,怀疑是别的地方报错。
特别是说你参数个数是 13,这个很奇怪。
需要优化场景设计,原则是要利于(自动化)用例的执行。
Traceback (most recent call last):
File "", line 1, in
File "C:\Program Files\JetBrains\PyCharm 2019.1\helpers\pydev_pydev_bundle\pydev_umd.py", line 197, in runfile
pydev_imports.execfile(filename, global_vars, local_vars) # execute the script
File "C:\Program Files\JetBrains\PyCharm 2019.1\helpers\pydev_pydev_imps_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "C:/Users/Administrator/PycharmProjects/untitled2/UIAuto/pingtaipage.py", line 110, in
org.checkname()
File "C:\Users\Administrator\PycharmProjects\untitled2\UIAuto\basepage.py", line 20, in checkname
'#map > div.main-wrapper > div > div > div.sticker > div > div > div.ivu-table-wrapper > div > div.ivu-table-body > table > tbody > tr > td:nth-child(3) > div > span'), u'hahaha')
File "C:\Users\Administrator\PycharmProjects\untitled2\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until
value = method(self.driver)
File "C:\Users\Administrator\PycharmProjects\untitled2\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 209, in __call_
element_text = _find_element(driver, self.locator).text
File "C:\Users\Administrator\PycharmProjects\untitled2\venv\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element
return driver.find_element(*by)
TypeError: find_element() takes from 1 to 3 positional arguments but 13 were given
以上是堆栈,实际报错的就是 basepage 那第 20 行的代码。
def checkname(self):
return WebDriverWait(self.driver, 10).until(EC.text_to_be_present_in_element(By.CSS_SELECTOR,
'#map > div.main-wrapper > div > div > div.stic'
'ker > div > div > div.ivu-table-wrapper > div > di'
'v.ivu-table-body > table > tbody > tr > td:nth-child(3) > div > span'), u'hahaha')
这个是报错的代码,我觉得可能是 css 的字串符传的问题,改成一行串也还是报 but 13 were given,我都不知道这个 13 究竟是指哪里了。。
WebDriverWait(driver, 10).until(expected_conditions.text_to_be_present_in_element((By.CSS_SELECTOR,"#TANGRAM__PSP_10_error")), msg=u'请您填写手机/邮箱/用户名')
注意括号
跑了一下代码,找到原因了,本质还是你语法写错了。
// 网上找的示例
WebDriverWait(self.driver, 900).until(
EC.text_to_be_present_in_element(
(By.ID, 'operations_monitoring_tab_current_ct_fields_no_data'),
"No data to display"
)
)
// 你帖子正文给的写法,搜了下应该是你从 csdn 之类复制过来的,这段写法是没错的
WebDriverWait(driver, 10).until(
expected_conditions.text_to_be_present_in_element(
(By.CSS_SELECTOR,"#TANGRAM__PSP_10_error"),
u'请您填写手机/邮箱/用户名'
)
)
// 你评论给的写法,你可以对比下 text_to_be_present_in_element 第一个参数的数据类型,是不是 tuple
WebDriverWait(self.driver, 10).until(
EC.text_to_be_present_in_element(
By.CSS_SELECTOR,
'#map > div.main-wrapper > div > div > div.stic'
'ker > div > div > div.ivu-table-wrapper > div > di'
'v.ivu-table-body > table > tbody > tr > td:nth-child(3) > div > span'
),
u'hahaha'
)
至于为啥报错是 13 个参数,原因是这样的:
1、text_to_be_present_in_element 接收的第一个参数,最后会以 *by 的形式传给底层的 find_element 函数。所以应该是一个带有 2 个元素的 tuple 。
2、由于上面括号用的不对,所以实际第一个参数的值是 By.CSS_SELECTOR,即字符串 'css selector' (你可以自行在 idea 里跳到这个常量的定义里看看)
3、find_element 函数定义是 find_element(self, by=By.ID, value=None)
,本身默认有个 self 参数,再加上 css selector 12 个字符串(当通过 *变量名
传入时,字符串会被解析成一个字母一个元素的数组,等价于 find_element(self, 'c', 's', 's', ' ', 's', 'e','l','e','c','t','o','r')
),所以就变成了 13 个参数了。
举证:
by = '123'
self.driver.find_element(*by)
// 跑上面这两行代码,会报错:
// TypeError: find_element() takes from 1 to 3 positional arguments but 4 were given
建议下次出问题,还是和上面一样,把你实际代码和完整堆栈贴上来吧。要不从你那个网上找到的代码,真的没办法找到原因,因为这段代码本身就没错。