2012-01-12 2 views
0

私はJSF2アプリケーションをSeleniumでテストしていますが、多くのStaleElementReferenceExceptionsを取得しており、これらの問題の解決方法はわかりません。 Seleniumのドキュメントでは、オブジェクトはもはやDOMの中になくなっており、オブジェクトを再アタッチする必要があることがわかります。これを行うにはどうすればよいですか?'Selenium StaleElementReferenceExceptionを解決するには、要素がDOMから切断されているようです。 '?

javascriptがコンテンツを動的に更新するページで例外がスローされます。奇妙なことは、テストが成功することがあり、失敗することがあり、決定的な振る舞いをしないことがあるということです。

私はテストのためHTMLUnitDriver(webdriverを)を使用しています。私もChromeDriverを試してみました。Chromeはテストを通して正しく動作しています。しかし、ChromeはJenkins CIビルドでは使用できません。ここで

は、例のトレースです:

org.openqa.selenium.StaleElementReferenceException: The element seems to be disconnected from the DOM. This means that a user cannot interact with it. 
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html 
Build info: version: '2.16.1', revision: '15405', time: '2012-01-05 12:30:12' 
System info: os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.6.0_29' 
Driver info: driver.version: SenderPageDriver 
    at org.openqa.selenium.htmlunit.HtmlUnitWebElement.assertElementNotStale(HtmlUnitWebElement.java:854) 
    at org.openqa.selenium.htmlunit.HtmlUnitWebElement.getTagName(HtmlUnitWebElement.java:360) 
    at org.openqa.selenium.htmlunit.HtmlUnitWebElement.switchFocusToThisIfNeeded(HtmlUnitWebElement.java:316) 
    at org.openqa.selenium.htmlunit.HtmlUnitWebElement.sendKeys(HtmlUnitWebElement.java:345) 
    at ch.postlogistics.avg.common.AbstractPageDriver.fillInTextField(AbstractPageDriver.java:140) 
    at ch.postlogistics.avg.common.SenderPageDriver.senderCompany(SenderPageDriver.java:73) 
    at ch.postlogistics.avg.common.SenderPageDriver.addSender(SenderPageDriver.java:122) 
    at ch.postlogistics.avg.webtest.parcel.ParcelWorkflowTest.goThroughWorkflowWithLabelGenerationWithVinolog(ParcelWorkflowTest.java:38) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:292) 
    at org.junit.runners.Suite.runChild(Suite.java:128) 
    at org.junit.runners.Suite.runChild(Suite.java:24) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:292) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

答えて

1

ページが完全にロードするためにあなたが待っていないため、一部がスローすることができ、あなたのscript.The例外に待って実装してみます。

3

このようなものを試してみてください。このメソッドがnullを返す可能性があることに注意してください。この方法は必要に応じて編集できます。この方法は、たとえばFluentWaitを代わりに使用することで改善できます。

public static WebElement getElementByLocator(By locator) { 
    driver.manage().timeouts().implicitlyWait(9, TimeUnit.SECONDS); 
    WebElement we = null; 
    boolean unfound = true; 
    int tries = 0; 
    while (unfound && tries < 10) { 
    tries += 1; 
    try { 
     we = driver.findElement(locator); 
     unfound = false; // FOUND IT 
    } catch (StaleElementReferenceException ser) {      
     unfound = true; 
    } catch (NoSuchElementException nse) {       
     unfound = true; 
    } catch (Exception e) { 
     System.out.println("Unknown error."); 
    } 
    } 
    driver.manage().timeouts().implicitlyWait(DEFAULT_IMPLICIT_WAIT, TimeUnit.SECONDS); 
    return we; 
} 
関連する問題