Python Selenium:等到元素不再陈旧?

时间:2017-10-27 06:29:55

标签: python unit-testing selenium automation python-unittest

我有一种情况,我想等到元素不再是STALE,即元素连接到DOM之前。以下等待选项不起作用:

self.wait.until(EC.visibility_of_element_located((By.ID, "elementID")))
self.wait.until(EC.presence_of_element_located((By.ID, "elementID")))

它存在相反的等待函数,它等待一个元素变为陈旧,即:

self.wait.until(EC.staleness_of((By.ID, "elementID")))

但我希望它等到元素不再长时间,即直到它连接到DOM。我怎样才能实现这个功能?

编辑:这里有一个解决方案:here但我正在寻找任何其他更好的方法。

4 个答案:

答案 0 :(得分:0)

来自documentation

陈旧性

class staleness_of(object):
    """ Wait until an element is no longer attached to the DOM.
    element is the element to wait for.
    returns False if the element is still attached to the DOM, true otherwise.
    """
    def __init__(self, element):
        self.element = element

    def __call__(self, ignored):
        try:
            # Calling any method forces a staleness check
            self.element.is_enabled()
            return False
        except StaleElementReferenceException:
            return True

要点击的元素

class element_to_be_clickable(object):
    """ An Expectation for checking an element is visible and enabled such that
    you can click it."""
    def __init__(self, locator):
        self.locator = locator

    def __call__(self, driver):
        element = visibility_of_element_located(self.locator)(driver)
        if element and element.is_enabled():
            return element
        else:
            return False

如您所见,两者都使用相同的方法 is_enabled()来执行检查。

答案 1 :(得分:0)

陈旧的元素是您存储的元素引用,由于页面,页面的一部分或者只是刷新了元素,该引用不再有效。一个简单的例子

element = driver.find_element_by_id("elementID")
# do something that refreshes the page
element.click()

此处element.click()将引发陈旧元素异常,因为该引用在刷新之前存储在 中,但在刷新后使用(单击了)在这种情况下,该引用不再有效。一旦引用过时,它就永远不会变得“过时”……该引用将永远无法再次使用。解决该问题的唯一方法是再次存储引用。

注意:您的代码示例不适用于.staleness_of()。它采用Web元素引用,而不是定位符。您需要一个现有的引用来等待它过时。参见the docs

现在要解决问题...您需要等待刷新完成,然后然后获得新的引用

element = driver.find_element_by_id("elementID")
# do something that refreshes the element
self.wait.until(EC.staleness_of(element))
element = self.wait.until(EC.visibility_of_element_located((By.ID, "elementID")))
# do something with element

等待元素变旧等待元素引用丢失,这意味着元素已更改/刷新。知道元素已更改后,我们现在可以对其进行新引用。在这种情况下,等待元素变得可见。现在,我们在变量中存储了一个新引用,可以在没有陈旧元素异常的情况下使用它。

答案 2 :(得分:-1)

WebDriverWait(browser, waitTime).until(EC.presence_of_element_located(
                (By.XPATH or By.id or w/e you want, " xpath or id name")))

答案 3 :(得分:-1)

如果您希望在WebElement不再陈旧后选择文本属性,则可以使用以下内容:

wait1 = WebDriverWait(driver, 10)
wait1.until(expected_conditions.text_to_be_present_in_element((By.ID, "elementID"), "expected_text1"))
  

OR

wait2 = WebDriverWait(driver, 10)
wait2.until(expected_conditions.text_to_be_present_in_element_value((By.ID, "elementID"), "expected_text2"))