使用 Selenium 导航时的陈旧对象引用

2024-05-22

我一直在尝试一个简单的程序,它可以从新页面导航和获取数据,返回历史记录并打开其他页面并获取数据等等,直到访问所有链接并获取数据。

在以下网站上获得结果后,我尝试循环浏览第一列中获得的所有链接,并逐个打开这些链接并从每个页面中提取文本。但下面的程序仅访问第一个链接并给出 StaleElementReferenceException,我尝试使用Actions但它不起作用,我不知道JavascriptExecutor。我还尝试了其他 SO 问题上发布的解决方案,其中之一是我的here https://stackoverflow.com/questions/45331708/staleelementexceptionselenium-how-do-i-handle-this。我希望纠正下面的代码和工作代码中的错误。

public class Selenium {

    private final static String CHROME_DRIVER = "C:\\Selenium\\chromedriver\\chromedriver.exe";
    private static WebDriver driver = null;
    private static WebDriverWait wait = null;

    private void setConnection() {
        try {
            System.setProperty("webdriver.chrome.driver", CHROME_DRIVER);
            driver = ChromeDriver.class.newInstance();
            wait = new WebDriverWait(driver, 5);
            driver.get("https://sanctionssearch.ofac.treas.gov");
            this.search();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void search() {
        try {
            driver.findElement(By.id("ctl00_MainContent_txtLastName")).sendKeys("Dawood");
            driver.findElement(By.id("ctl00_MainContent_btnSearch")).click();
            this.extractText();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void extractText() {
        try {
            List<WebElement> rows = driver.findElements(By.xpath("//*[@id='gvSearchResults']/tbody/tr"));
            List<WebElement> links = null;
            for (int i = 1; i <= rows.size(); i++) {

                links = driver.findElements(By.xpath("//*[@id='gvSearchResults']/tbody/tr/td[1]/a"));

                for (int j = 0; j < links.size(); j++) {
                    System.out.println(links.get(j).getText() + ", ");
                    links.get(j).click();
                    System.out.println("Afte click");
                    driver.findElement(By.id("ctl00_MainContent_btnBack")).click();
                    this.search();
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] ar) {
        Selenium object = new Selenium();
        object.setConnection();
    }

}

一般来说,如果在启动 web 元素后元素属性或某些内容发生更改,我们将收到 Stale Exception。例如,在某些情况下,如果用户尝试单击同一页面上的同一元素,但在页面刷新后,则会出现 staleelement 异常。

为了克服这个问题,我们可以创建新的 web 元素,以防页面更改或刷新。下面的代码可以给你一些想法。

Example:

 webElement element = driver.findElement(by.xpath("//*[@id='StackOverflow']"));
 element.click();
 //page is refreshed
 element.click();//This will obviously throw stale exception

为了克服这个问题,我们可以将 xpath 存储在某个字符串中,并使用它创建一个新的 web 元素。

String xpath = "//*[@id='StackOverflow']";
driver.findElement(by.xpath(xpath)).click();
//page has been refreshed. Now create a new element and work on it
driver.fineElement(by.xpath(xpath)).click();   //This works

在本例中,我们收集一组网络元素并迭代以获取文本。但在收集 webelement 后,webelement 似乎发生了一些变化,并且 gettext 抛出了陈旧性。我们可以使用循环并动态创建元素并获取文本。

for(int i = 0; i<5; i++)
{
  String value = driver.findElement(by.xpath("//.....["+i+"]")).getText);
  System.out.println(value);
}

希望这对您有帮助。谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Selenium 导航时的陈旧对象引用 的相关文章

随机推荐