当前位置: 首页 > 知识库问答 >
问题:

如何修复陈旧的元素引用异常,同时尝试从日期选择器中选择日期?

董嘉祯
2023-03-14

我正在尝试从日期选择器中选择日期。以下是代码

WebDriver d=new FirefoxDriver();
Actions a=new Actions(d);
String date="14";
d.get("http://www.eyecon.ro/bootstrap-datepicker/");
d.findElement(By.cssSelector("div#dp3>span")).click();
List<WebElement> trs=d.findElements(By.cssSelector("div.datepicker-days>table>tbody>tr"));
       for(WebElement tr:trs) {
            List<WebElement> tds=tr.findElements(By.tagName("td"));
            for(WebElement td:tds) {
                if(date.equals(td.getText())) {
                    a.moveToElement(td).click().build().perform();

                }
            }

}

使用上面的代码,我在这行代码中得到了陈旧的元素引用异常

"if(date.equals(td.getText())) {"

所以我把代码改成了这个

for(WebElement td:tds) {
                while(i<4) {
                    try {
                        if(date.equals(td.getText())) {
                            a.moveToElement(td).click().build().perform();

                        }
                        break;
                    }catch(Exception ex) {

                    }
                    System.out.println(i);
                    i++;
                }
            }

现在我可以选择日期了。但脚本仍在抛出陈旧的元素引用异常。脚本现在在此行显示错误

List<WebElement> tds=tr.findElements(By.tagName("td"));

我在过去的三天里一直在做这个。关于如何解决这个问题的任何建议。提前感谢

共有3个答案

吴单鹗
2023-03-14

找到了一种更简单的方法来解决我的陈旧元素引用异常

在使用Selenium2的Java中,请尝试以下代码:

 public WebElement cleanAndRebuildElement(final WebElement ee) {
        WebElement e2;
        try {
            e2=ee;
            e2.isDisplayed();
            logger.info("Element is cleaned : Not Stale Anymore !");
        } catch (StaleElementReferenceException e) {
              e2=null;

          
        } catch(NoSuchElementException nse) {
nse.printstacktrace(); 
          }
        return e2;
    }
}
卢俊发
2023-03-14

您应该使用WebDriver等待期待条件来解决元素的陈旧问题。下面是我测试过的代码的修改块,它是有效的。

 driver.findElement(By.cssSelector("div#dp3>span")).click();
 WebDriverWait wait = new WebDriverWait(driver, 30);
 List<WebElement> trs = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector("div.datepicker-days>table>tbody>tr")));
 datePicker:
 {
    for (WebElement tr : trs) {
       List<WebElement> tds = tr.findElements(By.tagName("td"));
       for (WebElement td : tds) {
                 wait.until(ExpectedConditions.not(ExpectedConditions.stalenessOf(td)));
                 if (date.equals(td.getText())) {
                        td.click();
                        break datePicker;
                 }
        }
     }
 }

有关更多信息,请查看此处的WebDriverWait和ExpectedConditions

虞博涛
2023-03-14

在您的第一个代码中,单击元素后,DOM发生了更改,因为日期变为“14”,并且由于for循环仍在迭代,因此它引发了StaleElementReferenceException。

类似地,在第二段代码中,您确实打破了迭代td元素的“内部for循环”,但没有打破继续迭代tr元素的“外部”循环,因此它再次抛出了StaleElementReferenceException。

解决方案:-您应该在单击元素后使用中断从两个for循环中出来,从而在该过程中避免StaleElementReduce ceException。

下面的代码显示了您如何毫无例外地跳出两个for循环:

    WebDriver d=new FirefoxDriver();
    d.manage().window().maximize(); //Maximizing window
    d.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); //Implicit wait for 20 seconds

    Actions a=new Actions(d);
    String date="14";
    int flag=0;

    d.get("http://www.eyecon.ro/bootstrap-datepicker/");
    d.findElement(By.cssSelector("div#dp3>span")).click();
    List<WebElement> trs=d.findElements(By.cssSelector("div.datepicker-days>table>tbody>tr"));
    for(WebElement tr:trs) {
        List<WebElement> tds=tr.findElements(By.tagName("td"));
        for(WebElement td:tds) {
            if(date.equals(td.getText())) {
                a.moveToElement(td).click().build().perform();
                flag=1; // Set to 1 when the required element was found and clicked.
                break; //To come out of the first for-loop
            }
        }
        if(flag==1)
            break; //Since the element was found, come out of the second for-loop.
    }

注意:-我添加了最大化窗口和提供隐式等待的代码,这实际上是在您编写selenium脚本时建议的。

 类似资料:
  • 我已经记录了用于从日期选择器中选择日期的selenium代码。在运行测试用例时,日期选择器会弹出并正确突出显示所选日期。但是没有选择日期。代码如下所示:- 此异常仅出现在记录的代码中。我使用的是selenium-server-standalone-2 . 45 . 0 jar。

  • HTML与它的外观截图一起粘贴,如下所示。 HTML: 我曾经试过 甚至试图等待命令以使定位器被找到但没有成功。 WebDriverWait(驱动程序,100)。直到(预期条件.element可禁用)(By.css选择器 两者都不起作用,因为它无法识别元素。有人能帮我吗。如果可能,我们甚至可以单击“上一个”和“下一个”,以便我们也可以单击一些以前的日期吗?

  • 问题内容: 我有一个类型为“ datetime”的列,其值类似于2009-10-20 10:00:00 我想从datetime提取日期并编写类似的查询: 以下是最好的方法吗? 但是,这将返回一个空的结果集。有什么建议么? 问题答案: 您可以使用MySQL的功能: 您也可以尝试以下方法: 有关使用的性能影响的信息,请参见此答案。

  • 我无法从日历中选择数据,因为它没有可选择的id。 下面是我的HTML代码, 我试过的代码是 但无法选择日期 申请的网址: http://demo.guru99.com/V4/ 用户名: mgr123密码: mgr!23 单击左侧窗格中的新帐户,选择上面讨论的所需页面。 有人能帮忙选择日期吗?

  • 我正在尝试实现这里介绍的日期时间选择器https://eonasdan.github.io/bootstrap-datetimepicker/#minimum-安装程序,我已将文件文件下载到目录和。但当点击图标时,日历不会弹出。

  • 我试图在Android中创建一个日期对象,从日期选择器和时间选择器。我知道如何单独进行,但当我想使用日期选择器和时间选择器创建单个日期对象时 我试过这个 但是没有运气,因为它已被弃用。有人能给我指出一个资源吗?