微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

selenium.common.exceptions.InvalidArgumentException:消息:无效参数:“使用”必须是使用等待和预期条件的字符串

如何解决selenium.common.exceptions.InvalidArgumentException:消息:无效参数:“使用”必须是使用等待和预期条件的字符串

我使用的是 Python 3.7 和 Selenium 3.141.0。在加载缓慢的页面上,使用这样的代码来捕获 DOM 对象通常会有所帮助:

myDiv = webdriverwait(driver,60).until(
    expected_conditions.presence_of_element_located((By.CSS_SELECTOR,"div.myClass")))  

代码在整个页面搜索具有类 <div>myClass 元素。但有时我想使用 presence_of_element_located() 仅在给定的 WebElement 对象内进行搜索。例如,在上面的代码的基础上,我想运行这样的代码

myDiv2 = webdriverwait(driver,60).until(
    myDiv.presence_of_element_located((By.CSS_SELECTOR,"div.myClass2")))

第二个代码块不起作用;我收到一条错误消息,可以理解地告诉我 presence_of_element_located() 不是 WebElement 对象的方法。如果我用 myDiv.presence_of_element_located() 替换 myDiv.find_element()代码也会失败。在这种情况下,我收到一条无效参数消息:

selenium.common.exceptions.invalidargumentexception: Message: invalid argument: 'using' must be a string

有没有办法使用等待和预期条件来测试元素的存在,或以其他方式搜索元素,同时将搜索限制为像 myDiv 这样的 WebElement 对象?从某种意义上说,这可以通过编写复杂的 CSS 或 Xpath 选择器来实现——但我想避免这种情况。

我已经检查了 SO 帖子和 Selenium documentation of expected conditions,但我没有发现任何与此问题相关的内容

解决方法

presence_of_element_located()

presence_of_element_located() 是检查元素是否存在于页面的 DOM 上的期望值。这并不一定意味着该元素是可见的,并且用于查找该元素,一旦找到它就会返回 WebElement。

一旦元素 myDiv 通过:

myDiv = WebDriverWait(driver,60).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR,"div.myClass")))

要根据找到的 WebElement 搜索另一个元素,您可以使用以下解决方案:

myDiv2 = WebDriverWait(myDiv,"div.myClass2")))
,

Under the hood,presence_of_element_located 仅使用 find_element 并返回找到的元素。

考虑到这一点,您可以创建自己的自定义预期条件方法 presence_of_element_located_inside_element(因为没有更好的名称):

from selenium.common.exceptions import NoSuchElementException


class presence_of_element_located_inside_element(object):
    def __init__(self,first_locator,second_locator):
        self.first_locator = first_locator
        self.second_locator = second_locator

    def __call__(self,driver):
        try:
            first_elem = driver.find_element_by_css_selector(self.first_locator)
            second_elem = first_elem.find_element_by_css_selector(self.second_locator)
            return second_elem
        except NoSuchElementException:
            return False

然后你可以在你的测试中使用它:

elem = WebDriverWait(driver,20).until(presence_of_element_located_inside_element('div.myClass1','div.myClass2'))

这仅用于说明目的,仅支持字符串 CSS 选择器。

当然,可以调整它以将 By 类型作为参数,然后您可以对每个元素使用不同的定位器策略。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?