HtmlUnit получает таблицу в цикле, но не во второй раз

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

Синтаксический анализатор работает нормально в первый раз через цикл, но не во второй. Вот код:

public void getPortfolioVisualizerData(List<String>symbols) throws Exception {
        final WebClient webClient = new WebClient();
        final HtmlPage page = webClient.getPage("https://www.portfoliovisualizer.com/backtest-portfolio#analysisResults");
        HtmlForm form = page.getFirstByXPath("//form[@action='backtest-portfolio#analysisResults']");

        //Time Period combobox
        HtmlSelect select = (HtmlSelect) page.getElementById("timePeriod");
        HtmlOption option = select.getOptionByValue("4");   
        select.setSelectedAttribute(option, true);

        //Start Year combobox
        select = (HtmlSelect) page.getElementById("startYear");
        option = select.getOptionByValue("1985");  
        select.setSelectedAttribute(option, true);

        //End Year combobox
        select = (HtmlSelect) page.getElementById("endYear");
        option = select.getOptionByValue("2018");  
        select.setSelectedAttribute(option, true);

        //Initial Amount text input
        HtmlTextInput textField = form.getInputByName("initialAmount");
        textField.type("10000");

        //Periodic Adjustment combobox
        select = (HtmlSelect) page.getElementById("annualOperation");
        option = select.getOptionByValue("0");  
        select.setSelectedAttribute(option, true);

        //Rebalancing combobox
        select = (HtmlSelect) page.getElementById("rebalanceType");
        option = select.getOptionByValue("1");  
        select.setSelectedAttribute(option, true);

        //Display Income combobox
        select = (HtmlSelect) page.getElementById("showYield");
        option = select.getOptionByValue("false");  
        select.setSelectedAttribute(option, true);

        //Benchmark combobox
        select = (HtmlSelect) page.getElementById("benchmark");
        option = select.getOptionByValue("VFINX");  
        select.setSelectedAttribute(option, true);

        //Allocation 1 text input
        textField = form.getInputByName("allocation1_1");
        textField.type("100");
        HtmlSubmitInput button = (HtmlSubmitInput)page.getElementById("submitButton");
        Data data = new Data();

        for (String symbol:symbols) {
            //Asset 1 text input
            textField = form.getInputByName("symbol1");
            textField.type(symbol);

            // Now submit the form by clicking the Analyze Portfolios button and get back the second page.
            HtmlPage page2 = button.click();
            HtmlTable table = (HtmlTable) page2.getByXPath("//table[@class='table table-striped table-condensed']").get(1);   //the second table on the page
            int rowNum = 0;
            for (HtmlTableRow row : table.getRows()) {
                rowNum++;
                if (rowNum==1) continue;    //skip table header values
                int colNum = 0;
                for (HtmlTableCell cell : row.getCells()) {
                    colNum++;
                    if (rowNum==2) {
                        data.Symbol = symbol;
                        String val = cell.asText();
                        switch(colNum) {
                            case 4:  data.CAGR               = val.replace("%", ""); break;
                            case 5:  data.StdDev             = val.replace("%", ""); break;
                            case 6:  data.BestYear           = val.replace("%", ""); break;
                            case 7:  data.WorstYear          = val.replace("%", ""); break;
                            case 8:  data.MaxDrawdown        = val.replace("%", ""); break;
                            case 9:  data.SharpRatio         = val;                  break;
                            case 10: data.SortinoRatio       = val;                  break;
                            case 11: data.CorrelationToUsMkt = val;
                        }
                    }

            }
            saveStock(data);
            button = (HtmlSubmitInput)page2.getElementById("submitButton");
            form = page2.getFirstByXPath("//form[@action='backtest-portfolio#analysisResults']");
       }
    }

Это дает мне java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 в этой строке:

HtmlTable table = (HtmlTable) page2.getByXPath("//table[@class='table table-striped table-condensed']").get(1);   //the second table on the page

Интересующая таблица является второй на странице, но ошибка, кажется, говорит о том, что она не находит никаких таблиц во втором проходе цикла. Почему бы нет? Если я ввожу второй символ вручную, он возвращает интересующую таблицу.


person user3217883    schedule 19.08.2018    source источник


Ответы (1)


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

person Harshal Khachane    schedule 19.08.2018