ChromeDriver会在包含许多图片的页面上随机挂起20-30分钟

时间:2015-07-16 18:16:54

标签: selenium

我使用ChromeDriver进行自动化网页交互一段时间,但是,我无法解决随机问题。我希望在这个社区中寻求帮助。

  • ChromeDriver:我已经尝试过2.12 - 2.16,所有这些都有这个问题
  • Chrome:版本43.0.2357.134 m
  • 硒:2.44
  • JAVA:1.7.79 X86

症状:当程序运行到最后一页时,它会挂起,有时它会花费20-30分钟让webdriver回来,在这段时间内,WebDriver失控,程序无法对WebDriver做任何事情。在Chrome的状态栏中,有一些词语“等待pda-ads.amazon.com”......

我不知道是否有解决此问题的解决方案。我试过以下方法:

  1. 提交一个可调用的任务,超时10秒,如果它仍然挂起,抛出异常并继续,但是,此时WebDriver仍然挂起,我无法在最后一页获得必要的信息,只能手动输入花药网站地址将使WebDriver恢复正常

  2. 也许是因为第一次加载页面会消耗很长时间,所以我不确定配置文件设置是否可以使用本地缓存会更好

  3. 我甚至想过调用外部自动键盘工具来获取最后一页的信息,但我还没有练习。

  4. 您能否给我一些解决此问题或解决方法的想法或提示?

    PS:我已经设置了这样的超时值:

    driver.manage().timeouts()
    .implicitlyWait(timeOut, TimeUnit.MILLISECONDS)
    .pageLoadTimeout(timeOut * 3, TimeUnit.SECONDS)
    .setScriptTimeout(timeOut * 3, TimeUnit.SECONDS)
    

    implicitlWait超时是10秒,因此页面加载超时和脚本超时都是30秒,我总是设置这些超时值,但仍然不起作用。

3 个答案:

答案 0 :(得分:0)

我认为加载该脚本(pda-ads.amazon.com ...)会使页面无法完成加载。 Selenium有一个页面加载超时设置,根据this answer保留为空,因此它会等待页面加载。我最好的选择是你的情况。我在一个项目中遇到了这个问题,设置pageLoadTimeout就是解决方案。

您可以使用driver.manage().timeouts().pageLoadTimeout(100, TimeUnit.SECONDS)

覆盖该值

Docs for Selenium Timeouts

答案 1 :(得分:0)

我遇到过类似的问题,遗憾的是我还没有找到解决方案。我正在使用Ubuntu 14.04chrome + Xvfb的docker容器。下面是镀铬冻结时的一块码头日志:

09:18:37.902 INFO - Done: [click: 30 [[ChromeDriver: chrome on LINUX (10d5ee0a45a69b5ac2001c3ef83c4f3f)] -> id: ecu-man-9092]]
09:18:38.908 INFO - Executing: [refresh])
09:18:39.584 INFO - Done: [refresh]
09:18:40.594 INFO - Executing: [delete session: 8c2fd722-a7ba-4afc-9838-41130ce6280f])
09:18:41.151 INFO - Done: [delete session: 8c2fd722-a7ba-4afc-9838-41130ce6280f]
09:19:12.060 INFO - Executing: [new session: Capabilities [{platform=ANY, browserName=chrome, version=}]])
09:19:12.061 INFO - Creating a new session for Capabilities [{platform=ANY, browserName=chrome, version=}]
Starting ChromeDriver (v2.9.248304) on port 18887
**[0.506][WARNING]: PAC support disabled because there is no system implementation**

也许它为调试此问题带来了一些有用的东西。

  

Selenium 2.46.0

答案 2 :(得分:0)

我们可以设置pageLoadTimeout,一旦设置它就会通过webdriver会话,并且如果由于超时而抛出异常,那么我们无法恢复相同的会话,因此需要创建新的实例。

        WebDriver driver = new FirefoxDriver();

        //waits 10 seconds for page to load
        driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
        try {
            driver.get("https://yourdomain.com");
        } catch (TimeoutException e) {
            driver.close();
            driver.quit();

            //create new instance of webdriver
            driver = new FirefoxDriver();

            //waits 5 minutes for page to load
            driver.manage().timeouts().pageLoadTimeout(300, TimeUnit.SECONDS);
            driver.get("https://yourdomain.com");
        }