首页 > 解决方案 > Selenium:离线时神秘的约 60 秒等待

问题描述

前提条件

代码

...
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);
driver.get("page1_URL");
goOffline();
driver.get("page2_URL");
// dump here all the wait methods of medium.com
goOnline();
driver.get("page3_URL");

预期:Page2(例如基于 JS 的 chrome 的 T-Rex 迷你游戏)从缓存中快速加载。所以所有的阻塞等待方法都很快完成(远少于20秒),我们可以再次上线并加载page3。

实际:Page2(更好的措辞:迷你游戏)计划出于某种原因在浏览器中停留 60 秒。与此同时,Selenium 疯狂地经历了所有的等待,并尝试获取 page3。(Chrome 日志也承认这一点。)最后它在获取 page3 20 秒后超时。

问题:为什么要在这里等待 60 秒?

编辑:我没有设法从我的工作场所分享 chrome 日志。此外,手动运行上述场景,chrome 仍然保持响应(当然),我可以遍历“预期”路径。

标签: javaseleniumgoogle-chromeoffline

解决方案


经过两天的挣扎(以及最近的这个问题),在最后几分钟我的代码才开始工作。然而,这个故事并没有特别的转折,我所做的只是发现 goOnline() 方法不起作用,所以尽管原始的 JSON 是有效的,但我还是重新输入了它。

goOffline()/goOnline() 方法都在调用 DevTools API 的“Network.emulateNetworkConditions”方法,“offline”属性的值为真/假。所以没有什么特别的事情可以重新上线:

private void goOffline() {
    myWebSocket.send("{\"id\":" + counter++
            + ",\"method\":\"Network.emulateNetworkConditions\",\"params\":{\"offline\":true,\"latency\":0,\"downloadThroughput\":-1,\"uploadThroughput\":-1}}");
}

private void goOnline() {
    myWebSocket.send("{\"id\":" + counter++
            + ",\"method\":\"Network.emulateNetworkConditions\",\"params\":{\"offline\":false,\"latency\":0,\"downloadThroughput\":-1,\"uploadThroughput\":-1}}");
}

推荐阅读