Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么阻止HtmlUnit加载PSN存储页面?_Javascript_Java_Web Scraping_Kotlin_Htmlunit - Fatal编程技术网

Javascript 什么阻止HtmlUnit加载PSN存储页面?

Javascript 什么阻止HtmlUnit加载PSN存储页面?,javascript,java,web-scraping,kotlin,htmlunit,Javascript,Java,Web Scraping,Kotlin,Htmlunit,我试图用HtmlUnit加载Playstation商店页面,但看起来它加载的所有内容都是带有“加载…”文本(和一点javascript)的空白页面。 我使用以下配置使HtmlUnit工作,但毫无希望(它的kotlin): 问题是:是什么阻止了HtmlUnit加载页面?我试着自己去想,但我唯一的想法是,这可能是对无头浏览器或HtmlUnit不支持的非常重的JS的某种防御。但例如 可以轻松打开。这称为SPA-。通常,SPA只有基本的标记、一个容器,整个UI是使用诸如或之类的框架动态呈现的 从中剥离

我试图用HtmlUnit加载Playstation商店页面,但看起来它加载的所有内容都是带有“加载…”文本(和一点javascript)的空白页面。 我使用以下配置使HtmlUnit工作,但毫无希望(它的kotlin):

问题是:是什么阻止了HtmlUnit加载页面?我试着自己去想,但我唯一的想法是,这可能是对无头浏览器或HtmlUnit不支持的非常重的JS的某种防御。但例如

可以轻松打开。

这称为SPA-。通常,SPA只有基本的标记、一个容器,整个UI是使用诸如或之类的框架动态呈现的

从中剥离脚本和样式后,剩下的是:

<div id="waitAppLoading">
  <div class="waitHorizon">
    <div class="centerBox">
      <div class="logoCtnr"></div>
      <div class="textBox"><div class="spinCtnr"></div><div id="appLoadingMsg"></div></div>
      <div class="startupErr"></div>
    </div>
  </div>
</div>
<div id="appRoot" class="hidden"></div>
<div id="lockdownScreen"></div>
<div id="global-wait">
  <div class="waitHorizon">
    <div class="waitContainer">
      <div class="sq1"></div>
      <div class="sq2"></div>
      <div class="sq3"></div>
      <div class="sq4"></div>
      <div class="sq5"></div>
      <div class="sq6"></div>
    </div>
  </div>
  <div id="global-ps-loader">
  </div>
</div>
<div id="notifierCtnr" class="mainCol"><div id="notifier-box"></div></div>
<div id="storeNotAvail"></div>
<div class="dimToolEl dimToolElProdTitle"></div>
<div class="dimToolEl dimToolElProdSubTitle"></div>
<div id="transact-iframe-container">
  <iframe id="transact-iframe"></iframe>
</div>


如您所见,这里没有内容,只有应用程序的线框。web客户端不完全模拟浏览器,也不执行该脚本。这就是为什么您会看到一个空页面。

至少这个java代码在这里工作。我得到了语言选择对话框,就像真实的FF一样。 我正在使用最新的HtmlUnit代码。总的来说,这是个好主意

    String url = "https://store.playstation.com/";

    try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52)) {
        final HtmlPage page = webClient.getPage(url);
        webClient.waitForBackgroundJavaScript(1000 * 10);

        System.out.println("----------------");
        System.out.println(page.asText());
        System.out.println("----------------");

        HtmlElement btn = page.querySelector(".btn");
        System.out.println(btn.asXml());
        System.out.println("----------------");
    }
请取消通话

    waitForBackgroundJavaScript(10000)
    waitForBackgroundJavaScriptStartingBefore(10000)

从您的设置代码。这些方法没有设置任何选项;他们在执行时等待

哦!!因此,应该调用这些方法,而不是Thread.sleep()。然后,可能这将有助于克服“加载”屏幕。我会试试的,谢谢你,我知道这是水疗。但是HtmlUnit可以处理JS请求,而且它实际上可以在一些SPA上工作。看起来我用了错误的方式等待JS执行
    String url = "https://store.playstation.com/";

    try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52)) {
        final HtmlPage page = webClient.getPage(url);
        webClient.waitForBackgroundJavaScript(1000 * 10);

        System.out.println("----------------");
        System.out.println(page.asText());
        System.out.println("----------------");

        HtmlElement btn = page.querySelector(".btn");
        System.out.println(btn.asXml());
        System.out.println("----------------");
    }
    waitForBackgroundJavaScript(10000)
    waitForBackgroundJavaScriptStartingBefore(10000)