我正在研究ExpectedCondtions类的方法,发现一种方法:刷新
ExpectedCondtions
我可以理解,当您获取StaleElementReferenceException并且想要再次检索该元素时可以使用该方法,这样可以避免StaleElementReferenceException
StaleElementReferenceException
我的上述理解可能不正确,因此我想确认:
refreshed
something
wait.until(ExpectedConditions.refreshed(**something**));
有人可以举例说明吗?
根据消息来源:
条件的包装器,它允许元素通过重绘进行更新。这可以解决具有两部分的条件问题:找到一个元素,然后检查其上的某些条件。对于这些条件,有可能先找到一个元素,然后在客户端将其重画。如果发生这种情况,则在检查条件的第二部分时会引发{@link StaleElementReferenceException}。
因此,基本上,这是一种等待对对象完成DOM操作的方法。
通常,执行driver.findElement 此操作时,该对象表示该对象是什么。
driver.findElement
当DOM被操纵后,并在单击一个按钮后说,将一个类添加到该元素。如果您尝试对所述元素执行操作,则该操作将引发,StaleElementReferenceException 因为现在WebElement返回的现在不代表更新后的元素。
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。
button.click()
在使用Selenium的这些年中,我从未使用过这种条件,因此我认为这是一种“极端情况”,您很可能不必担心使用。希望这可以帮助!