Как анализировать веб-страницу один за другим, когда нажимается следующая кнопка с помощью Selenium? - PullRequest
1 голос
/ 19 февраля 2020

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

  driver.get("https://www.scimagojr.com/journalrank.php?country=UA&page=1");

Я получаю все элементы с первой страницы:

  WebElement tableId = driver.findElement(By.tagName("table"));
  List<WebElement> trElements = tableId.findElements(By.xpath("./tbody/tr"));

И, наконец, пытаясь проверить, доступна ли нажатие кнопки «Далее», проанализируйте текущую страницу и другие оставшиеся страницы, если они существуют:

        WebElement nextButton = driver.findElement(By.xpath("//img[contains(@title,'next')]"));

        if(isClickable(nextButton, driver)) {
            for (int id = 1; id <= trElements.size(); id++) {
                for (WebElement element : trElements) {
                    //...
                    id++;
                }
            }
        } else {
            nextButton.click();
        }

Когда я прошел по l oop текущей первой страницы - все в порядке, но мне нужно проверить следующую кнопку, чтобы снова проанализировать другую страницу, если это необходимо.

isClickable() метод выглядит так:

public static boolean isClickable(WebElement el, WebDriver driver) {
    try {
        WebDriverWait wait = new WebDriverWait(driver, 1);
        wait.until(ExpectedConditions.elementToBeClickable(el));
        return true;
    } catch (Exception e) {
        return false;
    }
}

1 Ответ

0 голосов
/ 21 февраля 2020

Решено благодаря предложению Алексея R вроде:

После того, как вы выполните element.click (); ваш DOM перестраивается, поэтому после этого ваши элементы остаются заполненными устаревшими элементами.

        driver.get("https://www.scimagojr.com/journalrank.php?country=UA&page=1");
        List<Journal> journalList = new ArrayList<>();

        //...

        for (int i = 0; i < countOfPages; i++) {
            WebElement tableId = driver.findElement(By.tagName("table"));
            List<WebElement> trElements = tableId.findElements(By.xpath("./tbody/tr"));

            for (int id = 1; id <= trElements.size(); id++) {
                WebElement element = trElements.get(id);
                String title = element.findElement(By.xpath("./td[2]/a")).getText();
                String country = "Ukraine";
                journalList.add(new Journal(id, title, country));

            }
            WebElement element = driver.findElementByXPath("(//div[@class='pagination_buttons']/a)[2]");
            element.click();
        }

Поэтому я помещаю элементы Dynami c, которые можно изменить на странице, внутри l oop, чтобы сделать это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...