一尘不染

如何以及何时实施刷新(ExpectedCondition WebDriver的状态)?

selenium

我正在研究ExpectedCondtions类的方法,发现一种方法:刷新

我可以理解,当您获取StaleElementReferenceException并且想要再次检索该元素时可以使用该方法,这样可以避免StaleElementReferenceException

我的上述理解可能不正确,因此我想确认:

  1. 什么时候refreshed应该使用?
  2. something以下代码的一部分应该是什么代码:

wait.until(ExpectedConditions.refreshed(**something**));

有人可以举例说明吗?


阅读 532

收藏
2020-06-26

共1个答案

一尘不染

根据消息来源:

条件的包装器,它允许元素通过重绘进行更新。这可以解决具有两部分的条件问题:找到一个元素,然后检查其上的某些条件。对于这些条件,有可能先找到一个元素,然后在客户端将其重画。如果发生这种情况,则在检查条件的第二部分时会引发{@link
StaleElementReferenceException}。

因此,基本上,这是一种等待对对象完成DOM操作的方法。

通常,执行driver.findElement 此操作时,该对象表示该对象是什么。

当DOM被操纵后,并在单击一个按钮后说,将一个类添加到该元素。如果您尝试对所述元素执行操作,则该操作将引发,StaleElementReferenceException
因为现在WebElement返回的现在不代表更新后的元素。

refreshed当您期望DOM操作发生时,您将使用它,而您要等到在DOM中完成操作为止。

例:

<body>
  <button id="myBtn" class="" onmouseover="this.class = \"hovered\";" />
</body>

// pseudo-code
1. WebElement button = driver.findElement(By.id("myBtn")); // right now, if you read the Class, it will return ""
2. button.hoverOver(); // now the class will be "hovered"
3. wait.until(ExpectedConditions.refreshed(button));
4. button = driver.findElement(By.id("myBtn")); // by this point, the DOM manipulation should have finished since we used refreshed.
5. button.getClass();  // will now == "hovered"

请注意,如果您button.click()在第3行执行a语句,则由于DOM已在此时进行处理,因此它将引发StaleReferenceException。

在使用Selenium的这些年中,我从未使用过这种条件,因此我认为这是一种“极端情况”,您很可能不必担心使用。希望这可以帮助!

2020-06-26