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