Анализирам уеб страница с 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
Таблицата, представляваща интерес, е втората на страницата, но грешката изглежда казва, че не намира никакви таблици при второто преминаване през цикъла. Защо не? Ако въведа ръчно втория символ, той връща интересната таблица.