Selenium WebDriver如何解决过时的元素参考异常?我在Selenium 2 Web驱动程序测试中有以下代码,它在我调试时有效,但是当我在构建中运行它时大部分时间都失败了。我知道它必须与页面没有刷新的方式有关,但不知道如何解决它所以任何关于我做错了什么的指针都表示赞赏。我使用JSF primefaces作为我的Web应用程序框架。当我点击添加新链接时,会出现一个弹出对话框,其中包含一个我可以输入日期的输入框,然后单击保存。它是在输入元素输入文本,我得到一个陈旧的元素引用异常。提前致谢import static org.junit.Assert.assertEquals; import java.util.HashMap;import java.util.List;import java.util.Map;import org.junit.Test;import org.openqa.selenium.By;import org.openqa.selenium.StaleElementReferenceException;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedCondition;import org.openqa.selenium.support.ui.WebDriverWait;public class EnterActiveSubmissionIntegrationTest {Map<String, Map<String, String>> tableData = new HashMap<String, Map<String, String>>();@Testpublic void testEnterActiveSubmission() throws Exception { // Create a new instance of the Firefox driver // Notice that the remainder of the code relies on the interface, // not the implementation. System.setProperty("webdriver.chrome.driver", "C:/apps/chromedriver.exe"); WebDriver driver = new ChromeDriver(); // And now use this to visit Google driver.get("http://localhost:8080/strfingerprinting"); // Alternatively the same thing can be done like this // driver.navigate().to("http://www.google.com"); // Find the text input element by its name WebElement element = driver.findElement(By.linkText("Manage Submissions")); element.click(); parseTableData(driver, "form:submissionDataTable_data", 1); assertEquals(tableData.get("form:submissionDataTable_data").get("12"), "Archived"); WebElement newElement = driver.findElement(By.linkText("Add new")); newElement.click();
3 回答
烙印99
TA贡献1829条经验 获得超13个赞
首先让我们清楚一下WebElement是什么。
WebElement是对DOM中元素的引用。
当您正在交互的元素被销毁然后重新创建时,抛出StaleElementException。如今,大多数复杂的网页都会随着用户与之交互而动态移动,这需要销毁和重新创建DOM中的元素。
当发生这种情况时,您之前使用的DOM中元素的引用变得陈旧,您不再能够使用此引用与DOM中的元素进行交互。当发生这种情况时,您需要刷新您的参考,或者在现实世界中,再次找到该元素。
LEATH
TA贡献1936条经验 获得超6个赞
这不是问题。如果将.findElement调用包装在try-catch块中并捕获StaleElementReferenceException,则可以根据需要循环并重试多次,直到成功为止。
以下是我写的一些例子。
Selenide项目的另一个例子:
public static final Condition hidden = new Condition("hidden", true) { @Override public boolean apply(WebElement element) { try { return !element.isDisplayed(); } catch (StaleElementReferenceException elementHasDisappeared) { return true; } } };
添加回答
举报
0/150
提交
取消