首页 > 解决方案 > 避免 selenium 陈旧元素引用在 Eclipse 编辑器中显示错误的代码

问题描述

我正在编写以下代码来解决硒中过时的元素引用。但是,在 Eclipse 中,它给了我错误:最终布尔重试(By by)-这一行。此外,首先我想使用公共布尔重试(By by)而不是最终布尔重试(By by),但那是给我来自 Eclipse 编辑器的错误。

package com.TSOne.tcone;

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 CalenderFfdriver {

public static void main(String[] args) {
    System.setProperty("webdriver.chrome.driver", 
   "/Users/owner/desktop/chromedriver");

    WebDriver driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

    driver.get("http://www.path2usa.com/travel-companions");
    driver.findElement(By.cssSelector("#travel_date")).click();


    List<WebElement>dates =driver.findElements(By.cssSelector(".day"));
    System.out.println(dates.size());

     final  boolean retrying (By by) {
        boolean result = false;
        int attempts = 0;
        while(attempts < 2) {
            try {
                driver.findElement(By.xpath("//*[@class='datepicker- 
         switch']")).click();
                result = true;
                break;
            } catch(StaleElementReferenceException e) {
            }
            attempts++;
        }
        return;
    }

 WebElement navigator =driver.findElement(By.cssSelector(" 
 [class='datepicker-days'] th[class='next']"));

    while(!driver.findElement(By.cssSelector("[class='datepicker-days'] 
    th[class='datepicker-switch']")).getText().contains("April")) 

        driver.findElement(By.cssSelector("[class='datepicker-days'] 
    th[class='next']")).click();



    for(int i=0;i<dates.size();i++) {
         String text=dates.get(i).getText();
        if(text.equalsIgnoreCase("23"))

            dates.get(i).click();

    }
}

}

标签: javaselenium-webdriver

解决方案


final boolean retrying (By by)在您的方法之外定义方法main,它应该可以工作。

package ee.sims;

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;

public class CalederFfdriver {

private static WebDriver driver = new ChromeDriver();
public static void main(String[] args) {
    System.setProperty("webdriver.chrome.driver", 
            "/Users/owner/desktop/chromedriver");


    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

    driver.get("http://www.path2usa.com/travel-companions");
    driver.findElement(By.cssSelector("#travel_date")).click();


    List<WebElement>dates =driver.findElements(By.cssSelector(".day"));
    System.out.println(dates.size());



    WebElement navigator =driver.findElement(By.cssSelector("[class='datepicker-days'] th[class='next']"));

    while(!driver.findElement(By.cssSelector("[class='datepicker-days'] th[class='datepicker-switch']")).getText().contains("April")) 

        driver.findElement(By.cssSelector("[class='datepicker-days'] th[class='next']")).click();



    for(int i=0;i<dates.size();i++) {
        String text=dates.get(i).getText();
        if(text.equalsIgnoreCase("23"))

            dates.get(i).click();

    }
}
final  boolean retrying (By by) {
    boolean result = false;
    int attempts = 0;
    while(attempts < 2) {
        try {
            driver.findElement(By.xpath("//*[@class='datepicker-switch']")).click();
            result = true;
            break;
        } catch(StaleElementReferenceException e) {
        }
        attempts++;
    }
    // note that i replaced "return;" here because it was a syntax error
    return result;
}
}

上面的代码没有编译错误。


推荐阅读