Selenium WebDriver如何解决过时的元素参考异常?

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>>();


@Test

public 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();

慕桂英3389331
浏览 977回答 3
3回答

烙印99

首先让我们清楚一下WebElement是什么。WebElement是对DOM中元素的引用。当您正在交互的元素被销毁然后重新创建时,抛出StaleElementException。如今,大多数复杂的网页都会随着用户与之交互而动态移动,这需要销毁和重新创建DOM中的元素。当发生这种情况时,您之前使用的DOM中元素的引用变得陈旧,您不再能够使用此引用与DOM中的元素进行交互。当发生这种情况时,您需要刷新您的参考,或者在现实世界中,再次找到该元素。

LEATH

这不是问题。如果将.findElement调用包装在try-catch块中并捕获StaleElementReferenceException,则可以根据需要循环并重试多次,直到成功为止。以下是我写的一些例子。Selenide项目的另一个例子:public&nbsp;static&nbsp;final&nbsp;Condition&nbsp;hidden&nbsp;=&nbsp;new&nbsp;Condition("hidden",&nbsp;true)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;apply(WebElement&nbsp;element)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;!element.isDisplayed(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(StaleElementReferenceException&nbsp;elementHasDisappeared)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;};
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java