Selenium 使用 selenium 等待元素的 text 直到出现自己想要的文字内容,该如何做?

狂天 · 2020年11月27日 · 最后由 狂天 回复于 2020年12月01日 · 3780 次阅读

场景:一个列表,我点击翻页后,想定位第一行的某个数据(比如姓名),与用例相符。

我不能直接定位置,因为我定位的文字所在的列表要翻页,直接定位出的文字是翻页前的。
所以我得等待列表翻页完后,查看该位置的文字与我想要是否相符。
等待到元素出现我会,等待元素的 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
也没查出是哪的问题,想问问大家有什么别的办法没有。

共收到 10 条回复 时间 点赞

查一下这个方法的具体传参方式,应该是你把字符串直接传到队列里面了

怎么感觉查找的元素不对才会报这个错的。

把你完整错误和堆栈贴出来看看?没看出为啥你这一行会报这个错,怀疑是别的地方报错。

特别是说你参数个数是 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

建议下次出问题,还是和上面一样,把你实际代码和完整堆栈贴上来吧。要不从你那个网上找到的代码,真的没办法找到原因,因为这段代码本身就没错。

陈恒捷 回复

确实是这样,我刚也看了下底层代码,跟大佬说的一模一样,大佬帮我解答问题还特意查看了底层代码真是感谢!

狂天 回复

客气啦,我也是这么一步一步在别人的帮助下走过来的。

也期望以后多来社区走走,遇到其他人有问题也可以协助解答下,让大家都能在这里有所成长吧。

狂天 #10 · 2020年12月01日 Author
陈恒捷 回复

嗯嗯,互相帮助共同进步

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册