У меня есть следующий код:
MainActivity:
public class MainActivity extends AppCompatActivity {
private final Handler uiHandler = new Handler();
private ArrayList<String> entries = new ArrayList<>();
private class JSHtmlInterface {
@android.webkit.JavascriptInterface
public void showHTML(String html) {
final String htmlContent = html;
uiHandler.post(
new Runnable() {
@Override
public void run() {
Document doc = Jsoup.parse(htmlContent);
Elements elements = doc.select("div.app > div.app__explosion-wrap > div.explosion > div > div.app > div.app__inner > div.app__content > div > div.list");
entries.clear();
}
}
);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
final WebView browser = new WebView(this);
browser.setVisibility(View.INVISIBLE);
browser.setLayerType(View.LAYER_TYPE_NONE,null);
browser.getSettings().setJavaScriptEnabled(true);
browser.getSettings().setBlockNetworkImage(true);
browser.getSettings().setDomStorageEnabled(false);
browser.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
browser.getSettings().setLoadsImagesAutomatically(false);
browser.getSettings().setGeolocationEnabled(false);
browser.getSettings().setSupportZoom(false);
browser.addJavascriptInterface(new JSHtmlInterface(), "JSBridge");
browser.setWebViewClient(
new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
browser.loadUrl("javascript:window.JSBridge.showHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
}
}
);
browser.loadUrl("https://www.myurl/search/123");
if(getSupportActionBar()!=null) getSupportActionBar().setTitle(browser.getUrl());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Проблема в том, что после загрузки страницы все еще изменяются элементы, и от линии doc.select("div.app > div.app__explosion-wrap > div.explosion > div > div.app > div.app__inner > div.app__content > div > div.list")
У меня только все до div.app__content
. Это потому, что после выполнения JavaScript на странице div.app__content
не существует. Вопрос: как ждать полной загрузки? Может быть div.class=loader
с двумя состояниями (готово / запущено) на странице может как-то помочь?
Обновление: Получили результат с помощью следующего кода:
browser.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
String s = consoleMessage.message();
if (consoleMessage.message().equals("inflate finished")) {
// do something
}
return super.onConsoleMessage(consoleMessage);
}
});
Где "inflate finished"
- это консольное сообщение, напечатанное после полного заполнения страницы JS. Тем не менее, это обходной путь, который, вероятно, не является оптимальным. Все еще жду хорошего ответа.