我有一个名为webdriver.py
的文件,它实现了selenium.webdriver
库中的方法。有一个等待函数处理我需要的大多数情况:
def wait_for(self, func, target=None, timeout=None, **kwargs):
timeout = timeout or self.timeout
try:
return WebDriverWait(self, timeout).until(func)
except TimeoutException:
if not target:
raise WebDriverException('Wait for: "%s" failed!' % inspect.getsource(func).strip())
raise NoSuchElementException(target)
func
是选择器。
问题是有时DOM元素是不可见的,导致异常和测试失败。所以我想扩展wait_for
以等待元素变得可见。
像
这样的东西def wait_for(self, func, target=None, timeout=None, **kwargs):
timeout = timeout or self.timeout
try:
return WebDriverWait(self, timeout).until(EC.element_to_be_clickable(func)).until(func)
except TimeoutException:
if not target:
raise WebDriverException('Wait for: "%s" failed!' % inspect.getsource(func).strip())
raise NoSuchElementException(target)
EC
是selenium.driver.expected_conditions
这当然不起作用 - 不支持until().until()
语法..或者其他事情发生,例如EC
不存在。
有什么想法吗?
答案 0 :(得分:1)
您可以使用EC.presence_of_element_located
将DOM中的元素等待显示,而不需要第二个.until
。
def wait_for(self, func, target=None, timeout=self.timeout):
try:
WebDriverWait(self, timeout).until(EC.presence_of_element_located((By.CSS_SELECTOR, func)))
except TimeoutException:
if not target:
raise WebDriverException('Wait for: "%s" failed!' % inspect.getsource(func).strip())
raise NoSuchElementException(target)