HtmlUnit, Ajax e Input sem botão de submit

Olá,

Estou fazendo um sistema que precisa alimentar informações no seguinte site:

https://dwq4do82y8xi7.cloudfront.net/bovespa/widgetembed/?symbol=IBOV&interval=1&hidesidetoolbar=0&symboledit=1&toolbarbg=f1f3f6&editablewatchlist=1&details=1&studies=&widgetbarwidth=300&hideideas=1&theme=White&style=3&timezone=exchange&withdateranges=1&studies_overrides=%7B%7D&overrides=%7B%7D&enabled_features=%5B%5D&disabled_features=%5B%5D&locale=pt&utmsource=www.bmfbovespa.com.br&utmmedium=www.bmfbovespa.com.br/pt_br/servicos/market-data/cotacoes/

Para ser mais preciso, estou tentando inserir uma informação na lista de símbolos desse site, utilizando, para isso, o campo input “Adicionar Símbolo”.

<input class="wl-symbol-edit" placeholder="Adicionar Símbolo" maxlength="1000" style="text-transform: none; font-weight: normal;" autocomplete="off" type="text">

Para tanto, escrevi o seguinte código

                BrowserVersion browserVersion = BrowserVersion.INTERNET_EXPLORER_11;
                webClient = new WebClient(browserVersion);
                webClient.getOptions().setCssEnabled(true);
                webClient.getOptions().setJavaScriptEnabled(true);
                HtmlPage page = webClient.getPage(url);
                List<Node> nodesAdicionarSimbolo = (List<Node>) page.getByXPath("//input[@placeholder='Adicionar Símbolo']");
                if (nodesAdicionarSimbolo != null && nodesAdicionarSimbolo.size() > 0) {
                     HtmlTextInput inputAdicionarSimbolo = (HtmlTextInput) nodesAdicionarSimbolo.get(0);                         
                     HtmlElement input = (HtmlElement) inputAdicionarSimbolo;
                     input.focus();
                     input.type("BBAS3\n");
                     System.out.println(page.asXml());
                }

Porém, no print executado, não aparece a estrutura abaixo.

<div class="symbol"><span class="name">BBAS3</span>...

O que estou fazendo de errado?

Por se tratar de um ajax, você terá que criar um mecanismo que espera a requisição ajax terminar.

No seu caso, quando o ajax termina, é criada uma div com o class symbol-edit-popup. Então, após colocar a informação no input, tente criar algum esquema com while que fica procurando um elemento com o tal class, e apenas pegue o conteúdo quando esse elemento for encontrado.

Lucas,

Eu já tentei também adicionar o seguinte comando ao início do código, mas também não funcionou.

 webClient.setSyncAjaxMode(new SyncAjaxController());

Eu tenho que implementar um while que rodorá até as tags div e span serem criadas?

É uma ideia. Veja:

// Coloca o valor no input
input recebe "BRA"

// Procura pelo resultado do ajax
divResultado = procura div com class "symbol-edit-popup"

while(divResultado igual null) // enquanto divResultado for null, ele vai continuar esperando
    pagina.wait(2000);
    divResultado = procura div com class "symbol-edit-popup"
fim while

resultado = divResultado.getAsXML();

Lucas,

Coloquei o seguinte código, mas o sistema entrou em loop infinito.

  List<Node> nodesCotacaoDiaria ; 
  do {
    nodesCotacaoDiaria = (List<Node>) page.getByXPath("//div[@class='symbol']/span[@class='name' and text()='" + papel + "']");
    System.out.println("Waiting...");
  } while (nodesCotacaoDiaria == null || (nodesCotacaoDiaria != null && nodesCotacaoDiaria.size() == 0));

Acho que a classe HtmlPage possui um método wait, tente usar esse método dentro do while.

Lucas,

Alterei o código do loop para o seguinte

List<Node> nodesCotacaoDiaria ;  
do {
   nodesCotacaoDiaria = (List<Node>) page.getByXPath("//div[@class='symbol']/span[@class='name' and text()='" + papel + "']");
   System.out.println("Waiting...");
   page.wait(2000);
} while (nodesCotacaoDiaria == null || (nodesCotacaoDiaria != null && nodesCotacaoDiaria.size() == 0));

Também testei com o método wait sem parâmetro, mas nos dois casos obtive a seguinte mensagem de erro.

 java.lang.IllegalMonitorStateException
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Unknown Source)
	at dmc.bovespa.LeitorCotacaoBovespa2.test(LeitorCotacaoBovespa2.java:66)
	at dmc.bovespa.LeitorCotacaoBovespa2.main(LeitorCotacaoBovespa2.java:200)

Além desses, também testei o código inserindo, antes do comando webClient.getPage(url), o comando webClient.setAjaxController(new SyncAjaxController()), o qual, na teoria, deveria garantir o sincronismo, mas também não funcionou.