【问题标题】:The following Selenium Code is throwing StaleElementRefernceExecption. How can I fix it? [duplicate]以下 Selenium 代码正在抛出 StaleElementReferenceExecption。我该如何解决? [复制]
【发布时间】:2019-03-21 18:01:48
【问题描述】:

我正在尝试使用 Selenium WebDriver Java 自动化日历。当涉及到识别日期并单击日期时,它会抛出一个 StaleElementRefernceException。请查看下面的代码并帮助我修复它。

package com.initial.selenium;

import java.util.List;
import java.util.concurrent.TimeUnit;

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.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class Calender2 {

    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\Shahid\\eclipseworkspace\\InitialSeleniumProject\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("http://www.path2usa.com/travel-companions");
        driver.findElement(By.xpath("//*[@id='travel_from']")).sendKeys("Chicago");
        driver.findElement(By.xpath("//*[@id='Rockford']")).click();
        driver.findElement(By.xpath("//*[@id='travel_to']")).sendKeys("Dallas");
        driver.findElement(By.xpath("//*[@id='Dallas-Fort Worth']")).click();
        driver.findElement(By.xpath("//*[@id='travel_date']")).click();

        WebElement DateMonth=driver.findElement(By.xpath("//div[@class='datepicker- days']/table/thead/tr/th[2]"));
        WebElement datechanger=driver.findElement(By.xpath("//div[@class='datepicker- days']/table/thead/tr/th[3]"));
        List<WebElement> dates=driver.findElements(By.tagName("td"));
        while(!DateMonth.getText().contains("April")) {
            datechanger.click();
            for(int i=0;i<dates.size();i++) {
                if(dates.get(i).getText().equalsIgnoreCase("23")) {
                    dates.get(i).click();  
                    break;
                }   
            }
        }
    }

}

【问题讨论】:

  • 请检查您的问题,因为存在一些格式/错字问题。您能否也分享完整的错误文本,这可能表明StaleElementReferenceException 被抛出的位置?
  • 在编写自动化测试时,通常不需要模拟通过下拉菜单在日期选择器中选择日期,除非您正在测试日期选择器本身。在绝大多数情况下,将日期选择器本身标识为 web 元素并对其执行日期的 sendKeys 就足够了。大部分自动化脚本都是为了测试一个流程,一系列步骤,不一定是一对一的点击对话框之类的东西,可以避免。
  • 您用于更改月份的 xpath 不正确,我已更新我的答案并为其添加了 xpath。你可以检查一下,如果有帮助,请告诉我。

标签: java selenium


【解决方案1】:

当您尝试操作的元素不再存在于 html 中或已变得陈旧时,就会出现 StaleElementReferenceException。因此,要更正它,您必须再次获取元素。

在您的情况下,您可以通过在 while 循环中进行以下更改来纠正它:

List<WebElement> dates=driver.findElements(By.tagName("td"));
while (!DateMonth.getText().contains("April")) {
    datechanger.click();
    dates=driver.findElements(By.tagName("td"));
    for (int i = 0; i < dates.size(); i++) {
        if (dates.get(i).getText().equalsIgnoreCase("23")) {
            dates.get(i).click();
            break;
        }
    }
}

另外,您用来更改月份的 xpath 是不正确的,因此请使用下面给出的 xpath 而不是您正在使用的那个:

WebElement datechanger=driver.findElement(By.xpath("(//th[@class='prev'])[1]"));

【讨论】:

    猜你喜欢
    • 2012-08-31
    • 2020-06-26
    • 1970-01-01
    • 2018-01-18
    • 2012-04-20
    • 2021-12-28
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    相关资源
    最近更新 更多