【问题标题】:stale element reference: element is not attached to the page document selenium webdriver in chrome browser过时的元素参考:元素未附加到 chrome 浏览器中的页面文档 selenium webdriver
【发布时间】:2017-10-07 16:30:24
【问题描述】:

当我执行以下 selenium 程序(从 datepicker 中选择预期日期)时,我正在学习 selenium,我得到过时的元素引用:元素未附加到页面文档。我已经通过了一些在线解决方案,但它不能同时工作。我认为在执行我的程序时它没有在 DOM 中找到元素。请指导我解决方案。提前致谢。

import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;

public class skyscanner_datepicker 
{
@Test
public void calender_func() throws InterruptedException
{           
    String expected_date = "January 2018";
    String expected_day = "15";
    System.setProperty("webdriver.chrome.driver", "D://rakesh//software//selenium browser//chrome 2.30//chromedriver.exe");
    WebDriver driver = new ChromeDriver();

    driver.get("https://www.skyscanner.co.in/");
    driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    driver.manage().window().maximize();
    driver.findElement(By.id("js-depart-input")).click();
    Thread.sleep(3000);     
    if(driver.findElement(By.xpath("//div[@class='popover skyscanner-datepicker depart']//span[@class='current']")).getText().equals(expected_date))
    {
        System.out.println("Date selected in if condition");
    }
    else
    {
        for(int i=1;i<=12;i++)
        {                       
        try 
        {
                driver.findElement(By.xpath("//div[@class='popover skyscanner-datepicker depart']//div[@class='calendar-info-bar datepicker_clearfix']//button[2]")).click();               
                if(driver.findElement(By.xpath("//div[@class='popover skyscanner-datepicker depart']//span[@class='current']")).getText().equals(expected_date))
                break;
                System.out.println("date get selected");                    
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }   
        }           
    }

    List<WebElement> day_list = driver.findElements(By.xpath("//div[@class='container-body']//tbody//tr//td"));
    for(WebElement a : day_list)
    {
        if(a.getText().equalsIgnoreCase(expected_day))
        {
            a.click();
        }
    }       
    driver.quit();
}

}

【问题讨论】:

  • 你在哪一行看到stale element reference: element is not attached to the page document

标签: google-chrome selenium webdriver


【解决方案1】:

我猜在这个循环中:

for(int i=1;i<=12;i++)
{                       
try 
{
        driver.findElement(By.xpath("//div[@class='popover skyscanner-datepicker depart']//div[@class='calendar-info-bar datepicker_clearfix']//button[2]")).click();               
        if(driver.findElement(By.xpath("//div[@class='popover skyscanner-datepicker depart']//span[@class='current']")).getText().equals(expected_date))
        break;
        System.out.println("date get selected");                    
} 
catch (Exception e) 
{
    e.printStackTrace();
}   
} 

您正在尝试等待相同的日期值出现在元素中。

它几乎从来没有奏效!改用显式等待。


让自己熟悉:

并使用这个 sn-p 代替上面的循环:

// wait up to 30 seconds
WebDriver wait = new WebDriverWait( driver, 30 );
final By element = By.xpath("//div[@class='popover skyscanner-datepicker depart']//span[@class='current']");
wait.until(ExpectedConditions.textToBePresentInElementLocated( element, expected_date ));

这将等待 30 秒让日期出现在元素中,如果该值在 30 秒内不可见,则会抛出超时异常。


此代码检索所有元素,然后在循环中仅查找一个元素,然后尝试单击它:

List<WebElement> day_list = driver.findElements(By.xpath("//div[@class='container-body']//tbody//tr//td"));
for(WebElement a : day_list)
{
    if(a.getText().equalsIgnoreCase(expected_day))
    {
        a.click();
    }
}  

但是为什么不让这个具体元素变得可见和可点击呢?
使用这个:

final String elementXpath = String.format(
    "//div[@class='container-body']//tbody//tr//td[ contains( ., '%s' ) ]",
    expected_day ); 

final By elementToClick = By.xpath( elementXpath );

// wait until element appears and becomes clickable, then click it
wait.until(ExpectedConditions.elementToBeClickable( elementToClick )).click();

【讨论】:

    【解决方案2】:

    当 webdriver 在页面仍在加载时尝试访问元素时,可能会导致 StaleElementReference 异常。初始化 webdriver 后尝试添加页面加载超时。

    driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
    

    这将告诉 webdriver 在移动到下一页操作之前等待最多 5 秒以加载页面。

    此外,秒数取决于完全加载应用程序网页的时间

    【讨论】:

    • 这段代码没有解决我的问题。即使增加秒数,我也会遇到同样的错误
    • 然后,请分享您在哪一行代码中遇到错误。您可以在 IDE 的控制台窗口中看到它。
    猜你喜欢
    • 2019-04-27
    • 2016-10-13
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多