Selenium WebDriver如何解决陈旧元素引用异常?

我在Selenium 2 Web驱动程序测试中具有以下代码,该代码在调试时有效,但是在构建中运行它时,大多数情况下会失败。我知道这一定与未刷新页面的方式有关,但不知道如何解决它,因此,任何有关我做错事情的指针都应该受到赞赏。我正在使用JSF primefaces作为我的Web应用程序框架。当我单击添加新链接时,会出现一个弹出对话框,其中包含一个输入框,我可以在其中输入日期,然后单击“保存”。在获取输入元素以输入文本的过程中,我得到了一个陈旧的元素ref异常。

提前致谢

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

WebDriverWait wait = new WebDriverWait(driver,10);

wait.until(new ExpectedCondition<Boolean>() {

public Boolean apply(WebDriver driver) {

WebElement button = driver.findElement(By

.name("createForm:dateInput_input"));

if (button.isDisplayed())

return true;

else

return false;

}

});

WebElement textElement = driver.findElement(By.name("createForm:dateInput_input"));

textElement.sendKeys("24/04/2013");

WebElement saveElement = driver.findElement(By.name("createForm:saveButton"));

saveElement.click();

driver.navigate().refresh();

parseTableData(driver, "form:submissionDataTable_data", 2);

//Close the browser

driver.quit();

}

private void parseTableData(WebDriver driver, String id, int expectedRows) {

// Check the title of the page or expected element on page

WebElement subTableElement = driver.findElement(By.id(id));

List<WebElement> tr_collection=subTableElement.findElements(By.xpath("id('"+ id + "')/tr"));

assertEquals("incorrect number of rows returned", expectedRows, tr_collection.size());

int row_num,col_num;

row_num=1;

if(tableData.get(id) == null) {

tableData.put(id, new HashMap<String, String>());

}

Map<String, String> subTable = tableData.get(id);

for(WebElement trElement : tr_collection)

{

List<WebElement> td_collection=trElement.findElements(By.xpath("td"));

col_num=1;

for(WebElement tdElement : td_collection)

{

subTable.put(row_num + "" + col_num, tdElement.getText());

col_num++;

}

row_num++;

}

}

}

运行此命令时,出现以下异常,但可能会在

WebElement textElement = driver.findElement(By.name("createForm:dateInput_input"));

要么

if (button.isDisplayed())

异常跟踪

org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document

(Session info: chrome=26.0.1410.64)

(Driver info: chromedriver=0.8,platform=Windows NT 6.0 SP2 x86) (WARNING: The server did not provide any stacktrace information)

Command duration or timeout: 56 milliseconds

For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html

Build info: version: '2.32.0', revision: '6c40c187d01409a5dc3b7f8251859150c8af0bcb', time: '2013-04-09 10:39:28'

System info: os.name: 'Windows Vista', os.arch: 'x86', os.version: '6.0', java.version: '1.6.0_10'

Session ID: 784c53b99ad83c44d089fd04e9a42904

Driver info: org.openqa.selenium.chrome.ChromeDriver

Capabilities [{platform=XP, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, rotatable=false, driverVersion=0.8, locationContextEnabled=true, version=26.0.1410.64, cssSelectorsEnabled=true, databaseEnabled=true, handlesAlerts=true, browserConnectionEnabled=false, nativeEvents=true, webStorageEnabled=true, applicationCacheEnabled=false, takesScreenshot=true}]

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:187)

at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)

at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554)

at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:268)

at org.openqa.selenium.remote.RemoteWebElement.isDisplayed(RemoteWebElement.java:320)

at com.integration.web.EnterActiveSubmissionIntegrationTest$1.apply(EnterActiveSubmissionIntegrationTest.java:58)

at com.integration.web.EnterActiveSubmissionIntegrationTest$1.apply(EnterActiveSubmissionIntegrationTest.java:1)

at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:208)

at com.integration.web.EnterActiveSubmissionIntegrationTest.testEnterActiveSubmission(EnterActiveSubmissionIntegrationTest.java:53)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

回答:

先,让我们弄清楚WebElement是什么。

WebElement是对DOM中元素的引用。

当你正在交互的元素被销毁然后重新创建时,将引发StaleElementException。如今,大多数复杂的网页都会在用户与其互动时动态地进行处理,这需要销毁并重新创建DOM中的元素。

发生这种情况时,对你先前拥有的DOM中元素的引用将变得陈旧,并且你将不再能够使用该引用与DOM中的元素进行交互。发生这种情况时,你将需要刷新参考,或者按照实际情况再次找到该元素。

以上是 Selenium WebDriver如何解决陈旧元素引用异常? 的全部内容, 来源链接: utcz.com/qa/434457.html

回到顶部