StaleElementReferenceException при переборе встроенных ссылок - PullRequest
0 голосов
/ 29 мая 2018

На моей веб-странице есть список ссылок на разделы, каждый раздел содержит ссылки на детали.Я пытаюсь перейти к каждому разделу, а затем убедиться, что все ссылки не битые.

List<WebElement> sections = driver.findElements(By.xpath("//*[@id='sections']/li/a"));
        System.out.println("sections: " + sections.size());
        sections.forEach(selement -> { 
            selement.click();
            List<WebElement> details = driver.findElements(By.xpath("//*[@id='details']/div/table/tbody/tr/td/table[1]/tbody/tr/td[2]/strong/a"));
            System.out.println("details: " + details.size());
            details.forEach(delement -> {
                url = delement.getAttribute("href");
                try {
                    huc = (HttpURLConnection) new URL(url).openConnection();
                    huc.setRequestMethod("HEAD");
                    huc.connect();
                    respCode = huc.getResponseCode();
                    if(respCode == 404) {
                        System.out.println(url + " link is broken");
                    } else if (respCode == 200) {
                        System.out.println(url + " link is ok");
                    } else {
                        System.out.println(url + " returned code " + respCode);
                    }
                    huc.disconnect();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
            driver.navigate().back();
        });

Проблема в том, что я получаю StaleElementReferenceException после проверки деталей первых разделов.Я предполагаю, что это потому, что после перебора деталей и возврата назад Selenium не рассматривает остальную часть списка секций как текущую?

Я мог бы, вероятно, создать список всех ссылок для секций, а затем перебрать этот списокперейти к ссылке на конкретный раздел, а затем проверить ссылки на детали.Но, может быть, есть другое / более простое решение?

1 Ответ

0 голосов
/ 29 мая 2018

Да, вы правы, вернувшись на главную страницу.элементы списка меняются, и он не будет ссылаться на одни и те же элементы, даже если он один и тот же.Вы не можете использовать для каждого для первой / внешней итерации.Вы можете изменить это следующим образом.Также.элементы списка должны быть повторно идентифицированы / найдены после возврата.

List<WebElement> sections = driver.findElements(By.xpath("//*[@id='sections']/li/a"));
        System.out.println("sections: " + sections.size());
        for(int i=0;i<sections.size();i++){ 
            WebElement selement = sections.get(i);
            selement.click();
            List<WebElement> details = driver.findElements(By.xpath("//*[@id='details']/div/table/tbody/tr/td/table[1]/tbody/tr/td[2]/strong/a"));
            System.out.println("details: " + details.size());
            details.forEach(delement -> {
                url = delement.getAttribute("href");
                try {
                    huc = (HttpURLConnection) new URL(url).openConnection();
                    huc.setRequestMethod("HEAD");
                    huc.connect();
                    respCode = huc.getResponseCode();
                    if(respCode == 404) {
                        System.out.println(url + " link is broken");
                    } else if (respCode == 200) {
                        System.out.println(url + " link is ok");
                    } else {
                        System.out.println(url + " returned code " + respCode);
                    }
                    huc.disconnect();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
            driver.navigate().back();
            sections = driver.findElements(By.xpath("//*[@id='sections']/li/a"));
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...