java - 元素退出循环时不再附加到 DOM 命令持续时间或超时 : 21 milliseconds,

标签 java selenium selenium-webdriver

我通过以下代码得到了上述内容:

  1. 打开页面
  2. 检查新月份是否可用
  3. 下载新月份(例如:10 月)
  4. 然后退出循环并应下载 Sep

但是在退出循环后,它会抛出上述错误消息。

这是错误日志:

下载新月份 以 csv 格式下载 10 月数据 线程“main”中的异常 org.openqa.selenium.StaleElementReferenceException:元素不再附加到 DOM 命令持续时间或超时:21 毫秒 有关此错误的文档,请访问:http://seleniumhq.org/exceptions/stale_element_reference.html 构建信息:版本:'2.48.2',修订版:'41bccdd',时间:'2015-10-09 19:59:12' 系统信息:主机:'Treselle',ip:'192.168.0.123',os.name:'Windows 7',os.arch:'amd64',os.version:'6.1',java.version:'1.7.0_60' session ID:ecbdefce-d119-43cc-b239-124d9961bf7e 驱动程序信息:org.openqa.selenium.firefox.FirefoxDriver 功能 [{platform=WINDOWS、acceptSslCerts=true、javascriptEnabled=true、cssSelectorsEnabled=true、databaseEnabled=true、browserName=firefox、handlesAlerts=true、nativeEvents=false、webStorageEnabled=true、rotatable=false、locationContextEnabled=true、applicationCacheEnabled=true、takeScreenshot=true、version=43.0.1}] 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0( native 方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206) 在 org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:647) 在 org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:326) 在 org.openqa.selenium.remote.RemoteWebElement.getText(RemoteWebElement.java:178) 在 stack3.main(stack3.java:43) 导致:org.openqa.selenium.StaleElementReferenceException:元素不再附加到 DOM 有关此错误的文档,请访问:http://seleniumhq.org/exceptions/stale_element_reference.html 构建信息:版本:'2.48.2',修订版:'41bccdd',时间:'2015-10-09 19:59:12' 系统信息:主机:'Treselle',ip:'192.168.0.123',os.name:'Windows 7',os.arch:'amd64',os.version:'6.1',java.version:'1.7.0_60' 驱动程序信息:driver.version:未知 在 .fxdriver.cache.getElementAt(资源://fxdriver/modules/web-element-cache.js:9354) 在.Utils.getElementAt(文件:///C:/Users/Ashik/AppData/Local/Temp/anonymous7980863778031317345webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:8978) 在.WebElement.getElementText(文件:///C:/Users/Ashik/AppData/Local/Temp/anonymous7980863778031317345webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:11965) 在.DelayedCommand.prototype.executeInternal_/h(文件:///C:/Users/Ashik/AppData/Local/Temp/anonymous7980863778031317345webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12534) 在.DelayedCommand.prototype.executeInternal_(文件:///C:/Users/Ashik/AppData/Local/Temp/anonymous7980863778031317345webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12539) 在 .DelayedCommand.prototype.execute/<(file:///C:/Users/Ashik/AppData/Local/Temp/anonymous7980863778031317345webdriver-profile/extensions/fxdriver@googlecode.com/components/command-processor.js:12481)

driver.get("http://www.depreportingservices.state.pa.us/ReportServer/Pages/ReportViewer.aspx?%2fOil_Gas%2fOil_Gas_Well_Historical_Production_Report");
driver.manage().window().maximize();

WebElement select = driver.findElement(By.id("ReportViewerControl_ctl04_ctl03_ddValue"));
List < WebElement > options = select.findElements(By.tagName("option"));

for (WebElement option: options) {
    if (option.getText().equals("Sep 2015 (Unconventional wells)")) {
        System.out.println("old month");
        break;
    } else {
        if (option.getText().contains("Oct")) {
            System.out.println("Download new month");
            WebElement identifier = driver.findElement(By.xpath(".//*
[@id='ReportViewerControl_ctl04_ctl03_ddValue']"));

            Select select1 = new Select(identifier);
            select1.selectByVisibleText("Oct 2015 (Unconventional wells)");

            Wait(20000);
            driver.findElement(By.xpath(".//*[@id='ReportViewerControl_ctl04_ctl00']")).click();

            Wait(20000);
            driver.findElement(By.xpath(".//*[@id='ReportViewerControl_ctl05_ctl04_ctl00_Button']/tbody/tr/td/*")).click();

            Wait(20000);
            driver.findElement(By.xpath(".//*[@id='ReportViewerControl_ctl05_ctl04_ctl00_Menu']/div[2]/a")).click();

            Wait(10000);
            System.out.println("Oct month data downloaded in csv format");
        }

最佳答案

在循环中最后一次调用后再次初始化。

select = driver.findElement(By.id("ReportViewerControl_ctl04_ctl03_ddValue"));
options = select.findElements(By.tagName("option"));

或者你可以在行中进行

options = driver.findElement(By.id("ReportViewerControl_ctl04_ctl03_ddValue")).findElements(By.tagName("option"));

在你的代码中它应该看起来像:

driver.get("http://www.depreportingservices.state.pa.us/ReportServer/Pages/ReportViewer.aspx?%2fOil_Gas%2fOil_Gas_Well_Historical_Production_Report");
driver.manage().window().maximize();

WebElement select = driver.findElement(By.id("ReportViewerControl_ctl04_ctl03_ddValue"));
List < WebElement > options = select.findElements(By.tagName("option"));

for (WebElement option: options) {
    if (option.getText().equals("Sep 2015 (Unconventional wells)")) {
        System.out.println("old month");
        break;
    } else {
        if (option.getText().contains("Oct")) {
            System.out.println("Download new month");
            WebElement identifier = driver.findElement(By.xpath(".//*
[@id='ReportViewerControl_ctl04_ctl03_ddValue']"));

            Select select1 = new Select(identifier);
            select1.selectByVisibleText("Oct 2015 (Unconventional wells)");

            Wait(20000);
            driver.findElement(By.xpath(".//*[@id='ReportViewerControl_ctl04_ctl00']")).click();

            Wait(20000);
            driver.findElement(By.xpath(".//*[@id='ReportViewerControl_ctl05_ctl04_ctl00_Button']/tbody/tr/td/*")).click();

            Wait(20000);
            driver.findElement(By.xpath(".//*[@id='ReportViewerControl_ctl05_ctl04_ctl00_Menu']/div[2]/a")).click();

            Wait(10000);
            System.out.println("Oct month data downloaded in csv format");

            options = driver.findElement(By.id("ReportViewerControl_ctl04_ctl03_ddValue")).findElements(By.tagName("option"));
        }
}

关于java - 元素退出循环时不再附加到 DOM 命令持续时间或超时 : 21 milliseconds,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397542/

相关文章:

javaFX 2.2 - 无法从 Controller 填充表

java - 在dto内传递服务信息

javascript - 如何在 contenteditable div 上模拟打字?

google-chrome - 如何使用 Capybara/Selenium 在 Chrome 上下载多个文件?

java - Selenium : find part of identifier

java - Python 和 Java 接口(interface) - 多线程输入和输出流

java - 限制 Java 进程的总内存消耗(在 Cloud Foundry 中)

python-3.x - 在通过 ChromeDriver 和 Selenium 通过 Python 3 执行测试时如何解决 Chrome 显示 "Aw, Snap!"页面

linux - 在 Linux 上安装 xvfb

python - 使用 Nose/unittest 忽略测试文件