selenium.common.exceptions.InvalidArgumentException:消息:参数无效:'using' 必须是使用等待和预期条件的字符串
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: 'using' must be a string using waits and expected conditions
我正在使用 Python 3.7 和 Selenium 3.141.0。在加载缓慢的页面上,使用这样的代码通常有助于捕获 DOM 个对象:
myDiv = WebDriverWait(driver, 60).until(
expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "div.myClass")))
该代码在整个页面中搜索具有 class myClass
的 <div>
元素。但有时我想使用 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 上的期望。这并不一定意味着该元素是可见的并且用于查找该元素 returns 一旦找到 WebElement。
一旦元素 myDiv
返回通过:
myDiv = WebDriverWait(driver, 60).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "div.myClass")))
要根据找到的 WebElement 搜索另一个元素,您可以使用以下解决方案:
myDiv2 = WebDriverWait(myDiv, 60).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "div.myClass2")))
Under the hood,presence_of_element_located
仅使用 find_element
和 returns 找到的元素。
考虑到这一点,您可以创建自己的自定义预期条件方法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
类型作为参数,然后可以对每个元素使用不同的定位器策略。
我正在使用 Python 3.7 和 Selenium 3.141.0。在加载缓慢的页面上,使用这样的代码通常有助于捕获 DOM 个对象:
myDiv = WebDriverWait(driver, 60).until(
expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "div.myClass")))
该代码在整个页面中搜索具有 class myClass
的 <div>
元素。但有时我想使用 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 上的期望。这并不一定意味着该元素是可见的并且用于查找该元素 returns 一旦找到 WebElement。
一旦元素 myDiv
返回通过:
myDiv = WebDriverWait(driver, 60).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "div.myClass")))
要根据找到的 WebElement 搜索另一个元素,您可以使用以下解决方案:
myDiv2 = WebDriverWait(myDiv, 60).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "div.myClass2")))
Under the hood,presence_of_element_located
仅使用 find_element
和 returns 找到的元素。
考虑到这一点,您可以创建自己的自定义预期条件方法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
类型作为参数,然后可以对每个元素使用不同的定位器策略。