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.